![]() |
听话的黄豆 · 读取hdf文件- ...· 5 月前 · |
![]() |
气势凌人的大葱 · 在adf中将字符串转换为星号-腾讯云开发者社 ...· 7 月前 · |
![]() |
精明的手套 · jquery获取mac地址_mob649e8 ...· 1 年前 · |
![]() |
神勇威武的西瓜 · java截取字符串前六位..._mob64c ...· 1 年前 · |
![]() |
内向的炒面 · CSS中zoom和scale的差异_51CT ...· 1 年前 · |
问题:
我有一个带有 贾科科 的项目,我希望能够过滤某些类和/或包。
相关文件:
我阅读了下列文件:
官方 贾科科 站点: http://www.eclemma.org/jacoco/index.html
Github
贾科科
,致力于报道:
https://github.com/jacoco/jacoco/wiki/FilteringOptions
https://github.com/jacoco/jacoco/issues/14
相关的StackOverflow链接:
JaCoCo &分级过滤选项 (无答案)
使用Sonarrunner和Gradle从Jacoco报告中排除包 (不使用 声纳 )
JaCoCo -从报表中排除JSP (它似乎适用于 maven ,我使用的是 gradle )
Maven Jacoco配置-将类/包从报告中排除在外 (它似乎适用于 maven ,我使用的是 gradle )
JaCoCo级插件排除 (无法让它工作)
Gradle Jacoco覆盖率报告包括配置中排除的类。
(似乎非常接近,它使用了
doFirst
,对我不起作用)
我尝试过的例子:
apply plugin: 'java'
apply plugin: 'jacoco'
buildscript {
repositories {
mavenCentral()
jcenter()
repositories {
jcenter()
jacocoTestReport {
reports {
xml {
enabled true // coveralls plugin depends on xml format report
html {
enabled true
test {
jacoco {
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpFile = file("$buildDir/jacoco/classpathdumps")
excludes = ["projecteuler/**"] // <-- does not work
// excludes = ["projecteuler"]
}
问题:
如何在生成 贾科科 覆盖率报告时排除某些包和类?
多亏了,
Yannick Welsch
在搜索了Google、阅读了Gradle文档并浏览了一些旧的StackOverflow帖子之后,我在官方的 gradle 论坛上找到了这个答案!
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/blah/**')
}
资料来源: https://issues.gradle.org/browse/GRADLE-2955
对于较早的分级版本,< 5.x可能需要使用
classDirectories = files(classDirectories.files.collect {
而不是
classDirectories.setFrom
我的
build.gradle
/Groovy项目的解决方案:
apply plugin: 'java'
apply plugin: 'jacoco'
jacocoTestReport {
reports {
xml {
enabled true // coveralls plugin depends on xml format report
html {
enabled true
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it,
exclude: ['codeeval/**',
'crackingthecode/part3knowledgebased/**',
'**/Chapter7ObjectOrientedDesign**',
'**/Chapter11Testing**',
'**/Chapter12SystemDesignAndMemoryLimits**',
'projecteuler/**'])
}
如您所见,为了过滤几个包,我成功地向
exclude:
添加了更多内容。
资料来源: https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle
其他项目(如Android)的自定义任务:
apply plugin: 'jacoco'
task jacocoReport(type: JacocoReport) {
reports {
xml {
enabled true // coveralls plugin depends on xml format report
html {
enabled true
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it,
exclude: ['codeeval/**',
'crackingthecode/part3knowledgebased/**',
'**/Chapter7ObjectOrientedDesign**',
'**/Chapter11Testing**',
'**/Chapter12SystemDesignAndMemoryLimits**',
'projecteuler/**'])
}
这里
是ANT中解决这一问题的一个方法。这可以通过在
jacocoTestReport
任务下添加以下内容来适应gradle。虽然jacoco并没有对此进行真正的记录,但它似乎是目前筛选测试结果的唯一方法。
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'excluded/files/**')
}
这事已经有一段时间了,但我只是偶然发现了这个。我在为所有需要的排挤而挣扎。我发现这对我来说更简单。如果您遵循Maven项目布局样式/src/main/java和/src/test/java,只需将 buildDir/classes/main 放在 classDirectories 配置中,如下所示:
afterEvaluate {
jacocoTestReport {
def coverageSourceDirs = ['src/main/java']
reports {
xml.enabled false
csv.enabled false
html.destination "${buildDir}/reports/jacocoHtml"
sourceDirectories = files(coverageSourceDirs)
classDirectories = fileTree(
dir: "${project.buildDir}/classes/main",
excludes: [
//whatever here like JavaConfig etc. in /src/main/java
}
对我来说,和他一起工作很好
test {
jacoco {
excludes += ['codeeval/**',
'crackingthecode/part3knowledgebased/**',
'**/Chapter7ObjectOrientedDesign**',
'**/Chapter11Testing**',
'**/Chapter12SystemDesignAndMemoryLimits**',
'projecteuler/**']
}
正如 plugin.html#N16E62 文档中所指出的,并且在最初被问到的情况下,答案是:
所以如果你问我:这不是一个
excludes = ["projecteuler/**"]
或
excludes += ["projecteuler/**"]
但
excludes = ["**/projecteuler/**"]
若要排除包
*.projecteuler.*
和
test {}
在项目级别上,而不是嵌套在
jacocoTestReport
中。
下面的代码也将类排除在覆盖率验证之外:
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: "${project.buildDir}/classes/main",
exclude: ['**/packagename/**'])
}
对于Gradle版本5.x,
classDirectories = files(...)
给出了一个弃用警告,并且从Gradle 6.0开始根本不起作用--这是排除类的不受欢迎的方式:
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/exclude/**')
}
在gradle.properties文件中添加下面的配置
coverageExcludeClasses=["com.example.package.elasticsearch.*", "com.example.package2.*",]
一些评论提到了反对意见的警告。要解决问题,只需使用getter:
afterEvaluate {
getClassDirectories().from(files(classDirectories.files.collect {
fileTree(dir: it, exclude: 'com/blah/**')
}
对于Gradle6使用如下所示的内容,因为他们生成了
classDirectories as final
,所以我们不能重新分配它,但是有一个setter方法可以使用
classDirectories.setFrom
。
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
html.destination file("$buildDir/reports/jacoco")
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: ['**/server/**',
'**/model/**',
'**/command/**'
}
为了在
jacocoTestReport
和
jacocoTestCoverageVerification
中进行过滤,需要在两个任务中进行排除。
样本代码
def jacocoExclude = ['**/example/**', '**/*Module*.class']
jacocoTestReport {
afterEvaluate {
getClassDirectories().setFrom(classDirectories.files.collect {
fileTree(dir: it, exclude: jacocoExclude)
jacocoTestCoverageVerification {
afterEvaluate {
getClassDirectories().setFrom(classDirectories.files.collect {
fileTree(dir: it, exclude: jacocoExclude)
}
对我来说,我必须排除在两个地方
jacocoTestReport {
dependsOn test // tests are required to run before generating the report
afterEvaluate {
excludedClassFilesForReport(classDirectories)
jacocoTestCoverageVerification {
afterEvaluate {
excludedClassFilesForReport(classDirectories)
private excludedClassFilesForReport(classDirectories) {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: [
'com/test/a/config/**',
'com/test/b/constant/**',
'com/test/c/MainApp.class'
}
Gradle 6.8.3抛出一个异常。
Cannot set the value of read-only property 'classDirectories' for task ':jacocoTestReport' of type org.gradle.testing.jacoco.tasks.JacocoReport.
所以我找到了一种方法来解决这个问题
classDirectories.setFrom(
fileTree(dir: "build/classes/java/main")
.filter({file -> !file.path.contains('/dir1')})
.filter({file -> !file.path.contains('/dir2')})
.filter({file -> !file.path.contains('/dir3')})
)
对于Kotlin用户,下面是我使用的内容(第6.7级)
build.gradle.kts
tasks.jacocoTestReport {
// tests are required to run before generating the report
dependsOn(tasks.test)
// print the report url for easier access
doLast {
println("file://${project.rootDir}/build/reports/jacoco/test/html/index.html")
classDirectories.setFrom(
files(classDirectories.files.map {
fileTree(it) {
exclude("**/generated/**", "**/other-excluded/**")
}
如下所示: https://github.com/gradle/kotlin-dsl-samples/issues/1176#issuecomment-610643709
对于在Kotlin DSL中寻找这个答案的人来说,这里是:
val jacocoExclude = listOf("**/entities/**", "**/dtos/**")
jacocoTestReport {
reports {
xml.isEnabled = true
csv.isEnabled = false
classDirectories.setFrom(classDirectories.files.map {
fileTree(it).matching {
exclude(jacocoExclude)
test {
useJUnitPlatform()
systemProperty("gradle.build.dir", project.buildDir)
finalizedBy(jacocoTestReport)
extensions.configure(JacocoTaskExtension::class) {
excludes = jacocoExclude
}
对于那些仍然绞尽脑汁从覆盖率报告中过滤某些包的人来说,下面是使用最近的库为我工作的配置。
Build tool: Gradle 6.5 (also tried for 6.7)
Coverage Tool: Jacoco 0.8.5
需要考虑的事情/理由
afterScript
excludes
param而不是
exclude
。这两种方法都很好
.class
文件,而不是
.java
文件。
classDirectories
是一个只读字段,因此,请使用
classDirectories.setFrom
jacocoTestReport {
doLast {
println("See report file://${project.rootDir}/build/reports/jacoco/test/html/index.html")
excludedClassFilesForReport(classDirectories)
jacocoTestCoverageVerification {
excludedClassFilesForReport(classDirectories)
violationRules {
rule {
limit {
minimum = 0.55
private excludedClassFilesForReport(classDirectories) {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'**/common/apigateway/*.class',
'**/common/*/client/*Client*.class',
'**/configuration/*ClientConfiguration.class',
'**/model/search/*SearchService.class'
check.dependsOn jacocoTestCoverageVerification
以下是我在Jacoco 0.8.5的Gradle中的工作配置:
def jacocoExclusions = [
'**/config/*Config.class',
'**/config/*Advice.class',
'**/security/*AuthorityRoles.class',
'**/*Application.class'
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
html.destination file("${buildDir}/reports/jacocoHtml")
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: jacocoExclusions
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: jacocoExclusions
violationRules {
rule {
excludes = jacocoExclusions