使用 Gradle 过滤 JaCoCo 覆盖率报告

新手上路,请多包涵

问题:

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

相关文档:

我已阅读以下文档:

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

gradle 的官方 jacoco 文档 https ://gradle.org/docs/current/userguide/jacoco_plugin.html

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

相关 StackOverflow 链接:

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

使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包(不使用 声纳

JaCoCo - 从报告中排除 JSP (它似乎适用于 maven ,我正在使用 gradle

Maven Jacoco 配置 - 从报告中排除类/包不起作用(它似乎适用于 maven ,我正在使用 gradle

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"]
        }
    }
}

问题:

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

原文由 Jared Burrows 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

感谢, Yannick Welsch

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

 jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/blah/**')
        }))
    }
}

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

对于较旧的 gradle 版本 < 5.x 可能需要使用 classDirectories = files(classDirectories.files.collect { 而不是 classDirectories.setFrom

我的 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/**'])
        })
    }
}

如您所见,我成功地向 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/**'])
        })
    }
}

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

原文由 Jared Burrows 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 Gradle 版本 5.x, classDirectories = files(...) 给出弃用警告并且从 Gradle 6.0 开始根本不起作用这是排除类的非弃用方式:

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

原文由 uwe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏