如何生成唯一命名的JaCoCo .exec文件以支持并行测试覆盖率合并
JaCoCo并行测试覆盖率统计落地方案
你的思路完全可行,不需要找非官方的特殊配置,用JaCoCo原生能力配合CircleCI的内置机制就能解决,步骤如下:
- 第一步:配置唯一命名的.exec输出规则
直接利用CircleCI每个并行节点自带的内置环境变量CIRCLE_NODE_INDEX(每个并行节点的序号,从0开始,全局唯一)作为.exec文件名的区分标识,JaCoCo Maven插件的destFile配置项支持直接读取环境变量,本地调试时如果没有该环境变量会自动fallback到默认文件名,不会影响本地开发流程。
核心配置示例:<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.12</version> <configuration> <destFile>${project.build.directory}/jacoco-${env.CIRCLE_NODE_INDEX:-default}.exec</destFile> </configuration> <!-- 原有prepare-agent、单元测试/集成测试绑定的执行逻辑不需要改动 --> </plugin> - 第二步:配置多exec文件自动合并逻辑
不需要自己实现文件扫描逻辑,直接用JaCoCo官方提供的merge目标,通过通配符匹配所有前缀为jacoco-的.exec文件,合并为统一的覆盖率文件供后续报告生成使用。
核心配置示例:
后续生成覆盖率报告时,将报告目标读取的destFile指向上述合并后的<execution> <id>merge-all-jacoco-data</id> <phase>verify</phase> <goals> <goal>merge</goal> </goals> <configuration> <fileSets> <fileSet> <directory>${project.build.directory}</directory> <includes> <include>jacoco-*.exec</include> </includes> </fileSet> </fileSets> <destFile>${project.build.directory}/jacoco-full-coverage.exec</destFile> </configuration> </execution>jacoco-full-coverage.exec即可。 - 第三步:调整CircleCI流水线的文件流转逻辑
注意并行测试任务运行在互相隔离的容器中,仅配置文件名和合并规则还不够,必须做跨节点的文件收集:- 每个并行测试任务执行完成后,将自身生成的
jacoco-*.exec文件通过CircleCI的workspace机制上传持久化 - 单独配置一个非并行的报告任务,设置为等待所有并行测试任务执行完成后触发,该任务会拉取所有节点上传的workspace文件,将所有.exec文件统一放到项目的target目录下,再执行合并、报告生成的命令即可。
- 每个并行测试任务执行完成后,将自身生成的
注意:不要在并行测试任务节点上直接执行覆盖率报告生成逻辑,否则只能读取当前节点的单份exec文件,还是会出现覆盖率统计偏低的问题。
内容的提问来源于stack exchange,提问作者Derek Han
相关产品推荐
相关产品推荐

