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

我目前正在使用具有良好覆盖率的gradle多模块Java项目和sonarqube 6.2与sonarJava插件4.10.0.1026.我正在使用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
}

我目前的结果如下:

JaCoCo:

> JaCoCo(codeCoverageReport-Task)

> 73%的教学覆盖率
> 91%的分行覆盖率

>声纳

> 43.1%的线覆盖率(在计算中只考虑约30%的线!)
> 82.1%条件覆盖率(仅涵盖约20%的条件!)

因此声纳的覆盖率结果不可用.我已经阅读了一篇帖子,宣布从声纳6.2开始宣布“sonar.jacoco.reportPaths”参数,我认为java-analyzer 4.4或者……像那样.将此参数添加到我的gradle构建脚本时,脚本不再编译.通过声纳项目管理将jacoco .exec文件添加到声纳时没有任何变化.

如果有办法管理声纳来计算正确的覆盖范围,那就太好了.

解决方法:

如果您的测试与您希望覆盖率报告的源不同,那么您需要设置additionalSourceDirs和additionalClassDirs.例如:

evaluationDependsOn ':foo' 
task codeCoverageReport(type: JacocoReport) {
    additionalSourceDirs.add project(':foo').sourceSets.main.java.sourceDirectories
    additionalClassDirs.add project(':foo').sourceSets.main.output.classesDirs
    // etc
} 
上一篇:c# – Sonar未分析的某些文件“文件中遇到无效字符”


下一篇:如何衡量每个开发人员的Java代码单元测试覆盖率?