hxz
发布于 2024-03-17 / 83 阅读
0

【jacoco】代码覆盖率统计

代码覆盖率价值

业界一般是通过代码覆盖率来输出自动化case的覆盖数据,衡量接口自动化测试的完备程度,来指导后续要增加、完善case的方向。另一方面,它还可以反映服务端功能测试的全面性,用来评估服务端手工测试是否全面

除此以外,代码覆盖率还可以应用于单元测试,可以拿到经过执行单元测试用例后的覆盖率数据。

代码覆盖率统计工具

常见的编程语言,如Java,C++,Python和Go等,都有相应的代码覆盖率统计工具

被测服务

覆盖率统计工具

java技术栈

jacoco

pyhton

coverage

go技术栈

go test coverage

C++

ccover、Lcov

这里,以java项目为例,说明如何统计被测服务的代码覆盖率,使用的覆盖率统计工具是jacoco

java覆盖率统计

以halo博客为例

step1:明确被测对象

如果被测对象只是单服务,服务运行包即是要统计的对象;如果被测对象是集成环境,包含多服务,那就需要拆解成多个统计任务。

案例-halo博客,服务启动方式是通过java -jar halo-1.5.4.jar来执行。halo-1.5.4.jar即是要统计的服务对象。

step2:启动jacoco并插桩

确保你有一个 JaCoCo 的 jacoco.exec 文件,它包含了执行期间收集的代码覆盖率数据。这个文件通常是通过在测试运行期间使用 JaCoCo 代理 (javaagent) 生成的。

如果你只有一个 halo.jar 包且没有其他类文件,你可能想要分析这个 JAR 包中的代码覆盖率。

java -javaagent:./jacocoagent.jar=output=tcpserver,address=*,port=6300,sessionid=halo -jar halo-1.5.4.jar

这将在运行 halo-1.5.4.jar 时启动 JaCoCo 代理并收集覆盖率数据。注意确保使用正确的 jacocoagent.jar 路径。

step3:执行测试用例

执行接口自动化测试脚本或手动执行相关测试用例。

step4:生成exec文件

执行完测试用例,不要先关闭jacoco进程,先生成exec文件

java -jar jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile ./jacoco_test1.exec

jacocoli.jar:jacoco工具包里

ip:jacoco服务ip

port:jacoco服务端口

jacoco_test1.exec:exec文件命名及路径

step5:提取类文件

首先,你需要解压 halo-1.5.4.jar 文件来提取里面的 .class 文件而不是嵌套的 JAR。

mkdir -p /home/halo/halo-1.5.4
cd /home/halo/halo-1.5.4
jar -xf /home/halo/halo-1.5.4.jar

执行完命令在halo目录下会新增BOOT-INF/classes的目录,/home/halo/halo-1.5.4/BOOT-INF/classes即是类文件存储路径。

step6:指定正确的类文件路径

接下来,你需要告诉 JaCoCo 去分析解压后的类文件。假设你的应用类文件位于 BOOT-INF/classes 目录下,你可以这样运行 JaCoCo:

java -jar ./jacococli.jar report ./jacoco_test1.exec \
    --classfiles /home/halo/halo-1.5.4/BOOT-INF/classes \
    --html ./report

各路径指向说明

jacococli.jar:jacoco工具包中的文件

jacoco_test1.exec:生成出来的exec文件

classfiles:指向前面的类文件存储路径

html:定义报告生成路径,如文件目录不存在需创建

step7:获取报告结果

report下的文件都是报告内容元素,可以把整个report目录压缩再导出。

step8:查看报告结果

打开index.html文件

step9:结果分析

total红框框的结果即是总的代码覆盖率统计结果,统计的维度为行覆盖。

如果未达到覆盖率阈值:和开发对齐未覆盖到的场景,分析是否存在冗余的代码或者是否存在未覆盖到的场景,如果是冗余代码需要优化代码,如果是场景未覆盖到需要增加相关的测试用例,完善完再重新统计。

如果达到覆盖率阈值:将代码覆盖率的统计结果整合在测试报告上。