使用Gradle过滤JaCoCo覆盖报告

问题:

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

相关文件:

我已阅读以下文件:

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

官方jacoco文档gradle : 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 – 过滤选项 (无答案)

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

JaCoCo – 从报告中排除JSP (这似乎为maven工作,我使用gradle )

Maven的Jacococonfiguration – 排除报告不工作的类/包 (这似乎为maven工作,我使用gradle )

JaCoCo gradle插件排除 (不能得到这个工作)

Gradle Jacoco – 覆盖报告包括configuration中排除的类 (看起来非常接近,它使用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覆盖率报告时排除某些包和类?

感谢Yannick Welsch

search谷歌后,阅读Gradle文档,并通过较旧的StackOverflowpost,我在官方gradle论坛上find了这个答案!

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

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

我的build.gradle for Java / Groovy项目的解决scheme:

 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

对我来说,这很好

 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

这已经有一段时间了,但我碰到了这个。 我正在努力处理所有需要的排除。 我发现这对我来说简单得多。 如果您遵循Maven项目布局样式/ src / main / java和/ src / test / java,则只需将buildDir / classes / main放入classDirectoriesconfiguration中即可:

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

这是ANT的这个问题的解决scheme。 这可以通过在jacocoTestReport任务下添加以下内容来适应jacocoTestReport 。 尽pipejacoco并没有真正logging这个,但它似乎是现在过滤testing结果的唯一方法。

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