最近接手的新项目需要使用代码覆盖率进行辅助测试,所以结合之前项目的实践笔记及经验,把 Java 代码覆盖率相关的知识做了一个回顾和总结。
我们一般都是用 jacoco+jenkins 进行代码覆盖率的统计和展示。从实践来看,变更代码覆盖率分析更贴合我们日常的使用场景。在版本迭代及回归测试阶段,可以采用黑盒测试 + 变更覆盖分析(白盒测试)的灰盒测试方法,完善测试场景,减少测试遗漏,保证测试的充分性。
具体的 jacoco 的配置及 jenkins 的配置可以参考以下文档:
jenkins+jacoco 配置代码覆盖率
Jacoco Code Coverage
附我们项目中使用的 build.xml 配置:
<?xml version="1.0" ?>
<project name="Example" xmlns:jacoco="antlib:org.jacoco.ant" basedir="." default="rebuild">
<!--Jacoco文件路径-->
<property name="jacocoantPath" value="/home/test/tools/jacoco-0.7.4/lib/jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco根据这个文件生成最终的报告-->
<property name="jacocoexecPath" value="/home/test/jenkins/workspace/Example-Coverage/jacoco_ci_report/exec/"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="/home/test/jenkins/workspace/Example-Coverage/jacoco_ci_report/report/"/>
<!--远程tomcat服务的ip-->
<property name="server_ip" value="10.165.***.**"/>
<!--jacocoagent服务打开的端口-->
<property name="server_port" value="8035"/>
<!--源代码路径-->
<property name="checkOrderSrcpath" value="/home/test/jenkins/workspace/Example-Coverage/moduleName/src/main/java" />
<!--.class文件路径-->
<property name="checkOrderClasspath" value="/home/test/jenkins/workspace/Example-Coverage/moduleName/target/classes" />
<tstamp>
<format property="stime" pattern="yyyy-MM-dd HH-mm-ss" locale="cn"/>
</tstamp>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef>
<!--dump任务: 根据前面配置的ip地址和端口,访问目标tomcat服务,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}ExampleApiTest${stime}.exec" port="${server_port}" append="true" dump="true"/>
</target>
<!--merge指定的.exec文件-->
<target name="merge_exec">
<jacoco:merge destfile="${jacocoexecPath}ExampleApiTest-merge.exec">
<fileset dir="${jacocoexecPath}" includes="ExampleApiTest*.exec" />
</jacoco:merge>
</target>
<!--jacoco任务:根据前面配置的源代码路径和.class文件路径,及merge后生成的.exec文件,生成最终的html覆盖率报告-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" />
<jacoco:report>
<executiondata>
<file file="${jacocoexecPath}ExampleApiTest-merge.exec" />
</executiondata>
<structure name="JaCoCo Report">
<group name="Check Order related">
<classfiles>
<fileset dir="${checkOrderClasspath}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${checkOrderSrcpath}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
<_xml destfile="${reportfolderPath}/jacoco_report.xml" encoding="utf-8" />
</jacoco:report>
</target>
<target name="rebuild" depends="dump,merge_exec,report"></target>
</project>