JaCoCo Gradle Kotlin DSL 从违规规则中排除文件

Ada*_*ich 3 gradle jacoco gradle-plugin gradle-kotlin-dsl

我正在尝试将我的项目设置为运行 JaCoCo,如果测试覆盖率低于 80%,则构建失败。需要注意的是,我想排除一个特定的文件,但我似乎无法做到这一点。我已经在网络上搜索并阅读了大量的 Stack Overflow 答案、博客文章和插件文档,但我无法让任何东西发挥作用。它始终仍然包含我试图排除的文件。

我开始于:

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这将包括一切,而且确实如此。根据我所读到的内容,我尝试了以下变体,但没有一个起作用:

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching {
                exclude("path.to.my.class.HelloWorld")
            })
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
tasks.jacocoTestCoverageVerification {
    classDirectories.setFrom(
            sourceSets.main.get().output.asFileTree.matching {
                exclude("path.to.my.class.HelloWorld")
            }
    )
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
tasks {
    getByName<JacocoReport>("jacocoTestReport") {
        afterEvaluate {
            classDirectories.setFrom(files(classDirectories.files.map {
                fileTree(it) {
                    exclude("path.to.my.class.HelloWorld")
                }
            }))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
tasks.withType<JacocoReport> {
    classDirectories.setFrom(
        sourceSets.main.get().output.asFileTree.matching {
            exclude("path.to.my.class.HelloWorld")
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

所有这些的输出是完全相同的:

Execution failed for task ':jacocoTestCoverageVerification'.
> Rule violated for bundle OneUIBackend: instructions covered ratio is 0.6, but expected minimum is 0.8
Run Code Online (Sandbox Code Playgroud)

有谁知道如何正确执行此操作?

小智 5

对已接受的解决方案的补充(这也对我有用;对于使用 kotlin gradle dsl 的 kotlin 项目;gradle 7.2;jacoco 插件 0.8.7)

  • 如果您试图找出如何从覆盖率报告中排除类,请使用afterEvaluate {...}以下对我有用的方法:

    tasks.withType<JacocoReport> {
        afterEvaluate {
            classDirectories.setFrom(classDirectories.files.map {
                fileTree(it).matching {
                    exclude("com/**")
                }
            })
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    afterEvaluate块放入其中tasks.jacocoTestReport {...}会导致错误:

    根项目“demo”上的 Project#afterEvaluate(Action) 无法在当前上下文中执行

  • 您可以在以下位置重用classDirectories任务:jacocoTestReportjacocoTestCoverageVerification

    tasks.jacocoTestReport {
        dependsOn(tasks.test)
        finalizedBy(tasks.jacocoTestCoverageVerification)
    
        classDirectories.setFrom(classDirectories.files.map {
            fileTree(it).matching {
                exclude("com/**")
            }
        })
    }
    
    tasks.jacocoTestCoverageVerification {
        violationRules {
            rule {
                classDirectories.setFrom(tasks.jacocoTestReport.get().classDirectories)
                limit {
                    minimum = "0.78".toBigDecimal()
                }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)