相关文章:

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的文件夹,然后将压缩文件放入里面解压。

 

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就是报告。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐