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

代码质量度量中代码行数vs指令数及多模块测试覆盖配置咨询

协调JaCoCo与Sonar配置的解决方案

嗨,针对你的8模块项目,咱们可以通过精准的模块级配置来搞定JaCoCo覆盖率统计和Sonar代码质量分析的协调问题,确保数据准确还不冲突。先把你的模块分类理清楚:

  • 无需测试覆盖&特殊处理:2个模块(领域对象、自动生成类)
  • 能做Sonar分析但没法生成JaCoCo报告:1个GWT模块
  • 正常支持JaCoCo+Sonar:5个模块

下面分构建配置(假设你用Maven)和Sonar配置两部分来说明:

一、JaCoCo配置:只在目标模块启用

咱们不用在根pom里全局激活JaCoCo,而是针对性地在需要的模块里启用:

  1. 先在根pom里定义JaCoCo的通用配置,但默认不激活,这样各个模块可以按需引用:
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.10</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
  1. 去那5个正常模块的pom.xml里,显式引入JaCoCo插件,这样它们才会生成覆盖率报告:
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  1. 那2个无需覆盖的模块和1个GWT模块,千万别加JaCoCo插件,既避免生成无用报告,也不会触发GWT清空target的问题。

二、Sonar配置:精准控制覆盖率统计范围

接下来要让Sonar“知道”哪些模块要统计覆盖率,哪些不用,避免报错或数据不准:

  1. 排除无需覆盖的模块:告诉Sonar别统计这2个模块的覆盖率,如果它们连代码质量分析都不需要,直接排除整个模块就行:
# 只排除覆盖率统计
sonar.coverage.exclusions=module-domain/**/*,module-generated/**/*
# 如果这俩模块完全不需要Sonar分析,直接排除
sonar.exclusions=module-domain/**/*,module-generated/**/*

(注意把module-domainmodule-generated换成你实际的模块名称)

  1. 跳过GWT模块的覆盖率检查:因为这个模块没法生成JaCoCo报告,咱们得让Sonar别找它的报告,不然会显示0%或者报错。有两种方式:

    • 方式一:指定Sonar只读取那5个正常模块的JaCoCo XML报告路径(新版本Sonar推荐用这个参数):
    sonar.coverage.jacoco.xmlReportPaths=module-1/target/site/jacoco/jacoco.xml,module-2/target/site/jacoco/jacoco.xml,...
    
    • 方式二:针对GWT模块单独禁用覆盖率统计:
    # 假设GWT模块叫module-gwt
    sonar.module-gwt.coverage.exclusions=**/*
    
  2. 确保Sonar包含需要分析的模块:你说Sonar要在6个模块运行,也就是除了那2个无需分析的模块,剩下6个(包括GWT)都要做质量分析。如果Sonar默认扫描所有模块,那用上面的sonar.exclusions排除那2个就行;如果是手动指定模块,记得把6个模块都加到sonar.modules里。

三、GWT模块的临时 workaround(可选)

要是你想试试能不能让GWT模块也生成JaCoCo报告,可以调整报告的生成路径,避开GWT清空的target目录:
在GWT模块的pom里,给JaCoCo指定一个target之外的输出目录,比如项目根目录下的jacoco-reports

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
        <outputDirectory>${project.basedir}/../jacoco-reports/${project.artifactId}</outputDirectory>
    </configuration>
</plugin>

这样就算GWT清空target,报告也能保留,之后Sonar也能读取这个路径的报告。要是这个方法还是不行,就用前面的Sonar配置跳过它的覆盖率统计就好。

四、验证配置是否生效

最后跑两步验证一下:

  1. 执行mvn clean test jacoco:report,检查5个正常模块的target/site/jacoco下有没有生成报告,另外3个模块没有报告就对了。
  2. 运行Sonar扫描命令(比如mvn sonar:sonar),去SonarQube里看结果:
    • 那2个无需处理的模块不会出现在分析结果里(或者覆盖率被排除)
    • GWT模块能看到代码质量分析数据,但覆盖率显示为未统计(不会显示0%)
    • 5个正常模块的覆盖率和质量数据都正确显示

内容的提问来源于stack exchange,提问作者Yassine Badache

火山引擎 最新活动