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




