Domanda

Come posso impostare un'attività Ant da generare Emma rapporti sulla copertura del codice?

È stato utile?

Soluzione

Per rispondere a domande su dove si trovano le directory sorgente e strumentate (queste possono essere cambiate in qualunque sia la struttura di directory standard):

<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" />

Percorsi di classe:

<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>

Per prima cosa devi impostare dove Ant può trovare le librerie Emma:

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

Quindi importa l'attività:

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

Quindi strumentare il codice:

<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>

Quindi esegui un target con gli argomenti VM corretti come:

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

Infine genera il tuo report:

<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>

Altri suggerimenti

IL La Guida per l'utente contiene un buon esempio di come impostare lo script di compilazione in modo che non solo separi il codice strumentato dall'esecuzione, ma sia anche tutto contenuto nello stesso <target> in modo da non dover eseguire una serie di obiettivi diversi, ma invece puoi semplicemente fare qualcosa del genere ant emma tests (Se ant tests era il modo in cui normalmente eseguivi i test unitari, ad esempio).

Ecco il loro esempio:

<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 introduce un altro modo per ottenere informazioni sulla copertura del runtime (file .ec).È possibile richiedere in remoto i dati dalla porta specifica del computer su cui è in esecuzione un'applicazione strumentata.Quindi non è necessario arrestare VM.

Per ottenere il file con i dati di copertura runtime è necessario inserire il seguente snippet nello script Ant tra l'esecuzione dei test e la generazione del report di copertura:

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

Gli altri passaggi sono simili a Emma 2.0.Sono perfettamente descritti in messaggio precedente

Maggiori informazioni sulle funzionalità di Emma 2.1: http://sourceforge.net/project/shownotes.php?group_id=108932&release_id=336859

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top