使用Gradle筛选JaCoCo覆盖率报告


113

问题:

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

相关文件:

我已阅读以下文档:

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

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

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

题:

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


第三方选项(我是FD的创始人):如果将报告上载到Codecov,则可以在产品功能部分忽略所有想要的文件。谢谢。
史蒂夫·匹克

@StevePeak因此,您可以packages使用Codecov?另外,我看到了Github,有关Android支持的内容,我也看到了Java。我仍然必须将所有报告发送给您,然后再过滤之后再过滤之前。
Jared Burrows

您可以基于不想包含的任何文件的regexp方法进行过滤。Jacoco报告支持所有Java。仅在Codecov上的事实起作用后进行过滤。它将记住您的过滤器并将其应用于以后的所有报告。谢谢!
史蒂夫·匹克

6
我很好奇; 什么是excludes从官方文档,其实这样做呢?几乎没有用吗?
Vivin Paliath,2015年

excludes不是覆盖任务,而是测试任务。它排除了JaCoCo无法检测文件并因此记录覆盖率的情况。如果您不想记录某些类的覆盖率,或者由于与其他检测代理有某些冲突而无法记录,或者因为您预先插入了类,则可以使用此方法。这不会将类别排除在报告之外,特别是在最后提到的情况下,这将是一个可怕的想法。
吸血鬼

Answers:


115

感谢Yannick Welsch

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

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

资料来源: 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/**'])
        })
    }
}

如您所见,我成功地添加了更多内容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


1
@BradPitcher没问题!我花了一段时间才找到正确的答案。似乎太“骇人”了。我希望他们提出更好的方法。
Jared Burrows,2015年

那么,如果我只想从包中排除一个类,那么正确的方法是什么?
Pedro Henrique

2
类似于:exclude: ['**/*Test*.*'])
Jared Burrows

1
jacocoTestReport只适用于jacocojava插件。这不适用于Android。请在此处查看我的android 仓库
Jared Burrows

9
classDirectories =此警告的结果。The JacocoReportBase.setClassDirectories(FileCollection) method has been deprecated. This is scheduled to be removed in Gradle 6.0. Use getClassDirectories().from(...)。展示与Gradle 6.0兼容的解决方案将是很棒的。

61

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

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

2
或简单地使用classDirectories.from(添加到列表而不是覆盖列表)
Mohamed El-Beltagy

1
[]之后exclude: ,您将添加包括几个路径。
WesternGun

太好了,我使用gradle 6.0.1,这个解决方案对我来说很有效。
达根

14

对我来说,与

test {
  jacoco {
    excludes += ['codeeval/**',
                 'crackingthecode/part3knowledgebased/**',
                 '**/Chapter7ObjectOrientedDesign**',
                 '**/Chapter11Testing**',
                 '**/Chapter12SystemDesignAndMemoryLimits**',
                 'projecteuler/**']
  }
}

如文档 https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62所述,最初被问到,所以答案是:

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

excludes = ["projecteuler/**"]

要么

excludes += ["projecteuler/**"]

excludes = ["**/projecteuler/**"]

排除包裹 *.projecteuler.*

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


1
这似乎为班级提供了0%的覆盖率,而不是完全将其省略。我正在使用JaCoCi 0.8.5和Gradle 6.0
tschumann '19

这是告诉jacoco不要干预某些类的正确方法,而其他方法仅影响报告部分。
布莱斯

9

对于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/**'
                    ]
            )
        }))
    }
}

6

是ANT中此问题的解决方案。通过在jacocoTestReport任务下添加以下内容,可以使其适应gradle 。尽管jacoco并未对此进行真正的记录,但这似乎是目前筛选测试结果的唯一方法。

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

好,谢谢您确认我的发现是正确的!我希望它们将来使过滤变得更容易,或者只是简单地记录如何使用Gradle进行过滤。
Jared Burrows 2015年

有什么方法可以将源集排除在jacoco报告中?我要排除generated/java/而不是中的所有源文件main/java
阿米尔·帕萨扎德

4

这已经有一段时间了,但是我只是碰到了这一点。我正在为所有需要的排除而苦苦挣扎。我发现这对我来说要简单得多。如果遵循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
                     ]
        )
    }
}

刚刚再次看到了这一点。这是直接从工作配置中获取的。也许您的Gradle和Jacoco版本与我的版本不同。抱歉。
兰迪

4

以下代码也将类别从覆盖范围验证中排除:

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

2

一些评论提到了弃用警告。解决只是使用吸气剂:

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

2

为了过滤jacoco报告,需要在两个任务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)
            })
        }

        ...
    }



0

在gradle.properties文件中的配置下面添加

coverageExcludeClasses=["com.example.package.elasticsearch.*", "com.example.package2.*",]


coverageExcludeClasses不会出现在JaCoCo /摇篮的事情
格斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.