前言

在软件测试过程中,有些软件要进行逻辑测试,对于逻辑测试来说,一般就是使用工具对测试代码的指令和分支的覆盖率,看看代码在执行过程中,这部分代码有没有被执行覆盖。


文档概述

也是准备离职了,感觉这份工作干得有点累,但是还是想把工作遇到的情况,和一些进行软件测试的一些坑给大家分享一下,本文档详细介绍如何通过命令行使用 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: 输出到文件
tcpserver: 远程获取
tcpclient: 连接到服务

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 个被测试覆盖

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐