2014-04-29 8 views
9

Ich versuche, jacoco in unseren Ameisenbau zu integrieren und evaluiere es mit einem einfachen Testprojekt.Jacoco - Zero Percent Coverage

Die Compilation und die andere Ausgabe sieht vielversprechend aus, aber wenn ich auf die Abdeckung schaue, ist es immer Null.

package alg; 

public class SpecialAlgorithm { 
    public SpecialAlgorithm() {} 

    public int uncoveredMethod(int i) { 
     return i * i; 
    } 

    public int sum(int i, int j) { 
     return i + j; 
    } 
} 

Testfall:

package alg; 

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
import alg.SpecialAlgorithm; 

public class SpecialAlgorithmTest { 
    @Test 
    public void testSum() { 
     SpecialAlgorithm alg = new SpecialAlgorithm(); 
     int sum = alg.sum(1, 2); 
     assertEquals(3, sum); 
    } 
} 

Ant-Skript:

<project xmlns:jacoco="antlib:org.jacoco.ant" name="Code Coverage with JaCoCo" 
    default="rebuild"> 
    <property name="src.dir" location="../java" /> 
    <property name="test.dir" location="../../test/java" /> 
    <property name="result.dir" location="c:/temp/jacoco/target" /> 
    <property name="result.classes.dir" location="${result.dir}/classes" /> 
    <property name="result.report.dir" location="${result.dir}/site/jacoco" /> 
    <property name="result.exec.file" location="${result.dir}/jacoco.exec" /> 
    <!-- Step 1: Import JaCoCo Ant tasks --> 
    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> 
     <classpath path="../../../lib/jacocoant.jar" /> 
    </taskdef> 
    <target name="clean"> 
     <delete dir="${result.dir}" /> 
     <mkdir dir="${result.dir}" /> 
     <mkdir dir="${result.dir}/site/jacoco/" /> 
    </target> 
    <target name="compile" depends="clean"> 
     <mkdir dir="${result.classes.dir}" /> 
     <javac srcdir="${src.dir}" destdir="${result.classes.dir}" 
      debug="true" includeantruntime="false"> 
      <classpath> 
       <pathelement location="${result.classes.dir}" /> 
      </classpath> 
     </javac> 
    </target> 
    <target name="test" depends="compile"> 
     <taskdef name="junit" 
      classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"> 
      <classpath> 
       <pathelement location="../../../lib/junit.jar" /> 
       <pathelement location="../../../bin" /> 
       <pathelement location="${result.classes.dir}" /> 
      </classpath> 
     </taskdef> 

     <jacoco:coverage destfile="${result.dir}/jacoco.exec" 
      xmlns:jacoco="antlib:org.jacoco.ant"> 
      <junit fork="yes" forkmode="once" dir="." failureProperty="test.failed"> 
       <classpath> 
        <pathelement location="../../../lib/junit.jar" /> 
        <pathelement location="../../../bin" /> 
        <pathelement location="${result.classes.dir}" /> 
       </classpath> 

       <formatter type="xml" /> 
       <batchtest todir="${result.report.dir}"> 
        <fileset dir="${test.dir}"/> 
       </batchtest> 
      </junit> 
     </jacoco:coverage> 
     <!-- Step 3: Create coverage report --> 
     <jacoco:report> 
      <!-- This task needs the collected execution data and ... --> 
      <executiondata> 
       <file file="${result.exec.file}" /> 
      </executiondata> 
      <!-- the class files and optional source files ... --> 
      <structure name="JaCoCo Ant Example"> 
       <classfiles> 
        <fileset dir="../../../bin" /> 
       </classfiles> 
       <sourcefiles encoding="UTF-8"> 
        <fileset dir="${src.dir}" /> 
       </sourcefiles> 
      </structure> 
      <!-- to produce reports in different formats. --> 
      <html destdir="${result.report.dir}" /> 
      <csv destfile="${result.report.dir}/report.csv" /> 
      <xml destfile="${result.report.dir}/report.xml" /> 
     </jacoco:report> 
    </target> 
    <target name="rebuild" depends="test" /> 
</project> 

UPDATE: Nach dem auf die neuere Version zu aktualisieren erhalte ich eine Warnung, die anzeigen kann, was mein Fehler.

Console Ausgabe:

Buildfile: JacocoEvaluation\src\main\resources\coverage.xml 
clean: 
    [delete] Deleting directory c:\temp\jacoco\target 
    [mkdir] Created dir: c:\temp\jacoco\target 
    [mkdir] Created dir: c:\temp\jacoco\target\site\jacoco 
compile: 
    [mkdir] Created dir: c:\temp\jacoco\target\classes 
    [javac] Compiling 1 source file to c:\temp\jacoco\target\classes 
test: 
[jacoco:coverage] Enhancing junit with coverage 
[jacoco:report] Loading execution data file c:\temp\jacoco\target\jacoco.exec 
[jacoco:report] Writing bundle 'JaCoCo Ant Example' with 1 classes 
[jacoco:report] Classes in bundle 'JaCoCo Ant Example' do no match with execution data. For report generation the same class files must be used as at runtime. 
[jacoco:report] Execution data for class alg/SpecialAlgorithm does not match. 
rebuild: 
BUILD SUCCESSFUL 
Total time: 1 second 

Die Struktur Verzeichnis (wie Maven):

main/java/Klasse test/java/Testcase

Irgendwelche Ideen zu testen, was ich tue, falsch ? Das Plugin funktioniert gut.

UPDATE: Funktioniert jetzt. Ich hatte das falsche Verzeichnis, auf das in der Berichtsstruktur verwiesen wird. Die neuere Version von jacoco hat eine Warnung ausgegeben, die dazu beigetragen hat, das Problem zu erkennen.

+0

Sie geben das Ergebnis von '' an ​​'$ {result.dir}/jacoco.exec 'aus und dann' 'sucht in' $ {result.exe.file } 'beim Erstellen des Berichts. Zeigen diese zwei Variablen auf den gleichen Ort? (Sie haben nicht genug von Ihrem Ameisen-Skript angegeben, um es zu erzählen.) Sie sollten in Erwägung ziehen, eine Variable auf der ganzen Linie zu verwenden, um das Risiko dieser Art von Nichtübereinstimmung zu reduzieren. – dcsohl

+0

Ich bin sicher, dass dies mit https://issues.jenkins-ci.org/browse/JENKINS-22716 verwandt ist; Ich habe das gleiche Problem in meiner Jenkins-Installation. – Bombe

+0

Keine jenkins beteiligte atm. Ich versuchte es mit dem Routing zu einem falschen Pfad zu der jacoco.exec und das Build schlägt fehl. Also wird die Datei gefunden. Ich poste das ganze Skript in einer Minute. Danke Leute! – mkuff

Antwort

3

Ich hatte das falsche Verzeichnis in der Berichtsstruktur verwiesen. Die neuere Version von jacoco hat eine Warnung ausgegeben, die dazu beigetragen hat, das Problem zu erkennen. Korrigiert mein Skript im ursprünglichen Post. Vielleicht hilft es jemandem irgendwann.

1

Es ist seltsam. In meinem Fall habe ich Java JDK 1.8.0_45 verwendet, um "clean build" und "grdle jacocoTestReport" zu erstellen. Habe denselben Fehler wie Oscar mit Gradle.

Die Datei jacocoXX.exec befand sich am richtigen Ort.

Lief "gradle clean build" wenn JDK 1.8.0_45 war, dann lief "grdle jacocoTestReport" mit JDK 1.7.0_40 - Es funktionierte wie ein Charme.

Eine andere Lösung ist: Wenn Sie 1.8.0_45 JDK verwenden möchten (dh Java8) für beide zu bauen und jacocoTestReport Aufgaben, dann rufen wie: gradle -x compileJava -x Test -x Klassen -X testClasses jacocoTestReport (dann kommt der Fehler nicht).

Verwandte Themen