Maven中使用JaCoCo的最佳方式 应选Test还是verify阶段运行?
Maven中JaCoCo使用最佳实践与阶段选择
核心Goal对应的Phase绑定规则
JaCoCo的三个常用goal有明确的阶段绑定要求,结合Maven生命周期的执行顺序,最佳绑定方式如下:
prepare-agent:不需要手动指定phase,默认绑定到initialize阶段,作用是为JVM挂载覆盖率统计探针,会在所有测试执行前完成配置,你当前的这块配置无需修改。report:最佳绑定到verify阶段,你当前的配置是正确的。该goal需要依赖测试执行完成后生成的jacoco.exec覆盖率数据文件才能生成报告,放到verify阶段可以覆盖单元测试、集成测试的全量覆盖数据,多模块项目也能在所有子模块测试完成后生成聚合报告。check:你当前绑定到test阶段是错误配置,必须绑定到verify阶段,且要保证执行顺序在report之后。check的作用是校验覆盖率阈值是否符合要求,必须等报告生成、全量覆盖率数据统计完成后才能执行,否则会拿不到数据导致校验失效。
Test阶段与Verify阶段使用JaCoCo的区别
Maven的生命周期执行顺序为:test(仅执行单元测试)→ 打包、集成测试相关阶段 → verify(所有测试执行完成后执行校验),二者使用JaCoCo的差异非常明显:
- 绑定到
test阶段的问题:仅能统计到单元测试的覆盖率数据,集成测试的覆盖数据会被遗漏;多模块项目下无法生成跨模块的聚合覆盖率报告;如果将check绑定到该阶段,会因为报告还未生成导致校验逻辑失效。 - 绑定到
verify阶段的优势:可以收集到单元测试、集成测试的全量覆盖率数据,多模块项目也能生成完整的聚合报告,check校验逻辑基于全量数据执行,结果准确,符合CI流水线的管控要求。
最佳配置修正
你可以将check的phase调整为verify,调整后完整配置如下:
<executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> <configuration> <outputDirectory>target/jacoco-report</outputDirectory> </configuration> </execution> <execution> <id>check</id> <phase>verify</phase> <goals> <goal>check</goal> </goals> <!-- 可在此处添加覆盖率阈值配置,比如行覆盖率要求80%以上 --> </execution> </executions>
CI流水线使用建议
CI中直接执行mvn verify命令即可,不需要单独执行test阶段。该命令会自动完成测试执行、覆盖率报告生成、阈值校验全流程,一旦覆盖率不满足要求,构建会直接失败,完美实现代码覆盖率门禁的效果。
内容的提问来源于stack exchange,提问作者Victor Levin
相关产品推荐
相关产品推荐

