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

JaCoCo Gradle Kotlin DSL exclude file from violation rules

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

我开始于:

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}

这显然将包括所有内容,而且确实如此。我根据所读内容尝试了以下变体,但其中 none 有效:

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching {
                exclude("path.to.my.class.HelloWorld")
            })
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
tasks.jacocoTestCoverageVerification {
    classDirectories.setFrom(
            sourceSets.main.get().output.asFileTree.matching {
                exclude("path.to.my.class.HelloWorld")
            }
    )
    violationRules {
        rule {
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}
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")
                }
            }))
        }
    }
}
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")
        }
    )
}

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

Execution failed for task ':jacocoTestCoverageVerification'.
> Rule violated for bundle OneUIBackend: instructions covered ratio is 0.6, but expected minimum is 0.8

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

原来我是将排除的文件声明为类路径而不是文件路径。最终的解决方案是:

tasks.jacocoTestReport {
    dependsOn(tasks.test)
    finalizedBy(tasks.jacocoTestCoverageVerification)
    classDirectories.setFrom(
            sourceSets.main.get().output.asFileTree.matching {
                exclude("path/to/my/file/HelloWorld*")
            }
    )
}
tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching {
                exclude("path/to/my/file/HelloWorld*")
            })
            limit {
                minimum = "0.8".toBigDecimal()
            }
        }
    }
}

可以排除的更清楚一点:

tasks.jacocoTestReport {
    classDirectories.setFrom(
        files(classDirectories.files.map {
            fileTree(it) {
                exclude(
                    "com/example/integration/**",
                    "com/example/application/*Ext*"
                )
            }
        })
    )
}