总述
SpingBoot可以通过2种方式接入JaCoCo:
Maven和Agent。Maven方式是静态接入,在编译时计算代码覆盖率。Agent方式是动态接入,服务启起来以后,能实时根据代码命中情况计算代码覆盖率。
jacoco 支持四种工作模式
1、file:进程结束的时候在本地生成文件
2、tcpserver:开启端口等待客户端获取覆盖率
3、tcpclient:主动把覆盖率数据发送出去
4、none:不生成覆盖率
1、agent-file方式(报告只能获取一次,需要停止应用服务,才可获取最新报告)
1、下载jacoco
2、打包springboot项目,生成jar包:mvn package
3、以命令行方式带agent启动springboot
java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar -jar .\target\spring3-0.0.1-SNAPSHOT.jar
4、执行测试
5、生成报告
java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report .\jacoco.exec --classfiles .\target\classes\ --sourcefiles .\src\main\java\ --html ./report
缺点:只能生成一次,需要停止应用,重启后才可再次生成新的报告
2、agent-tcpserver模式(不需要停止应用服务,即可再次生成并获取最新报告)
2.1启动jacoco agent进行插桩
2.1.1 编译代码,生成jar包
mvn package
2.1.2 使用agent 启动应用
java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=10.201.1.29,append=true -jar ./target\spring3-0.0.1-SNAPSHOT.jar
关键参数说明:
-javaagent:C:\工具\jacoco-0.8.6\lib\jacocoagent.jar=includes=*,这个参数就是启用jacoco代理参数,其中C:\工具\jacoco-0.8.6\lib\jacocoagent.jar就是之前下载jacoco解压后的jacocoagent.jar的绝对路径,includes表示对要插桩的包进行过滤,代表所有的class都要进行插桩,也可以根据情况进行过滤,如includes=com.mycompany.
output=tcpserver,这里不需要改动,表示以TCP Server方式启动应用并插桩
port=6300,Jacoco开启的TCP Server的端口,不能被占用
address=localhost,对外开放的地址,也可以指定IP地址
demo-0.0.1-SNAPSHOT.jar,就是示例代码构建后target目录生成的jar包,需要根据实际情况更新
特别提醒:为了对比实时统计代码覆盖率的效果,此时请先不要请求上面提到的任何一个URL,切记!
2.2 获取报告
2.2.1 dump生成覆盖率文件 .exec(java命令调用)
保持服务启动,再打开一个cmd窗口同样cd到target目录,执行如下命令从上一步开启的TCP Server中dump出覆盖率文件
java -jar C:\工具\jacoco-0.8.6\lib\jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco_tcp_01.exec
参数说明:
- –destfile ./jacoco_tcp.exec,其中./jacoco_tcp.exec为生成exec文件名,表示在当前目录生成
- 其他参数和上一步类似,不再特别说明,注意需要更新jacococli.jar的绝对路径
- 执行成功后,会在target目录生成相应的.exec文件
2.2.2 分析exec文件生成html报告(java命令调用)
dump命令生成的.exec文件为二进制文件,需要进行解析,以生成html报告为例,执行如下的命令分别将两个.exec文件解析成html报告
java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report ./jacoco_tcp_01.exec --classfiles .\classes --sourcefiles ..\src\main\java --html report01
java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report .\jacoco_tcp_02.exec --classfiles .\target\classes\ --sourcefiles .\src\main\java --html
report02
- ./jacoco_tcp_01.exec,表示要解析的exec文件的相对路径
- –classfiles .\classes,需要指定生成的classes文件目录
- –sourcefiles …\src\main\java,需要指定源码的文件目录
2.2.3 分别获取2次报告,并对比,查看jacoco report的动态实时性
- 首次dump:此时系统未进行测试,覆盖率为0
- 访问页面,执行手工测试
- 第2次dump:已进行部分测试,覆盖率非0
2.2.4 结果对比,验证jacoco报告的实时性
分别打开2个报告目录下的index.html文件,查看覆盖率结果
1、第1次的报告
2、第2次的报告
可通过定时执行,动态获取实时报告
2.3 使用ant命令生成exec文件和report
2.3.1 Ant环境变量配置
我的电脑----属性-----高级----环境变量 如:ANT_HOME:C:\apache-ant-1.8.1 PATH:%ANT_HOME%\bin (为了方便在dos环境下操作)
实验了总是失败,没办法换成地址 C:/ apache-ant-1.8.1/bin,而不再使用变量。。。成功了。。
2.3.2 验证ant安装成功
为了验证ant是否成功安装,可以进行如下操作:
依次选择:开始->运行->cmd,输入如下命令:ant
如果出现如下内容,说明安装成功:
Buildfile: build.xml does not exist!
Build failed
2.3.3 ant 方式获取jacoco报告
-
配置ant命令:在ant\bin目录下新建build.xml文件,配置build.xml中相关信息为自己PC上的所属路径,附件如下:
-
启动jacoco agent进行插桩
java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1 -jar G:\00 workspace\00 Test\spr
ing3\target\spring3-0.0.1-SNAPSHOT.jar
- 执行dump:
进入ant\bin目录:执行ant dump,生成数据收集文件,exec
如:D:\02QaTools\apache-ant-1.9.16\bin> ant dump
4、获取报告report
D:\02QaTools\apache-ant-1.9.16\bin> ant report
2.4 将多份覆盖率报告合并-merge
2.4.1 合并多个exec文件, 生成merge .exec,并配置ant merge 命令
<property name="jacocomergeexecPath" value="D:\02QaTools\jacocoReport\target\jacoconew.exec"/>
<!--merge 命令配置-->
<target name="merge">
<jacoco:merge destfile="${jacocomergeexecPath}">
<fileset dir="D:\02QaTools\jacocoReport\target" includes="*.exec"/>
</jacoco:merge>
</target>
2.4.2 生成merge report,通过merge exec文件
<!--生成覆盖率merge报告的路径-->
<property name="mergereportfolderPath" value="D:\02QaTools\jacocoReport\reportmerge"/>
<!--配置ant report_mereg 命令,生成聚合报告-->
<target name="report_mereg">
<jacoco:report>
<executiondata>
<file file="${jacocomergeexecPath}"/>
</executiondata>
<structure name="JaCoCo Report2">
<group name="Launch related">
<!--此处配置classes文件地址 -->
<classfiles>
<fileset dir="${webClasspath}" />
</classfiles>
<!--此处配置源码地址-->
<sourcefiles encoding="gbk">
<fileset dir="${webSrcpath}" />
</sourcefiles>
</group>
</structure>
<!-- report文件保存地址 -->
<html destdir="${mergereportfolderPath}" encoding="utf-8"/>
</jacoco:report>
</target>
4、spring 多模块报告(待续)
5、jacoco 单元测试(待续)
参考链接:
- 只懂黑盒测试也能学会的代码覆盖率及精准化测试:https://xie.infoq.cn/article/5fda6c72b54134777e3edf4b9
- ant 详解:https://blog.csdn.net/qq997404392/article/details/76986978
- 命令行方式启动springboot:https://wuyaogexing.com/70/524742.html