软件测试——JaCoCo使用经验
一个文件下,不需要写地址,直接运行,jacocotest.exec,这个是覆盖率文件,可以自由命名,jacocotest.jar文件是要测试的软件jar包,可以自由命名【可以改,或者跟实际一样,把代码软件跑起来就ok】上面这个这个AI生成的例子,可以当做参考,实际上干的时候,不能照着东放一个文件,西放一个文件,前面把东西放一个文件夹下,就是不想填那么长的路径。至于下面这个,当做参考就ok,jar解
前言
在软件测试过程中,有些软件要进行逻辑测试,对于逻辑测试来说,一般就是使用工具对测试代码的指令和分支的覆盖率,看看代码在执行过程中,这部分代码有没有被执行覆盖。
文档概述
也是准备离职了,感觉这份工作干得有点累,但是还是想把工作遇到的情况,和一些进行软件测试的一些坑给大家分享一下,本文档详细介绍如何通过命令行使用 JaCoCo 进行 Java 代码覆盖率测试,包括环境准备、执行步骤、参数说明和结果分析。
1. 环境准备
1.1 前提条件
需要使用jacoco进行逻辑测试的也就是Java开发的软件了,不用怀疑了,在测试计算机上可以运行起来,那一般来说也是开发给配了Java环境,如果实在不放心,可以使用命令行进行查看,一般来说,使用命令行跑的逻辑测试对Java版本没那么严格要求,要是在idea开发环境进行逻辑测试,那就得注意自己的jacoco版本和开发的Java版本是否匹配【在有些地方是没有外部网络,得自己写一些相关配置文件】,但是,对于测试来说,也不大可能直接要开发配合在测试电脑上按照相应的开发工具,让你进行逻辑测试,一般推荐使用命令行进行,在idea上配置,这里就不会详细展开说,重点在命令行上【由于特殊原因,图片不能上传,但是光看文字也是可以说清楚的】
先看下Java环境是否有:
java -version
1.2 下载 JaCoCo
去官网下载,链接这里有:https://www.jacoco.org/jacoco/
随便下载一个就可以,一般来说都可以用,没有什么特别要求的话。

1.3 项目结构示例
主要用到如下2个jar包:

2. 完整执行步骤
步骤 1: 找到源代码
找开发要自己测试的软件的jar包,或者自己知道在哪,直接把jacocoagent和jacococli这2个文件,放到当前和自己测试的软件的jar包一个文件下,然后打开终端。
步骤 2: 使用 JaCoCo Agent 运行测试
例子:
# 设置 JVM 参数运行测试
java -javaagent:jacoco-0.8.10/lib/jacocoagent.jar=destfile=target/jacoco.exec,output=file \
-cp "target/classes:target/test-classes:lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar" \
org.junit.runner.JUnitCore com.example.CalculatorTest
上面这个这个AI生成的例子,可以当做参考,实际上干的时候,不能照着东放一个文件,西放一个文件,前面把东西放一个文件夹下,就是不想填那么长的路径。
直接在终端输入:
java -javaagent:jacocoagent.jar=destfile=jacocotest.exec jacocotest.jar
一个文件下,不需要写地址,直接运行,jacocotest.exec,这个是覆盖率文件,可以自由命名,jacocotest.jar文件是要测试的软件jar包,可以自由命名【可以改,或者跟实际一样,把代码软件跑起来就ok】
注意:要知道自己测试的部分功能是哪些,然后把这些功能执行一次,不要有遗落。
这些注意事项,这些注意事项可能才是重要的,重要的都加粗了,其他次要,一般来说,查AI都有,都可以看得到,千篇一律。
下面这个可以参考,在实际使用过程中也没那么多的讲究。
核心参数详解:
|
参数 |
意义 |
为什么重要 |
|
-javaagent: |
启用 Java 代理机制 |
JaCoCo 通过 Java Agent 在运行时插入探针 |
|
jacocoagent.jar |
JaCoCo 代理 JAR |
负责收集覆盖率数据 |
|
destfile= |
输出数据文件路径 |
存储原始覆盖率数据 |
|
output=file |
输出方式 |
file: 输出到文件 |
|
includes= |
包含的包(可选) |
com.example.*只监控特定包 |
|
excludes= |
排除的包(可选) |
过滤不需要监控的类 |
步骤 3: 生成覆盖率报告
这里就关键了,要生成覆盖率报告,在生成的时候要注意2个事:【很重要】
1、要把软件停下来,查看自己的覆盖率文件是否有大小【没有大小,软件结束时,可能有延时,等等看,如果还是没有,就重来,没有这个覆盖率文件,即.exec后缀的文件,就不能进行报告生成】
2、要把自己测试的软件jar包进行解压,找到自己测试的部分代码在哪,然后把里面的class文件提取出来,做为生成覆盖率报告文件【一般在实际过程,除非开发给你重新编译软件,要不然都是直接使用jar进行测试的,所以需要到当前文件的class文件,没有这个也是无法生成报告】
生成报告命令:
java -jar jacococli.jar report jacoco.exec --classfiles classes
至于下面这个,当做参考就ok,jar解压的出来是没有源码的,所以也不需要也可以生成逻辑测试报告,顶多是不能定位到代码在哪里没有执行指令或者分支。
补充一个解压jar包的命令【一般测试计算机是有解压工具的,用解压工具也可以解压jar包】
# 解压到当前目录
jar xf jacocotest.jar
解压后的Spring Boot JAR/
├── BOOT-INF/
│ ├── classes/ # ✅ 你的代码在这里!
│ │ └── com/yourcompany/
│ └── lib/ # ❌ 第三方依赖
├── META-INF/
└── org/springframework/ # ❌ Spring框架代码
怎么找到自己的测试的代码位置:1、直接问开发【快速,真的直接问,比自己找快,因为你也不知道开发怎么命名的】
2、自己找【一般都是前后端分离项目,测试也不大可能测试前端,所以一般在BOOT-INF/ classes/下面,如果不在,就到lib里面找,因为有可能是打包方式的文件,把测试代码再次打包放在了lib下面,在classes里面的只有启动文件】有特殊的,那就另算,或者直接问开发
# 生成 HTML 报告
java -jar jacoco-0.8.10/lib/jacococli.jar report target/jacoco.exec \
--classfiles target/classes \
--sourcefiles src/main/java \
--html target/coverage-report \
--name "My Project Coverage Report"
报告生成参数:
|
参数 |
意义 |
示例值 |
|
report |
生成报告命令 |
固定命令 |
|
--classfiles |
编译后的 .class 文件目录 |
target/classes |
|
--sourcefiles |
源代码目录 |
src/main/java |
|
--html |
输出 HTML 报告目录 |
target/coverage |
|
--xml |
输出 XML 报告文件 |
coverage.xml |
|
--csv |
输出 CSV 报告文件 |
coverage.csv |
|
--name |
报告名称 |
自定义项目名 |
|
--encoding |
文件编码 |
UTF-8 |
步骤 4: 查看报告
报告都生成的,还不知道怎么查看,找到report文件夹,index就是了,双击打开。
3. 高级用法
这些看看就好,生成完报告,已经算是完成一个流程了,后面查看到报告覆盖率不达标,重来,现看看是不是自己有情况没有测试完成,还是不行,找开发互相核对,
3.1 合并多个执行文件
# 合并多次运行的覆盖率数据
java -jar jacococli.jar merge \
target/jacoco1.exec target/jacoco2.exec \
--destfile target/jacoco-merged.exec
3.2 检查覆盖率阈值
# 检查是否达到预设的覆盖率标准
java -jar jacococli.jar check target/jacoco.exec \
--classfiles target/classes \
--sourcefiles src/main/java \
--rules file:coverage-rules.xml
>
<value>COVEREDRATIO</value>
<minimum>0.60</minimum> <!-- 60% 分支覆盖率 -->
</limit>
</limits>
</rule>
</rules>
3.3 从正在运行的应用获取数据
# 启动应用时使用 tcpserver 模式
java -javaagent:jacocoagent.jar=output=tcpserver,port=6300,address=localhost \
-jar myapp.jar
3.4 覆盖率计数器说明
JaCoCo 测量以下类型的覆盖率:
|
计数器 |
含义 |
重要性 |
|
INSTRUCTION |
字节码指令 |
最细粒度的覆盖率 |
|
BRANCH |
分支覆盖率(if/switch) |
测量决策点的覆盖 |
|
LINE |
行覆盖率 |
直观的代码行覆盖 |
|
COMPLEXITY |
圈复杂度 |
衡量代码复杂性 |
|
METHOD |
方法覆盖率 |
方法是否被调用 |
|
CLASS |
类覆盖率 |
类是否被使用 |
计算方式:
覆盖率 = (covered / (covered + missed)) × 100%
例如:分支覆盖率 75% 表示 4 个分支中有 3 个被测试覆盖
更多推荐

所有评论(0)