Мы просто портировали наши модульные тесты на JUnit5. Понимая, что это все еще довольно раннее принятие с небольшими намеками на google.Gradle Jacoco и JUnit5
Наиболее сложным было получить покрытие кода jacoco для тестов Junit5, которые мы используем для jenkins. Поскольку это заняло у меня почти день, чтобы понять, я думал, что разделяю. Тем не менее, если вы знаете лучшего решения, мне было бы интересно узнать!
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'
Тогда проблема, кажется, что junitPlatformTest, как это определено в org.junit.platform.gradle.plugin определяется слишком в конце Gradle фазы жизненного цикла и, следовательно, неизвестно, когда скрипт разбирается.
Для дальнейшего определения задачи jacoco, выполняющей задачу junitPlatformTest, необходим следующий хак.
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 тегов должны выполняться: Вы можете запустить все тесты с «единицами» тегом, запустив:
gradle clean junitPlatformTest -PincludeTags=unit
Вы можете запустить все тесты, которые отсутствуют как блок и МЭГ тега с использованием
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
}
Я голосую, чтобы закрыть этот вопрос не по теме, потому что это скорее решение, а вопрос – Stanislav
Было бы хорошо, если бы это было разделено на вопрос и ответ. –
Я согласен с @PaulHicks, что это должен быть вопрос с ответами на вопрос. Вы можете увидеть документацию [здесь] (https://stackoverflow.com/help/self-answer). Кроме того, проблема «слишком поздно в жизненном цикле Gradle» должна быть [исправлена в M5] (https://github.com/junit-team/junit5/issues/708). – mkobit