JaCoCo + Ant测试代码覆盖率
一、JaCoCo简述
JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其JavaAgent技术监控Java程序等等。
很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等。
JaCoCo包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)
二、JaCoCo基本概念
jacoco支持多种覆盖率的统计,包括:
- 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
- 类覆盖率:度量计算class类文件是否被执行。
- 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
- 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
- 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
- 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块
三、JaCoCo使用方式
3.1 Apache Ant方式
参见 http://eclemma.org/jacoco/trunk/doc/ant.html
3.2 命令行方式
参见 http://www.eclemma.org/jacoco/trunk/doc/agent.html
大概的命令:
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
其他参数可以查看上面的链接
接口测试时,我们也是使用该方式来进行,具体的说明会在下面另外说明
3.3 Apache Maven方式
参见 http://www.eclemma.org/jacoco/trunk/doc/maven.html
这种方式适合Maven的项目。
3.4 Eclipse EclDmma Plugin方式
该方式主要和eclipse集成,用户可以直观的看到覆盖率的情况
四、接口测试代码覆盖率
接口测试的入口是人工调用相关接口或者做相关动作产生的。jacoco agent监测测试活动,手动dump出来之后生成exec文件,最终生成覆盖率的报告。
其中,需要配置的地方有两个:
- server端---即测试服务器
- client端—即需要分析exec文件的地方,比如本地或者jenkins
4.1 server端--安装jacoco
1.https://www.jacoco.org/jacoco/ 下载下来,随意放在一个目录,解压即可。
180服务器上已经安装了jacoco,放在/home/hik/jacoco目录
2.因为我们服务是通过k8s容器部署的,要想容器内能访问到jacocoagent.jar,设置了一个NFS存储配置如图:
NFS配置3.声明挂载:
挂载4.使用:
使用4.2 server端–启动参数配置
1.JAVA_OPTS参数加上:
-javaagent:/home/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8030,address=0.0.0.0
# -javaagent: 的后面跟jacoco的安装路径
# includes= 选项,选择你要覆盖率的服务
# port= 选项,选择你要打开的端口,和服务端口要不一样,即是一个其他人未占用的端口
# address= 选项,服务所在机器的ip地址(容器里面填写0.0.0.0)
2.重启服务即可。这样server端已经启动了一个jacoco agent对服务进行监控
4.3 client端 – 本地安装ant
从http://ant.apache.org 上下载ant,解压
4.4 client端 – 本地配置build.xml
防踩坑提醒:build.xml文件中的jacoco版本和sever端配置的jacoco版本最好一致(jacoco-0.8.5),否则可能会出现“Unable to dump coverage data”错误。
- client端也需要安装jacoco
- 编写build.xml文件,放在ant解压之后的/bin目录下:
本地路径和端口需要根据实际情况修改
<?xml version="1.0" ?>
<project name="testExec" xmlns:jacoco="antlib:org.jacoco.ant" default="report">
<property name="test.server.host" value="10.8.101.180" />
<property name="local.server.host" value="127.0.0.1" />
<property name="event-linkage.port" value="31118" />
<property name="gis.port" value="31119" />
<property name="stastics.port" value="31120" />
<tstamp>
<!-- 自定义时间戳变量 -->
<format property="current.date.time" pattern="yyyyMMddHHmmss"/>
</tstamp>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<!-- 本地jacocoant.jar路径 -->
<classpath path="G:/software/apache-ant-1.10.4/lib/jacocoant.jar" />
</taskdef>
<target name="clean">
<!-- 清空文件 -->
<delete dir="G:/test/fpCMS/report" />
<delete dir="G:/test/fpCMS/exec" />
</target>
<target name="dump">
<!--dump任务:
根据前面配置的ip地址,和端口号,访问目标服务,并生成.exec文件。
reset=true时,会在dump出exec文件后,清空覆盖率数据(默认rest=false);
append=false时,dump出的exec文件会覆盖原有的exec文件;append=true时,dump出的exec文件
追加至原有的exec文件;
-->
<jacoco:dump address="${local.server.host}" port="${event-linkage.port}" append=true destfile="G:/test/fpCMS/exec/cloud-eventLink-${current.date.time}.exec" />
<jacoco:dump address="${local.server.host}" port="${gis.port}" append=true destfile="G:/test/fpCMS/exec/cloud-gis-${current.date.time}.exec" />
<!--<jacoco:dump address="${local.server.host}" port="${stastics.port}" destfile="G:/test/fpCMS/exec/stastic-${current.date.time}.exec" />-->
</target>
<target name="merge">
<!-- 合并多份exec文件 -->
<jacoco:merge destfile="G:/test/fpCMS/exec/merged.exec">
<fileset dir="G:/test/fpCMS/exec" includes="cloud-*.exec" />
</jacoco:merge>
</target>
<target name="report" depends="dump,merge">
<!-- Step 3: Create coverage report -->
<jacoco:report>
<!--
This task needs the collected execution data and ...
-->
<executiondata>
<file file="G:/test/fpCMS/exec/merged.exec"/>
</executiondata>
<!-- the class files and optional source files ... -->
<structure name="JaCoCo Ant Example">
<!-- 重要!本地class文件和java文件必须和server上保持一致 -->
<group name="cloud-event-linkage-service">
<classfiles>
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-event-linkage-service/target/classes/"/>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-event-linkage-service/src/main/java/"/>
</sourcefiles>
</group>
<group name="cloud-gis-service">
<classfiles>
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-gis-service/target/classes/"/>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-gis-service/src/main/java/"/>
</sourcefiles>
</group>
<!--<group name="cloud-statistics-service">
<classfiles>
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-statistics-service/target/classes/"/>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="G:/workspace/fpCMS/cloud-service/cloud-statistics-service/src/main/java/"/>
</sourcefiles>
</group>-->
</structure>
<!-- 生成html报告文件地址 -->
<html destdir="G:/test/fpCMS/report"/>
</jacoco:report>
</target>
</project>
4.5 本地执行ant任务
1.打开命令行,切换到ant安装路径/bin目录下
2.执行 ant report命令(根据build.xml配置,report命令包含了dump,merge,report命令,这些命令可以单独使用),生成报告
3.生成的报告在<html destdir="G:/test/fpCMS/report"/>配置路径下,点击打开index.html:
绿色:执行过的代码
黄色:部分执行
红色:未执行
4.6 其他说明
1.本地代码和server代码不一致时,报告无法展示
2.不同版本的报告(修改过代码)merge时无法保留之前的记录,会显示最新修改的文件,未修改文件的记录还在
3.build.xml文件比较灵活,理解之后可以自行配置,不一定完全对应上面的版本。参考:https://www.jacoco.org/jacoco/trunk/doc/ant.html
4.ant clean 命令可以删除掉文件
五、与Jenkins集成
待续。
参考:
https://www.jacoco.org/jacoco/
https://sq.163yun.com/blog/article/185102636718170112
https://blog.csdn.net/qq_26392615/article/details/82228972