ユニットテストをJUnit5に移植しました。これはまだかなり初期の採用であり、グーグルにはほとんどヒントがないことに気づきました。
最も難しかったのは、jenkinsで使用するJunit5テストのjacocoコードカバレッジを取得することでした。これを理解するのにほぼ1日かかったので、私は共有すると思いました。それにもかかわらず、あなたがより良い解決策を知っているなら、私は知りたいと思います!
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'
その場合、問題は、org.junit.platform.gradle.pluginで定義されているjunitPlatformTestが、gradleライフサイクルフェーズの後半で定義されているため、スクリプトが解析されるときに不明であることにあるようです。
JunitPlatformTestタスクを監視するjacocoタスクを定義できるようにするには、次のハックが必要です。
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
})
}
}
最後に、junitPlatformプラグインを構成する必要があります。次のコードにより、junit 5タグを実行するコマンドライン構成が可能になります。次を実行することにより、「unit」タグを使用してすべてのテストを実行できます。
gradle clean junitPlatformTest -PincludeTags=unit
Unitタグとintegタグの両方が欠落しているすべてのテストを使用して実行できます
gradle clean junitPlatformTest -PexcludeTags=unit,integ
タグが指定されていない場合、すべてのテストが実行されます(デフォルト)。
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
}
ありがとうございます。ハックは次のようになります。
project.afterEvaluate {
def junitPlatformTestTask = project.tasks.getByName('junitPlatformTest')
// configure jacoco to analyze the junitPlatformTest task
jacoco {
// this tool version is compatible with
toolVersion = "0.7.6.201602180812"
applyTo junitPlatformTestTask
}
// create junit platform jacoco task
project.task(type: JacocoReport, "junitPlatformJacocoReport",
{
sourceDirectories = files("./src/main")
classDirectories = files("$buildDir/classes/main")
executionData junitPlatformTestTask
})
}
直接薬剤注射でも解決できます:
subprojects {
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.9"
}
configurations {
testAgent {
transitive = false
}
}
dependencies {
testAgent("org.jacoco:org.jacoco.agent:0.7.9:runtime")
}
tasks.withType(JavaExec) {
if (it.name == 'junitPlatformTest') {
doFirst {
jvmArgs "-javaagent:${configurations.testAgent.singleFile}=destfile=${project.buildDir.name}/jacoco/test.exec"
}
}
}
}
その後、レポートはjacocoTestReport
タスクで利用可能になります
junitPlatformTest
タスクへの参照を取得するための別のオプションは、次のようにプロジェクトにafterEvaluate
ブロックを実装することです。
afterEvaluate {
def junitPlatformTestTask = tasks.getByName('junitPlatformTest')
// do something with the junitPlatformTestTask
}
その他の例については、 GitHub for JUnit 5 に関する私のコメントを参照してください。