我们的项目使用Gradle 3.5,jacoco 0.8.1
它有三个模块——模块A、模块B和模块C,代码覆盖率分别为50%、6%和42%,整个项目的代码覆盖率为38%。
现在我们想使用整个项目的当前代码覆盖率作为阈值,这意味着如果整个项目的代码覆盖率低于38%,则构建将失败。
我在中尝试了这个解决方案Jacobo-Gradle 中的最小码覆盖阈值
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.38
}
}
}
但失败了,这暗示模块B违反了规则,指令覆盖率为0.06,但预期为0.38,似乎只适合模块级别,而不适合整个项目级别。
我还尝试使用元素="GROUP",但似乎没有效果。(https://www.eclemma.org/jacoco/trunk/doc/api/org/jacoco/core/analysis/ICoverageNode.ElementType.html)
有人知道如何为整个项目而不是模块级别设置最小代码覆盖率阈值吗?
谢谢,
我建议在多模块构建中有一个单独的项目(模块(,用于报告整个项目。您可能也需要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
}
}
是的,我为它找到了另一个解决方案,那就是在每个模块中写限制规则,比如对于模块A,它的代码覆盖率是50%,所以在模块A的build.gradle文件中,规则如下:
// for moudle-A module
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.5
}
}
}