Jacoco Gradle在整个项目级别(而非模块级别)的最小代码覆盖阈值

Minimum code coverage threshold in Jacoco Gradle on the whole project level(not on the module level)

我们的项目使用的是Gradle 3.5,jacoco 0.8.1

它有3个模块-模块A,模块B和模块C,其代码覆盖率分别为50%,6%和42 %,整个项目的代码覆盖率是38%。

现在,我们要使用整个项目的当前代码覆盖率作为阈值,这意味着如果整个项目的代码覆盖率较小超过38%,构建将失败。

我在Jacoco Gradle

1
2
3
4
5
6
7
8
jacocoTestCoverageVerification {
violationRules {
    rule {
        limit {
            minimum = 0.38
        }
    }
}

中尝试了"最小代码覆盖率阈值"中的解决方案,但失败了,它提示模块B违反了规则,指令覆盖率是0.06,但是期望值是0.38,似乎只适合模块级别,而不适合整个项目级别。

我也尝试使用element = \\'GROUP \\',但是似乎没有效果。( https://www.eclemma.org/jacoco/trunk/doc/api/org/jacoco/core/analysis/ICoverageNode.ElementType.html)

任何人都知道如何为整个项目,而不是模块级别?

谢谢,


是的,我找到了另一种解决方案,即在每个模块中写入限制规则,例如对于模块A,其代码覆盖率为50%,因此在模块A中的build.gradle文件中,该规则如下:

1
2
3
4
5
6
7
8
9
// for moudle-A module
jacocoTestCoverageVerification {
violationRules {
    rule {
        limit {
            minimum = 0.5
        }
    }
}


我建议您在多模块构建中包含一个单独的项目(模块),以报告整个项目。您可能还需要JacocoMerge任务。假设a,b和c是Java项目。例如

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def javaProjects = [':a', ':b', ':c']
javaProjects.each {
   project(it) {
      apply plugin: 'java'
      apply plugin: 'jacoco'
   }
}
project(':report') {
    FileCollection execData = files(javaProjects.collect { project(it).tasks.withType(Test).jacoco.destinationFile })
    FileCollection sourceDirs = files(javaProjects.collect { project(it).sourceSets.main.java.srcDirs })
    FileCollection classDirs = files(javaProjects.collect { project(it).sourceSets.main.java.output.classesDirs })
    def testTasks = javaProjects.collect { project(it).tasks.withType(Test)}


   task jacocoMerge(type: JacocoMerge) {
      dependsOn testTasks
      executionData execData
      jacocoClasspath = classDirs
   }
   task coverageVerification(type: JacocoCoverageVerification) {
      dependsOn jacocoMerge
      executionData jacocoMerge.destinationFile
      sourceDirectories srcDirs
      classDirectories classDirs
      violationRules.rule.limit.minimum = 0.38
   }
   task jacocoReport(type: JacocoReport) {
      dependsOn jacocoMerge
      executionData jacocoMerge.destinationFile
      sourceDirectories srcDirs
      classDirectories classDirs
   }
}