使用 Gradle 筛选 JaCoCo 覆盖范围报告问题:相关文档:相关堆栈溢出链接:我尝试过的示例:问题:由于:Yannick Welsch我的Java/Groovy项目解决方案:build.gradle其他项目(如 Android)的自定义任务:

问题:

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

相关文档:

我已阅读以下文档:

http://www.eclemma.org/jacoco/index.html

官方 文档

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

相关堆栈溢出链接:

JaCoCo & Gradle - Filtering Options (No answer)

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

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

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

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

问题:

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


答案 1

由于:Yannick Welsch

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

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

我的Java/Groovy项目解决方案:build.gradle

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


答案 2

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

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

推荐