使用Gradle过滤JaCoCo覆盖率报告

Jar*_*ows 86 java unit-testing code-coverage gradle jacoco

问题:

我有一个项目,我希望能够过滤某些类和/或包.

相关文档:

我已阅读以下文档:

官方网站: http ://www.eclemma.org/jacoco/index.html

关于官方文档: https :

官方 Github问题,致力于报道: https ://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

相关的StackOverflow链接:

JaCoCo&Gradle - 过滤选项(无答案)

使用Sonarrunner和Gradle(不使用)从Jacoco报告中排除软件包

JaCoCo - 从报告中排除JSP(它似乎适用于,我使用)

Maven Jacoco配置 - 从报告中排除类/包不工作(它似乎适用于,我使用)

JaCoCo gradle插件排除(无法使其工作)

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"]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

题:

如何在生成覆盖率报告时排除某些包和类?

Jar*_*ows 96

谢谢,Yannick Welsch:

在搜索Google,阅读Gradle文档并浏览旧的StackOverflow帖子后,我在官方论坛上找到了这个答案!

jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/blah/**')
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源: https ://issues.gradle.org/browse/GRADLE-2955

build.gradle的Java/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/**'])
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我成功地添加了更多内容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/**'])
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源: https ://github.com/jaredsburrows/android-gradle-java-app-template/blob/master/gradle/quality.gradle#L59

  • `classDirectories =` 会导致此警告。`JacocoReportBase.setClassDirectories(FileCollection) 方法已被弃用。这计划在 Gradle 6.0 中删除。使用 getClassDirectories().from(...)`。如果能展示一个与 Gradle 6.0 兼容的解决方案那就太好了。 (18认同)
  • 使用此配置获取“无法设置 org.gradle.testing.jacoco.tasks.JacocoReport 类型的任务 ':jacocoTestReport' 的只读属性 'classDirectories' 的值”。使用 gradle 5.6 和 Java 8 (3认同)
  • @BradPitcher 没问题!我花了一段时间才找到正确的答案。它看起来很“hackish”。我希望他们能想出更好的方法。 (2认同)
  • 类似:`exclude: ['**/*Test*.*'])` (2认同)
  • `jacocoTestReport` 仅适用于 `jacoco` 和 `java` 插件。这不适用于安卓。请在此处查看我的 android 仓库:https://github.com/jaredsburrows/android-gradle-java-template/blob/master/common.gradle#L160 (2认同)

uwe*_*uwe 16

对于Gradle 5.0版和更高版本,会classDirectories = files(...)给出弃用警告。这是不推荐使用的排除类的方法:

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/exclude/**')
        }))
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者简单地使用 classDirectories.from (附加到列表而不是覆盖列表) (4认同)
  • 您将在“exclude:”后面添加“[]”以包含多个路径。 (2认同)

Ema*_*rco 16

对于 Kotlin 用户,这是我使用的(gradle 6.7)

构建.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/**")
            }
        })
    )
}
Run Code Online (Sandbox Code Playgroud)

如此处建议的: https: //github.com/gradle/kotlin-dsl-samples/issues/1176#issuecomment-610643709


小智 15

对于 Gradle6 使用类似下面的东西,因为他们做了classDirectories as final,我们不能重新分配它,但是存在classDirectories.setFrom一个可以使用的 setter 方法

    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/**'
                    ]
            )
        }))
    }
}
Run Code Online (Sandbox Code Playgroud)


chi*_*.de 13

对我来说,这很好用

test {
  jacoco {
    excludes += ['codeeval/**',
                 'crackingthecode/part3knowledgebased/**',
                 '**/Chapter7ObjectOrientedDesign**',
                 '**/Chapter11Testing**',
                 '**/Chapter12SystemDesignAndMemoryLimits**',
                 'projecteuler/**']
  }
}
Run Code Online (Sandbox Code Playgroud)

如文档 https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62中所述,并且最初询问的答案如下:

所以如果你问我:这不是问题

excludes = ["projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)

要么

excludes += ["projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)

excludes = ["**/projecteuler/**"]
Run Code Online (Sandbox Code Playgroud)

排除包裹 *.projecteuler.*

test {}在项目层面,而不是在嵌套jacocoTestReport

  • 这似乎使类的覆盖率为 0%,而不是完全忽略它们。我正在使用 JaCoCi 0.8.5 和 Gradle 6.0 (2认同)

小智 10

为了在 jacoco 报告中进行过滤,需要在两个任务jacocoTestReportjacocoTestCoverageVerification.

示例代码

    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)
            })
        }

        ...
    }



Run Code Online (Sandbox Code Playgroud)


小智 7

对于那些仍然绞尽脑汁从覆盖率报告中过滤某些包的人来说,这里是适合我使用最新库的配置。

   Build tool: Gradle 6.5 (also tried for 6.7)
   Coverage Tool: Jacoco 0.8.5
Run Code Online (Sandbox Code Playgroud)

需要考虑的事项/理由

  • afterScript不需要
  • 需要排除两次,一次用于报告生成和覆盖率验证
  • intellij IDE 建议使用excludesparam 而不是exclude. 两者都可以正常工作
  • 提供正则表达式时,请确保提供.class文件而不是.java文件。
  • Post Gradle 5classDirectories是一个只读字段,因此,使用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
Run Code Online (Sandbox Code Playgroud)


And*_*gno 6

是ANT中此问题的解决方案.这可以通过在jacocoTestReport任务下添加以下内容来适应.尽管jacoco没有真正记录这一点,但它似乎是目前过滤测试结果的唯一方法.

afterEvaluate {
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it, exclude: 'excluded/files/**')
    })
}
Run Code Online (Sandbox Code Playgroud)


Ran*_*ndy 5

这已经有一段时间了,但我刚刚遇到了这个。我正在为所有需要的排除而苦苦挣扎。我发现这对我来说要简单得多。如果您遵循 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
                     ]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)


er-*_*han 5

下面的代码也从覆盖率验证中排除了类:

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: "${project.buildDir}/classes/main",
                    exclude: ['**/packagename/**'])
        })
    }
}
Run Code Online (Sandbox Code Playgroud)


sbz*_*oom 5

对于那些在 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
    }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

52296 次

最近记录:

6 年,1 月 前