JaCoCo 用来生成单元测试覆盖率报告。它不能证明系统没有缺陷,但能回答另一个问题:这些测试到底执行了哪些代码。
一、父 POM 统一接入
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>prepare-agent</id>
<goals><goal>prepare-agent</goal></goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals><goal>report</goal></goals>
</execution>
</executions>
</plugin>
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/pom.xml
测试前注入 agent,测试阶段生成报告,所有子模块共享同一套规则。
二、看报告要看路径
覆盖率报告比一个总分更有价值:
- 核心业务分支是否被测试触达。
- 异常路径是否被覆盖。
- 大段未覆盖代码是风险还是配置代码。
- 高覆盖测试是否只是执行了代码而没有断言。
三、与 Surefire 配合
项目在 Surefire 中使用 @{argLine} 晚绑定,保留 JaCoCo 注入的 agent 参数,同时加入 JDK 21 动态 agent
相关参数。插件配置顺序不当,覆盖率可能悄悄变成 0。
四、避坑点
- 不要为了覆盖率写无意义测试。
- 覆盖率 100% 不等于所有行为正确。
- 集成测试和单元测试的覆盖语义不同。
- 报告要和构建产物一起归档,否则查历史时会缺证据。
五、经验总结
JaCoCo 是测试证据生成器。它帮助找到盲区,但测试质量仍然取决于断言和场景设计。