You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SonarQube 6.5+中生成单元测试与集成测试分离的报告

如何在SonarQube 6.5+中分开展示单元测试与集成测试覆盖率

核心思路

SonarQube默认会合并所有测试覆盖率数据,但我们可以通过拆分分析任务或者自定义指标配置的方式,让单元测试和集成测试的覆盖率分开展示。下面是两种最常用的落地方案:


方案一:创建两个独立的Sonar项目(推荐)

这种方式简单直观,适合大多数团队的场景:

  • 为单元测试和集成测试分别创建Sonar项目(比如myapp-unit-testsmyapp-integration-tests
  • 在构建时分别生成对应的覆盖率报告,再单独提交到各自的Sonar项目中

具体操作步骤(以Maven + Jacoco为例)

  1. 配置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>
    
  2. 分别提交到对应的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_coverageintegration_test_coverage自定义指标
  • 在SonarQube的仪表盘上添加自定义小部件,单独展示这两个指标

简化替代方案(无需插件)

如果不想折腾插件,可以用分支扫描实现:

  • 创建unit-testsintegration-tests两个代码分支
  • 在对应分支上仅运行单元测试/集成测试,然后扫描到Sonar的对应分支
  • 在Sonar项目的分支视图中切换查看不同测试的覆盖率数据

注意事项

  • 确保Jacoco版本(建议0.8.0+)与SonarQube 6.5+兼容
  • 若使用Gradle,思路一致:配置Jacoco生成独立报告,通过sonarqube任务分别指定jacocoReportPaths
  • 可以通过sonar.test.inclusions/sonar.test.exclusions参数,精准区分单元测试和集成测试的代码范围,避免重复统计

内容的提问来源于stack exchange,提问作者Tarun Prakash

火山引擎 最新活动