Filter JaCoCo coverage reports with Gradle
Thanks to, Yannick Welsch
:
After searching Google, reading the Gradle docs and going through older StackOverflow posts, I found this answer on the Official gradle forums!
jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: 'com/blah/**') })) }}
Source: https://issues.gradle.org/browse/GRADLE-2955
For older gradle versions < 5.x may need to useclassDirectories = files(classDirectories.files.collect {
instead of classDirectories.setFrom
Solution to my build.gradle
for Java/Groovy projects:
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/**']) }) }}
As you can see, I was successfully able to add more to exclude:
in order to filter a few packages.
Source: https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle
Custom tasks for other projects such as 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/**']) }) }}
For Gradle version 5.x, the classDirectories = files(...)
gives a deprecation warning and does not work at all starting from Gradle 6.0This is the nondeprecated way of excluding classes:
jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: 'com/exclude/**') })) }}
for me, it's fine working with
test { jacoco { excludes += ['codeeval/**', 'crackingthecode/part3knowledgebased/**', '**/Chapter7ObjectOrientedDesign**', '**/Chapter11Testing**', '**/Chapter12SystemDesignAndMemoryLimits**', 'projecteuler/**'] }}
as stated out in documentationhttps://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 and initally askedso the answer is:
so if you ask me: it's not a question of
excludes = ["projecteuler/**"]
or
excludes += ["projecteuler/**"]
but
excludes = ["**/projecteuler/**"]
to exclude a package *.projecteuler.*
and test {}
on project level, not nested in jacocoTestReport