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

Gradle多项目JUnit测试Jacoco覆盖率在SonarQube显示异常求助

解决多模块Gradle项目SonarQube测试覆盖率显示0%的问题

我来帮你搞定这个问题,这个场景我之前处理过——核心问题是没有正确聚合子项目的覆盖率报告,再加上SonarQube的配置路径有误,导致它找不到有效的覆盖率数据。下面是一步步的解决方案:

1. 根项目配置Jacoco聚合报告

因为你的根项目不是Java项目,不能直接apply jacoco插件,但我们可以手动创建一个聚合任务,收集所有子项目的Jacoco执行数据,生成统一的覆盖率报告。

修改根项目的build.gradle

plugins {
    id "org.sonarqube" version "2.7"
    // 根项目无需直接应用jacoco插件,子项目已经配置了
}

// 新增Jacoco聚合任务,生成根目录统一的覆盖率报告
task jacocoRootReport(type: JacocoReport) {
    // 收集所有子项目的源码和测试类
    sourceSets = subprojects.sourceSets.main
    // 收集所有子项目的Jacoco执行数据文件
    executionData = subprojects.jacocoTestReport.executionData

    reports {
        xml.enabled true
        // 生成到根项目build目录下,方便SonarQube读取
        xml.destination file("${rootProject.buildDir}/coverage-reports/coverage.xml")
        // 可选:生成HTML报告,方便本地查看聚合后的覆盖率详情
        html.enabled true
        html.destination file("${rootProject.buildDir}/coverage-reports/html")
    }

    // 确保子项目的测试和jacoco报告任务先执行
    dependsOn subprojects.test
    dependsOn subprojects.jacocoTestReport
}

// 让Sonar扫描任务依赖于聚合报告任务,保证报告生成后再扫描
sonarqube.dependsOn jacocoRootReport

repositories {
    jcenter()
}

subprojects {
    apply plugin: 'jacoco'
    apply plugin: 'java'
    apply plugin: 'eclipse'
    repositories {
        jcenter()
        maven { url 'https://repo.spring.io/snapshot' }
        maven { url 'https://repo.spring.io/milestone' }
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
        maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
    }
    jacocoTestReport {
        reports {
            xml.enabled true
            xml.destination file("${buildDir}/coverage-reports/coverage.xml")
        }
    }
    ext {
        springBootVersion = '2.1.1.RELEASE'
    }
    sourceCompatibility = 1.8
}

wrapper {
    gradleVersion = '6.0'
}

2. 修正Jenkins的SonarQube配置

你的原有配置有两个关键错误:

  • sonar.coverage.jacoco.xmlReportsPath指向的是.exec执行文件,但这个参数需要的是XML格式的覆盖率报告
  • 路径指向了根目录不存在的报告文件,现在我们通过聚合任务生成了正确的路径

更新Jenkins的Sonar参数为:

sonar.projectKey=eclipse-plugin-vogella
sonar.sources=server/com.vogella.prioritizer.server/src/main,server/com.vogella.prioritizer.server.bugzilla/src/main,server/com.vogella.prioritizer.server.issue.api/src/main
sonar.java.binaries=server/com.vogella.prioritizer.server/build/classes/java/main,server/com.vogella.prioritizer.server.bugzilla/build/classes/java/main,server/com.vogella.prioritizer.server.issue.api/build/classes/java/main
sonar.tests=server/com.vogella.prioritizer.server/src/test,server/com.vogella.prioritizer.server.bugzilla/src/test
sonar.coverage.jacoco.xmlReportsPath=${WORKSPACE}/build/coverage-reports/coverage.xml

3. 验证构建流程

在Jenkins中配置Gradle任务为:clean build sonarqube即可——因为我们已经让sonarqube任务依赖于jacocoRootReport,所以会自动先生成聚合报告,再执行Sonar扫描。

额外注意点

  • 确保所有子项目的测试任务能正常执行,生成.exec文件(聚合任务依赖这些数据)
  • 如果你的SonarQube版本是8.x以上,可以考虑用sonar.jacoco.reportPaths替代sonar.coverage.jacoco.xmlReportsPath,旧参数在Gradle 6和Sonar插件2.7版本下依然有效
  • 子项目的jacocoTestReport可以保留xml报告,也可以关闭,聚合任务主要依赖.exec文件

这样配置后,SonarQube就能读取到根目录下的聚合覆盖率报告,正确展示多模块项目的整体测试覆盖率了。

内容的提问来源于stack exchange,提问作者Jennifer Nerlich

火山引擎 最新活动