首页 > 解决方案 > Jacoco Gradle 在整个项目级别(不是在模块级别)的最小代码覆盖率阈值

问题描述

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

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

现在我们想以整个项目当前的代码覆盖率作为阈值,也就是说如果整个项目的代码覆盖率低于 38%,构建就会失败。

在 Jacoco Gradle 中尝试了最小代码覆盖率阈值中的解决方案

jacocoTestCoverageVerification {
violationRules {
    rule {
        limit {
            minimum = 0.38
        }
    }
}

但是失败了,提示module-B违规,指令覆盖率是0.06,而expect是0.38,看来只适合模块级别,不适合整个项目级别。

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

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

谢谢,

标签: gradlecode-coveragejacoco

解决方案


我建议在你的多模块构建中有一个单独的项目(模块)来报告整个项目。你可能也需要这个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
   }
} 

推荐阅读