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