Justin
Justin

Reputation: 887

Gradle skipping jacoco coverage plugin

I know there are a lot of similar questions for this on stackexchange but this is driving me crazy and nothing from any other answers have helped me. I've used just about every force flag for gradle I can find.

My Gradle version is 2.2.1

My build.gradle

buildscript {
ext {
    springBootVersion = '1.5.3.RELEASE'
}
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    classpath("se.transmode.gradle:gradle-docker:1.2")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'application'
apply plugin: 'docker'
apply plugin: 'jacoco'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
  mavenCentral()
}


ext {
  springCloudVersion = 'Dalston.RELEASE'
}

test {
  include 'src/test/java'
  finalizedBy jacocoTestReport
}

jacocoTestReport {
   reports {
     xml.enabled true
     csv.enabled false
     html.enabled false
     xml.destination "${buildDir}/jacoco"
 }  
}
dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}

When I run gradle test or gradle clean test jacocoTestReport or gradle clean --re-run etc etc I get the same results.

gradle test
:compileJava
:processResources
:classes
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test UP-TO-DATE
:jacocoTestReport SKIPPED

I have only 1 test in the src/test/java location.

Why will it not generate the reports and run? I'm at a loss.

Upvotes: 8

Views: 9680

Answers (3)

Vadzim
Vadzim

Reputation: 26160

It was a bit tricky to find that JaCoCo by default skips every jacocoTestCoverageVerification task in case if tests are run trough a custom named task (not just test).

For example, tests were run via unitTest in my project, JaCoCo did create build/jacoco/unitTest.exec during their execution, yet it kept searching for test.exec during verification. ¯\_(ツ)_/¯

The workaround is to override executionData path for JaCoCo gradle tasks:

apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.8.8"
}
def coverageFile = layout -> layout.buildDirectory.file('jacoco/coverage.exec').get()
tasks.named('jacocoTestCoverageVerification') {
    getExecutionData().setFrom(files(coverageFile(layout)))
    violationRules {
        rule {
            limit {
                minimum = project.properties['testCoverageThreshold'] ?: 0.5
            }
        }
    }
}
tasks.named('jacocoTestReport') {
    getExecutionData().setFrom(files(coverageFile(layout)))
}
tasks.named('unitTest') { 
    jacoco {
        destinationFile = coverageFile(layout).asFile
    }
    finalizedBy jacocoTestReport, jacocoTestCoverageVerification
}

Upvotes: 1

M. Amer
M. Amer

Reputation: 1136

For Spring 2.5 Users, who got stuck with it for hours -just like myself.
I was not having the exec file generated.
And because of that , I found that the jacocoTestReport was simply "skipped".

I got it fixed by adding :

test {
  useJUnitPlatform()
  finalizedBy jacocoTestReport // report is always generated after tests run
}

That's because I'm using Junit5 with spring boot 2.X

Upvotes: 2

Rene Groeschke
Rene Groeschke

Reputation: 28653

Remove the wrong include statement in your test configuration.

That seems to cause the test task to always be up-to-date (not executing any test as the include pattern isn't matched)

The jacocoTestReport will be skipped if there's no execution data available that is needed to generate the report. This execution data should be generated while the test task is executed. In your example we see that the test task is always marked as up-to-date (because of the invalid include statement) causing the build to never produce any input for the jacocoTestReport task.

Upvotes: 9

Related Questions