相关文章:
jacoco代码覆盖率_jacoco覆盖率_做测试的喵酱的博客-CSDN博客
一、背景
前提:
同一个项目,代码没有修改的情况下,合并多个代码覆盖率,实现全量代码覆盖率。
java -jar jacococli.jar merge jacoco.exec jacoco-new.exec --destfile merged.exec
是使用 Jacoco 命令行工具进行覆盖率数据合并的命令。
这个命令用于将两个 Jacoco 代码覆盖率执行数据文件(jacoco.exec 和 jacoco-new.exec)合并成一个新的覆盖率执行数据文件(merged.exec)。合并后的文件可以用于生成包含所有执行数据的全量覆盖率报告。
在软件开发过程中,由于测试是分布在多个环境或阶段中的,可能会生成多个代码覆盖率执行数据文件。为了获取完整的代码覆盖率情况,我们需要将这些分散的执行数据文件合并起来,以便生成全量的代码覆盖率报告。
上述命令中的参数解释如下:
- jacoco.exec:旧的执行数据文件,包含之前的代码覆盖率执行信息。
- jacoco-new.exec:新的执行数据文件,包含最近的代码覆盖率执行信息。
- merged.exec:合并后的执行数据文件,用于生成全量的代码覆盖率报告。
执行该命令后,Jacoco 命令行工具将读取两个输入的执行数据文件,合并它们,并将合并后的执行数据写入到目标文件 merged.exec 中。合并后的文件可以作为输入用于生成全量的代码覆盖率报告。
二、基本的步骤
1、在每次构建或测试后,保存生成的覆盖率报告文件,例如 jacoco.exec。
2、在进行代码修改后,重新运行测试,并生成新的覆盖率报告文件,例如 jacoco-new.exec。
3、使用 JaCoCo 的 merge 命令将旧的覆盖率文件和新的覆盖率文件合并为一个文件:
java -jar jacococli.jar merge jacoco.exec jacoco-new.exec --destfile merged.exec
这将合并 jacoco.exec 和 jacoco-new.exec 文件,并将结果保存到 merged.exec 中。
4、通过运行 JaCoCo 的 report 命令来生成合并后的覆盖率报告:
java -jar jacococli.jar report merged.exec --classfiles <项目类文件路径> --html <报告输出路径>
请确保将 <项目类文件路径> 替换为你的项目的类文件路径,将 <报告输出路径> 替换为你想要保存报告的目录。
5、打开生成的 HTML 报告文件,查看增量代码覆盖率。在报告中,你可以找到有关测试覆盖率的详细信息,包括新增代码的覆盖情况。
三、 实战演示
生成代码覆盖率,我们需要依赖源码,和字节码。
3.1、jacoco下载:
- jacoco 最新版本下载
将下载的jacoco压缩文件,上传到服务器,新建一个名为jacoco的文件夹,然后将压缩文件放入里面解压。
3.2、 启动jacocoagent,监控被测项目
java -javaagent:/usr/chenshuai/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=0.0.0.0,append=true -jar AutoApi-0.0.1-SNAPSHOT.jar
- includes=*
这个代表了,启动时需要进行字节码插桩的包过滤,*代表所有的class文件加载都需要进行插桩。
你可以写成:
includes=com.test.service.*
这个参数我们可以用来做maven多模块的覆盖率,比如我们只想查看service服务层的覆盖率,我们可以通过设置包路径的方式进行只统计当前包的覆盖率
- output=tcpserver
output主要四个参数:
1、file: At VM termination execution data is written to the file specified in the destfile attribute.(当jvm停止掉的时候产出dump文件,即服务挂了产出dump文件)
2、tcpserver: The agent listens for incoming connections on the TCP port specified by the address and port attribute. Execution data is written to this TCP connection.(常用模式,将jacocoaget作为服务,每次通过cli包进行dump命令去获取dump包)
3、tcpclient: At startup the agent connects to the TCP port specified by the address and port attribute. Execution data is written to this TCP connection.(将jacocoagent做为客户端,向指定ip和端口的服务推送dump信息)
4、none: Do not produce any output.(不产出任何dump,dump个寂寞,忽略)
注意:
在k8s容器里面由于ip是动态的,tcpserver模式的ip无法固定填写,可以填 0.0.0.0 然后通过实际容器 ip 就可以访问到,而这个实际ip,一般可以从cmdb服务中动态获取
- port=98080
这是jacoco开启的tcpserver的端口,请注意这个端口不能被占用。
- address=192.168.110.1
这是对外开发的tcpserver的访问地址。可以配置127.0.0.1,也可以配置为实际访问ip
配置为127.0.0.1的时候,dump数据只能在这台服务器上进行dump,就不能通过远程方式dump数据。
配置为实际的ip地址的时候,就可以在任意一台机器上(前提是ip要通,不通都白瞎),通过ant xml或者api方式dump数据。
举个栗子:
我如上配置了192.168.110.1:2014作为jacoco的tcpserver启动服务,
那我可以在任意一台机器上进行数据的dump,比如在我本机windows上用api或者xml方式调用dump。
如果我配置了127.0.0.1:2014作为启动服务器,那么我只能在这台测试机上进行dump,其他的机器都无法连接到这个tcpserver进行dump
如果不知道本机ip地址,可以使用0.0.0.0,这样ip地址会绑定主机ip。
- append:true
是执行数据文件已经存在,则覆盖数据将附加到现有文件
3.3 、 执行手工测试
访问服务
http://124.71.131.113:8081/get_order_info
3.4、 cli包dump生成exec文件(注意一定要测试完毕之后)
1 在当前服务器执行dump命令
java -jar /usr/chenshuai/jacoco/lib/jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile ./AutoApi-0.0.1-SNAPSHOT.exec
- --address 127.0.0.1 --port 6300 指向jacocoagent启动IP和端口
- ./AutoApi-0.0.1-SNAPSHOT.exec 为生成exec文件名,在当前目录下生成该文件
2 远程执行dump命令生成exec文件
java -jar jacococli.jar dump --address 124.70.87.136 --port 6300 --destfile ./AutoApi-0.0.1-SNAPSHOT.exec
在当前目录下生成文件。
注意:
在执行命令的机器上,也需要装有jacoco,且该机器能正常连接被测的服务器和端口。
3.5 再次执行手工测试,并生成新的exec文件
java -jar /usr/chenshuai/jacoco/lib/jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile ./new.exec
新生成的文件名为new.exec
3.6、使用 JaCoCo 的 merge 命令合并
使用 JaCoCo 的 merge 命令将旧的覆盖率文件和新的覆盖率文件合并为一个文件:
模版:
java -jar jacococli.jar merge jacoco.exec jacoco-new.exec --destfile merged.exec
这将合并 jacoco.exec 和 jacoco-new.exec 文件,并将结果保存到 merged.exec 中。
示例:
java -jar /usr/chenshuai/jacoco/lib/jacococli.jar merge AutoApi-0.0.1-SNAPSHOT.exec new.exec --destfile merged.exec
生成合并后的 merged.exec文件。
3.7、通过运行 JaCoCo 的 report 命令来生成合并后的覆盖率报告:
模版:
java -jar jacococli.jar report merged.exec --classfiles <项目类文件路径> --html <报告输出路径>
- --sourcefiles 本地被测项目的源码
- --classfiles 为本地被测项目的字节码路径
请确保将 <项目类文件路径> 替换为你的项目的类文件路径,将 <报告输出路径> 替换为你想要保存报告的目录。
示例:
java -jar /usr/chenshuai/jacoco/lib/jacococli.jar report ./merged.exec --classfiles /usr/chenshuai/mock-server/target/classes --sourcefiles /usr/chenshuai/mock-server/src/main/java --html html-report --xml report.xml --encoding=utf-8
执行命令后,在本地生成一个html-report 文件夹
把这个文件夹,下载到本地。index.html就是报告。
压缩文件夹html-report:
zip -r html-report.zip html-report
将html-report.zip 下载到本地
sz html-report.zip
远程生成测试报告:
java -jar jacococli.jar report ./AutoApi-0.0.1-SNAPSHOT.exec --classfiles /Users/zhaohui/IdeaProjects/mock-server/target/classes --sourcefiles /Users/zhaohui/IdeaProjects/mock-server/src/main/java --html html-report --xml report.xml --encoding=utf-8
8、打开生成的 HTML 报告文件
打开生成的 HTML 报告文件,查看增量代码覆盖率。在报告中,你可以找到有关测试覆盖率的详细信息,包括新增代码的覆盖情况。
index.html就是报告。