gpt4 book ai didi

java - Gradle 多模块项目中 sonarqube 6.2 的覆盖率计算错误

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:21 25 4
gpt4 key购买 nike

我目前正在使用具有良好覆盖率的 gradle 多模块 java 项目和带有 sonarJava 插件 4.10.0.1026 的 sonarqube 6.2。我正在使用 Gradle 4.0.1、sonarqube 插件 2.5 和 jacoco 0.7.9!代码是java 8。

由于 API 驱动开发,API 测试在 API 项目中编写为抽象测试,并从为测试提供构造函数的实现项目中调用。

在 sonarqube 服务器上分析项目时,实现项目的覆盖率被正确测量,但 IMPL 项目测试中包含的 API 项目的覆盖率为 0.0%。这些项目的覆盖率结果将被忽略。

当简单地使用 jacoco 插件时,我能够得到相同的行为。在做了一些研究之后,我找到了一个解决方案来获得正确的 jacoco 报告:

task codeCoverageReport(type: JacocoReport) {
description "Creates a unified JaCoCo test report for the project."

// Gather execution data from all subprojects
// (change this if you e.g. want to calculate unit test/integration test coverage separately)
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")

// Add all relevant sourcesets from the subprojects
subprojects.each {
sourceSets it.sourceSets.main
}

reports {
xml.enabled true
html.enabled true
html.destination file("${buildDir}/reports/jacoco")
csv.enabled false
}
}

// always run the tests before generating the report
codeCoverageReport.dependsOn {
subprojects*.test
}

我目前的结果如下:

贾科科:

  1. JaCoCo(codeCoverageReport-任务)
    • 73% 的指令覆盖率
    • 91% 的分支机构覆盖率
  2. Sonar
    • 43.1% 的线路覆盖率(计算中只考虑了约 30% 的线路!)
    • 82.1% 的条件覆盖率(仅覆盖约 20% 的条件!)

所以 Sonar 中的覆盖结果是不可用的。我读过一篇文章,宣布“sonar.jacoco.reportPaths”参数从 sonar 6.2 开始,我认为 java-analyzer 4.4 或某物。像那样。将此参数添加到我的 gradle 构建脚本时,该脚本不再编译。通过 Sonar 项目管理将 jacoco .exec 文件添加到 Sonar 时,没有任何变化。

如果有一种方法可以管理 Sonar 来计算正确的覆盖范围,那就太好了。

最佳答案

谢谢@Lance Java!他促使我采用比下面的解决方案更清洁的解决方案。如果所有子项目都有 jacoco 报告,这也适用。如果像我一样只有少数项目的报告,那么原始解决方案似乎效果更好。

apply plugin: 'base'
apply plugin: 'org.sonarqube'
[...]
allprojects {
apply plugin: 'java'
apply plugin: "jacoco"
[...]
test {
[...]
jacoco {
append=true
}
}
}
[...]
task jacocoMerge( type: JacocoMerge ) {
dependsOn( subprojects.jacocoTestReport.dependsOn )
mustRunAfter( subprojects.jacocoTestReport.mustRunAfter )
destinationFile = file( "${buildDir}/jacoco/mergedTests.exec" )
executionData = files( subprojects.jacocoTestReport.executionData )
.filter { jacocoReportFile -> jacocoReportFile.exists() }
}
tasks.sonarqube.dependsOn jacocoMerge
[...]
sonarqube {
properties {
[...]
property "sonar.jacoco.reportPath", "${buildDir}/jacoco/*.exec"
}
}

原始答案:

设法将正确的覆盖数据传输到 Sonar 需要一些时间。有多个问题需要解决。有时 Sonar 会忘记类中的 jacoco 更改,因此测试需要参数:

append=true

这并没有完成所有工作。收集跨项目覆盖率仍然存在问题。因此,最好的解决方案是强制 jacoco 将覆盖率数据写入单个 .exec 文件并将其交给 Sonar 。

最终的解决方案是这样的:

apply plugin: 'base'
apply plugin: 'org.sonarqube'
[...]
allprojects {
apply plugin: 'java'
apply plugin: "jacoco"
[...]
test {
[...]
jacoco {
append=true
destinationFile = file( "${rootProject.buildDir}/jacoco/jacocoTest.exec" )
}
}
}
[...]
sonarqube {
properties {
[...]
property "sonar.jacoco.reportPath", "${buildDir}/jacoco/*.exec"
}
}

现在 Sonar 为我的项目提供了正确的覆盖数据。添加一些额外的测试后,结果如下:

  • 总覆盖率 91.6%
  • 线路覆盖率 91.7%
  • 条件覆盖率 91.3%
  • 未覆盖的第 36 行
  • 未覆盖条件 11
  • 覆盖 433 行
  • 单元测试 1,114
  • 单元测试错误 0
  • 单元测试失败 0
  • 跳过单元测试 0
  • 单元测试成功率 (%) 100.0%
  • 单元测试时长 4 秒

希望这对你们中的一些人有帮助...;)

关于java - Gradle 多模块项目中 sonarqube 6.2 的覆盖率计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44980205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com