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

时间:2018-07-17 02:27:28

标签: gradle code-coverage jacoco

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

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

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

我尝试了 Minimum code coverage threshold in Jacoco Gradle

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

任何人都知道如何为整个项目而不是模块级别设置最小代码覆盖率阈值吗?

谢谢

2 个答案:

答案 0 :(得分:0)

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

例如:

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
   }
} 

答案 1 :(得分:0)

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

// for moudle-A module
jacocoTestCoverageVerification {
violationRules {
    rule {
        limit {
            minimum = 0.5
        }
    }
}