如何在SonarQube 6.5+中生成单元测试与集成测试分离的报告
如何在SonarQube 6.5+中分开展示单元测试与集成测试覆盖率
核心思路
SonarQube默认会合并所有测试覆盖率数据,但我们可以通过拆分分析任务或者自定义指标配置的方式,让单元测试和集成测试的覆盖率分开展示。下面是两种最常用的落地方案:
方案一:创建两个独立的Sonar项目(推荐)
这种方式简单直观,适合大多数团队的场景:
- 为单元测试和集成测试分别创建Sonar项目(比如
myapp-unit-tests和myapp-integration-tests) - 在构建时分别生成对应的覆盖率报告,再单独提交到各自的Sonar项目中
具体操作步骤(以Maven + Jacoco为例)
配置Jacoco生成独立的测试报告
在pom.xml中配置Jacoco插件,让单元测试和集成测试生成各自的覆盖率数据文件和报告:<!-- 单元测试Jacoco配置 --> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>prepare-unit-tests</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${project.build.directory}/jacoco-unit.exec</destFile> <propertyName>jacoco.agent.argLine</propertyName> </configuration> </execution> <execution> <id>report-unit-tests</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/jacoco-unit.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-unit</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- 集成测试Jacoco配置 --> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <id>prepare-integration-tests</id> <phase>pre-integration-test</phase> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${project.build.directory}/jacoco-integration.exec</destFile> <propertyName>jacoco.agent.integration.argLine</propertyName> </configuration> </execution> <execution> <id>report-integration-tests</id> <phase>post-integration-test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/jacoco-integration.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-integration</outputDirectory> </configuration> </execution> </executions> </plugin>分别提交到对应的Sonar项目
执行两个独立的Sonar扫描命令,指定不同的项目Key和报告路径:# 提交单元测试覆盖率到专属Sonar项目 mvn sonar:sonar \ -Dsonar.projectKey=myapp-unit-tests \ -Dsonar.projectName="MyApp - 单元测试覆盖率" \ -Dsonar.jacoco.reportPaths=${project.build.directory}/jacoco-unit.exec # 提交集成测试覆盖率到专属Sonar项目 mvn sonar:sonar \ -Dsonar.projectKey=myapp-integration-tests \ -Dsonar.projectName="MyApp - 集成测试覆盖率" \ -Dsonar.jacoco.reportPaths=${project.build.directory}/jacoco-integration.exec
方案二:在同一个项目中添加自定义指标(进阶)
如果希望在同一个Sonar项目中同时展示两种覆盖率,可以通过自定义度量和插件扩展实现:
- 保留Jacoco生成的单元/集成测试独立数据文件,同时生成合并报告供Sonar默认展示
- 利用社区插件(或编写自定义插件)解析单独的报告,添加
unit_test_coverage和integration_test_coverage自定义指标 - 在SonarQube的仪表盘上添加自定义小部件,单独展示这两个指标
简化替代方案(无需插件)
如果不想折腾插件,可以用分支扫描实现:
- 创建
unit-tests和integration-tests两个代码分支 - 在对应分支上仅运行单元测试/集成测试,然后扫描到Sonar的对应分支
- 在Sonar项目的分支视图中切换查看不同测试的覆盖率数据
注意事项
- 确保Jacoco版本(建议0.8.0+)与SonarQube 6.5+兼容
- 若使用Gradle,思路一致:配置Jacoco生成独立报告,通过
sonarqube任务分别指定jacocoReportPaths - 可以通过
sonar.test.inclusions/sonar.test.exclusions参数,精准区分单元测试和集成测试的代码范围,避免重复统计
内容的提问来源于stack exchange,提问作者Tarun Prakash




