Pergunta

Como faço para configurar uma tarefa Ant para gerar Emma cobertura de código relatórios?

Foi útil?

Solução

Para responder a perguntas sobre a origem e instrumentado diretórios são (estes podem ser mudada para qualquer que seja o seu padrão de estrutura de diretório é):

<property file="build.properties" />
<property name="source" location="src/main/java" />
<property name="test.source" location="src/test/java" />
<property name="target.dir" location="target" />
<property name="target" location="${target.dir}/classes" />
<property name="test.target" location="${target.dir}/test-classes" />
<property name="instr.target" location="${target.dir}/instr-classes" />

Classpaths:

<path id="compile.classpath">
  <fileset dir="lib/main">
    <include name="*.jar" />
  </fileset>
</path>

<path id="test.compile.classpath">
  <path refid="compile.classpath" />
  <pathelement location="lib/test/junit-4.6.jar" />
  <pathelement location="${target}" />
</path>

<path id="junit.classpath">
  <path refid="test.compile.classpath" />
  <pathelement location="${test.target}" />
</path>

Primeiro você precisa de instalação onde a Formiga pode encontrar a Emma bibliotecas:

<path id="emma.lib" >
    <pathelement location="${emma.dir}/emma.jar" />
    <pathelement location="${emma.dir}/emma_ant.jar" />
</path>

Em seguida, importar a tarefa:

<taskdef resource="emma_ant.properties" classpathref="emma.lib" />

Em seguida, aparelho o código:

<target name="coverage.instrumentation">
    <mkdir dir="${instr.target}"/>
    <mkdir dir="${coverage}"/>
    <emma>
        <instr instrpath="${target}" destdir="${instr.target}" metadatafile="${coverage}/metadata.emma" mode="copy">
            <filter excludes="*Test*"/>
        </instr>
    </emma>
    <!-- Update the that will run the instrumented code -->
    <path id="test.classpath">
        <pathelement location="${instr.target}"/>
        <path refid="junit.classpath"/>
        <pathelement location="${emma.dir}/emma.jar"/>
    </path>
</target>

Em seguida, execute um alvo com a devida VM argumentos como:

<jvmarg value="-Demma.coverage.out.file=${coverage}/coverage.emma" />
<jvmarg value="-Demma.coverage.out.merge=true" />

Finalmente, gerar o relatório:

<target name="coverage.report" depends="coverage.instrumentation">
    <emma>
        <report sourcepath="${source}" depth="method">
            <fileset dir="${coverage}" >
                <include name="*.emma" />
            </fileset>
            <html outfile="${coverage}/coverage.html" />
        </report>
    </emma>
</target>

Outras dicas

O Guia do usuário tem um bom exemplo de como configurar o script de compilação para que você não só separar o código instrumentado da execução, mas também todos os contidos no mesmo <target> para que você não precise executar uma série de destinos diferentes, mas em vez disso, você só pode fazer algo como ant emma tests (se ant tests foi como você normalmente executou os testes de unidade, por exemplo).

Aqui está o exemplo:

<target name="emma" description="turns on EMMA instrumentation/reporting" >
    <property name="emma.enabled" value="true" />
    <!-- EMMA instr class output directory: -->
    <property name="out.instr.dir" value="${basedir}/outinstr" />
    <mkdir dir="${out.instr.dir}" />
</target>

<target name="run" depends="init, compile" description="runs the examples" >
    <emma enabled="${emma.enabled}" >
      <instr instrpathref="run.classpath"
             destdir="${out.instr.dir}" 
             metadatafile="${coverage.dir}/metadata.emma"
             merge="true"
      />
    </emma>

    <!-- note from matt b: you could just as easily have a <junit> task here! -->
    <java classname="Main" fork="true" >
      <classpath>
       <pathelement location="${out.instr.dir}" />
        <path refid="run.classpath" />
        <path refid="emma.lib" />
      </classpath> 
      <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/coverage.emma" />
      <jvmarg value="-Demma.coverage.out.merge=true" />
    </java>

    <emma enabled="${emma.enabled}" >
      <report sourcepath="${src.dir}" >
        <fileset dir="${coverage.dir}" >
          <include name="*.emma" />
        </fileset>

        <txt outfile="${coverage.dir}/coverage.txt" />
        <html outfile="${coverage.dir}/coverage.html" />
      </report>
    </emma>
</target>

Emma 2.1 apresenta outra forma de obtenção de tempo de execução de cobertura de informações (.ce arquivo).Pode-se remotamente a solicitação de dados a partir do dado da porta do computador onde uma aplicação instrumentada é runnig.Portanto, não há necessidade de parar de VM.

Para obter o arquivo com o tempo, dados de cobertura que você precisa para inserir o seguinte trecho no seu script Ant entre a execução dos testes e a geração de relatório de cobertura:

<emma>
    <ctl connect="${emma.rt.host}:${emma.rt.port}" >
        <command name="coverage.get" args="${emma.ec.file}" />
        <command name="coverage.reset" />
    </ctl>
</emma>

Outros passos são semelhantes para Emma 2.0.Eles estão perfeitamente descritas na post anterior

Mais informações sobre Emma 2.1 características: http://sourceforge.net/project/shownotes.php?group_id=108932&release_id=336859

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top