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
}