之前系統的持續集成覆蓋率工具使用的是cobetura,使用的過程中雖然沒什么問題,但感覺配置比較麻煩,現在准備改用jacoco這個覆蓋率工具來代替它。接下來我介紹一下jenkins配置jacoco,並且在sonar顯示單元測試和集成測試覆蓋率的過程。
用jacoco來實現單元測試的覆蓋率比較簡單,在ant腳本中先增加下面的任務:
build.xml
1
2
3
|
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <classpath path="${basedir}/jacoco_lib/jacocoant.jar" /> </taskdef>
|
這里要引入jacoco的jar包jacocoant.jar,增加了這個命令之后,將原有的單元測試任務用 jacoco:coverage包括起來,實例代碼如下:
build.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<target name="unitTest" depends="test_compile"> <mkdir dir="${junit.dir}"/> <jacoco:coverage destfile="${basedir}/ut.exec"> <junit fork="true" forkmode="once" printsummary="on" failureproperty="unit.test.failure"> <classpath> <pathelement location="${build.class}"/> <fileset dir="${build.lib.dir}"/> </classpath> <formatter type="xml"/> <batchtest todir="${junit.dir}"> <fileset dir="${src.test.dir}"> <include name="**/*Test.java"/> </fileset> </batchtest> </junit> </jacoco:coverage> <!-- 其他內容 --> </target>
|
jacoco:coverage的destfile參數是指生成的覆蓋率文件路徑,不寫默認文件名為jacoco.exec。另外在forkmode這個參數設置為once,可以提高你的單元測試的執行效率。
這樣跑完單元測試后,就會在指定路徑下生成覆蓋率文件ut.exec(或默認的jacoco.exec,在工程根目錄下)。
如果要在本地生成jacoco的覆蓋率報告,可以增加如下任務:
build.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<target name="jacocoReport"> <delete dir="${basedir}/jacoco"/> <mkdir dir="${result.jacoco.report.dir}/ut"/> <jacoco:report> <executiondata> <file file="${basedir}/ut.exec"/> </executiondata> <structure name="jacoco_demo"> <classfiles> <fileset dir="${build.dir}"/> </classfiles> <sourcefiles encoding="UTF-8"> <fileset dir="${src.dir}"/> </sourcefiles> </structure> <html destdir="${result.jacoco.report.dir}/ut"/> </jacoco:report> </target>
|
生成覆蓋率報告需要覆蓋率文件(exec)、源碼、編譯后的class文件。這里導出的格式是html,還有xml和cvs 2種格式可以導出,具體參考jacoco:report。
注意,這里的class文件和exec文件必須用同一個jvm執行,如果是用JVM A來編譯class文件,然后用JVM B來生成覆蓋率文件,生成出來的報告覆蓋率會為0%。這一點對生成集成測試的覆蓋率特別重要。