Gradle Jacoco und JUnit5

Wir haben gerade unsere Unit-Tests auf JUnit5 portiert. Zu erkennen, dass dies noch eine recht frühe Übernahme ist, mit kleinen Hinweisen auf Google.

Die größte Herausforderung bestand darin, eine Jacoco-Codeabdeckung für die Junit5-Tests zu erhalten, die wir für Jenkins verwenden. Da ich fast einen Tag gebraucht habe, um das herauszufinden, dachte ich, ich teile es. Wenn Sie jedoch eine bessere Lösung kennen, würde mich das interessieren!

buildscript {

    dependencies {
       // dependency needed to run junit 5 tests
       classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
   }
}

// include the jacoco plugin
plugins {
    id 'jacoco'
}

dependencies {
    testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2"
    runtime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2"
    runtime "org.junit.vintage:junit-vintage-engine:4.12.0-M2"
}

apply plugin: 'org.junit.platform.gradle.plugin'

Dann scheint das Problem zu sein, dass der im org.junit.platform.gradle.plugin definierte junitPlatformTest zu spät in der Gradle-Lebenszyklusphase definiert wird und daher beim Parsen des Skripts nicht bekannt ist.

Der folgende Hack wird benötigt, um noch eine jacoco-Task definieren zu können, die die junitPlatformTest-Task beobachtet.

tasks.whenTaskAdded { task ->
    if (task.name.equals('junitPlatformTest')) {
        System.out.println("ADDING TASK " + task.getName() + " to the project!")

    // configure jacoco to analyze the junitPlatformTest task
    jacoco {
        // this tool version is compatible with
        toolVersion = "0.7.6.201602180812"
        applyTo task
    }

    // create junit platform jacoco task
    project.task(type: JacocoReport, "junitPlatformJacocoReport",
            {
                sourceDirectories = files("./src/main")
                classDirectories = files("$buildDir/classes/main")
                executionData task
            })
    }
}

Abschließend muss das junitPlatform-Plugin konfiguriert werden. Der folgende Code ermöglicht die Befehlszeilenkonfiguration, welche Junit 5-Tags ausgeführt werden sollen: Sie können alle Tests mit dem Tag 'unit' ausführen, indem Sie Folgendes ausführen:

gradle clean junitPlatformTest -PincludeTags=unit

Sie können alle Tests ausführen, bei denen sowohl das Unit- als auch das Integ-Tag fehlen, indem Sie @ verwende

gradle clean junitPlatformTest -PexcludeTags=unit,integ

Wenn keine Tags angegeben werden, werden alle Tests ausgeführt (Standardeinstellung).

junitPlatform {

    engines {
        include 'junit-jupiter'
        include 'junit-vintage'
    }

    reportsDir = file("$buildDir/test-results")

    tags {
        if (project.hasProperty('includeTags')) {
            for (String t : includeTags.split(',')) {
                include t
            }
        }

        if (project.hasProperty('excludeTags')) {
            for (String t : excludeTags.split(',')) {
                exclude t
            }
        }
    }

    enableStandardTestTask false
}

Antworten auf die Frage(8)

Ihre Antwort auf die Frage