jacoco和gradle多模块项目的跨模块代码覆盖

Mic*_*ler 6 gradle multi-module jacoco sonarqube

我们使用gradle 3.3和jacoco工具verson 0.7.6.201602180812。我们有一个gradle多项目,如下所示:

  • 父母
    • 产品1
    • 产品2
    • 产品3
    • 内测

我们在生成test.exec文件的所有子项目中使用单元测试来测试项目源和jacoco。我们在int-test项目中还有其他集成测试,将jacoco结果添加到int-test项目中的test-exec。我们在父项目上使用sonarqube gradle插件(2.2.1)来收集SonarQube服务器v6.2的所有内容。

可以使用自己的项目中的源代码进行测试,一切运行正常:代码覆盖率在jacoco报告以及SonarQube中进行衡量。

无论是在带有测试的项目的覆盖率报告中,还是在带有类的项目中,都不会仅测量生产项目(单个过程)中源的集成测试(内部测试项目)覆盖率。

可能需要以某种方式组合顶级项目的覆盖率数据-有人知道如何做到吗?最好情况下,SonarQube仍会显示单个模块级别的覆盖范围。

编辑 这是一个小测试项目:https : //github.com/MichaelZett/coveragetest 运行
“ build smokeTest sonarqube”会导致:

  • 运行所有测试
  • 在所有子项目中生成jacoco / test.exec和test-results / test / ...文件
  • 这些在声纳尔贝解析
  • 正确测试测试项目来源的测试的覆盖率
  • 缺少测试另一个项目中的源的测试的覆盖范围

Cri*_*ian 7

如注释中所述,您必须首先合并Jacoco执行数据,然后告诉sonarqube使用该数据,而不是使用exec每个子模块生成的单个文件。

我在此处添加示例,因为接受的答案中提供的链接有些误导。它们中的大多数为您提供了不同的解决方法,以合并Jacoco报告,而不是合并您想要的执行数据。

看起来像这样:

def allTestCoverageFile = "$buildDir/jacoco/allTestCoverage.exec"

sonarqube {
    properties {
        property "sonar.projectKey", "your.org:YourProject"
        property "sonar.projectName", "YourProject"
        property "sonar.jacoco.reportPaths", allTestCoverageFile
    }
}

task jacocoMergeTest(type: JacocoMerge) {
    destinationFile = file(allTestCoverageFile)
    executionData = project.fileTree(dir: '.', include:'**/build/jacoco/test.exec')
}

task jacocoMerge(dependsOn: ['jacocoMergeTest']) {
    // used to run the other merge tasks
}

subprojects {
    sonarqube {
        properties {
            property "sonar.jacoco.reportPaths", allTestCoverageFile
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之:

  • 首先,我们为测试报告(allTestCoverageFile)定义一个全局覆盖文件输出。
  • 然后,我们需要告诉Sonarqube使用该文件(使用sonar.jacoco.reportPaths)。但是请注意,我们也必须在子项目结束时执行此操作。这是非常重要的。不要错过
  • 最后,我们创建了一个自定义任务,扩展自JacocoMerge(来自Jacoco插件的一个孵化类),它将所有项目(executionData)的所有测试覆盖率报告合并到我们的中allTestCoverageFile

如果您使用的是SonarQube 6.2之前的版本,请使用sonar.jacoco.reportPath属性


God*_*din 5

谈到 SonarQube:您可以通过使用jacoco.exec所有模块的相同位置来获取聚合报告。确保在构建之前删除该文件并将其附加到所有模块中。

只谈 Gradle:看看