我正在嘗試將jacoco集成到我們的ant構建中,並使用一個簡單的測試項目對其進行評估。Jacoco - 零覆蓋率
編譯和其他輸出看起來很有希望,但是當我查看覆蓋時,它始終爲零。
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;
}
}
測試用例:
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腳本:
<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:在升級到新版本後,我得到一個警告,這可能表明我的錯誤是什麼。
控制檯輸出:
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
的目錄結構(像行家):
主/ JAVA /類來測試 測試/ JAVA /測試用例
任何想法,我做錯了?該插件工作正常。
更新:現在有效。我在報告結構中引用了錯誤的目錄。新版本的jacoco打印出警告,幫助發現問題。
您正在將''的結果輸出到'$ {result.dir}/jacoco.exec',然後''正在查看'$ {result.exec.file }在編寫報告時。這兩個變量指向同一個地方嗎? (你沒有足夠的螞蟻腳本來告訴我。)你應該考慮使用一個變量來減少這種不匹配的風險。 –
dcsohl
我確信這與https://issues.jenkins-ci.org/browse/JENKINS-22716有關;我在Jenkins安裝中遇到同樣的問題。 – Bombe
沒有詹金斯參與atm。我嘗試了路由到jacoco.exec的錯誤路徑,然後構建失敗。所以文件被找到了。我在一分鐘後發佈整個腳本。多謝你們! – mkuff