Minimum code coverage threshold in Jacoco Gradle
In an Android application this configuration works:
project: build.gradle
buildscript {
repositories {
google()
jcenter()
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
classpath "com.android.tools.build:gradle:3.1.4"
classpath "org.jacoco:org.jacoco.core:0.8.2"
}
}
app: build.gradle
ext.jacoco_version = '0.8.2'
def configDir = "${project.rootDir}/config"
def reportDir = "${project.buildDir}/reports"
def mainSrc = "$project.projectDir/src/main/java"
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
def debugTree = fileTree(dir: "$project.buildDir/intermediates/classes/debug", excludes: fileFilter)
//Jacoco jacocoTestReport
apply plugin: 'jacoco'
jacoco.toolVersion = jacoco_version
task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
reports {
xml.enabled = false
html.enabled = true
}
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = fileTree(dir: project.buildDir, includes: [
'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
])
}
task jacocoTestCoverageVerification(type: JacocoCoverageVerification, dependsOn: 'jacocoTestReport') {
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec")
violationRules {
failOnViolation = true
rule {
limit {
minimum = 0.7
}
}
}
}
We can execute it in commandline with:
./gradlew jacocoTestCoverageVerification
I used gradle wrapper 4.4.
The feature is now available. You simply need to apply the Gradle JaCoCo plugin and define coverage verification like this:
apply plugin: 'jacoco'
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.7
}
}
}
}
// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification
The last line is very important as your build would otherwise not fail unless you explicitly run the jacocoTestCoverageVerification
task.
More information on the kind of checks you may add is in the documentation of the plugin.
Gradle Jacoco Plugin by default will test Instruction coverage with below code:
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.85
}
}
}
}
I had the requirement to test Line and Branch Coverage. In order to mention this to Jacoco, we will have to use Counter. Counter can have various values like: INSTRUCTION, LINE, BRANCH, COMPLEXITY, METHOD and CLASS. Instruction is the default one.
In order to validate both Line and branch coverage, one can use below code:
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
counter = 'LINE'
minimum = 0.87
}
limit {
counter = 'BRANCH'
minimum = 0.80
}
}
}
}
One rule can contain multiple Limits.
Ref: https://docs.gradle.org/current/javadoc/org/gradle/testing/jacoco/tasks/rules/JacocoViolationRulesContainer.html