Как использовать JUnit 5 с Gradle?
Я пытаюсь использовать JUnit 5 с Gradle после того, как мне удалось запустить тест JUnit 4.
Ожидаемый результат: Tthe JUnit 4 test дал хороший "пройденный" в выводе и html-отчет в build/reports/tests
.
Фактический результат: Тест JUnit 5, как показано ниже, не выводит ничего, кроме (...) build succesful
, но я знаю, что тест на самом деле не выполняется, так как нет выходного файла теста, пропускаемого/пропущенного/неудачного, и fail
в тест сохраняет сборку успешной.
Выполнение gradle test --info
дает Skipping task ':testClasses' as it has no actions.
среди многих я думаю, что в большинстве случаев не имеет значения. Удивительно, но это также говорит о Executing task ':test'
и " Generating HTML test report... Finished generating test html results
и аналогичные для xml в build/test-results/test
, в то время как xml не генерируется, html не показывает тестов запуск и отсутствие ошибок, и тест действительно не выполняется.
То, что я также считаю очень интересным, заключается в том, что gradle test --debug
дает
[TestEventLogger] Gradle Test Run :test STARTED
[org.gradle.api.internal.tasks.testing.junit.JUnitDetector] test-class-
scan : failed to scan parent class java/lang/Object, could not find the class file
[TestEventLogger]
[TestEventLogger] Gradle Test Run :test PASSED
в то время как мой единственный тест содержит
fail("test fails");
который, я думаю, очень странный!
Мой файл сборки
apply plugin: 'java'
test {
dependsOn 'cleanTest' // run tests every time
}
sourceSets {
main {
java {
srcDirs 'src'
}
}
test {
java {
srcDirs 'test'
}
}
}
repositories {
mavenCentral()
}
dependencies {
// when using this, it worked with a junit 4 test
// testCompile 'junit:junit:4.10'
// this should be needed for junit 5 (using M4 is required since IJ 2017.1.2
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
}
test {
testLogging {
events "passed", "skipped", "failed"
}
}
Мой тест
package mypackage;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class HelloWorldTest {
@Test
public void testHelloWorld(){
assertEquals(2, 1+1, "message");
}
}
Моя структура папок, используя пакет mypackage
,
java-template-project
--- src
--- mypackage
--- HelloWorld.java
--- test
--- mypackage
--- HelloWorldTest.java
и в IntelliJ 2017.1.3, который я использую, структура модуля выглядит так:
java-template-project
--- java-template-project_main
--- src/mypackage
--- HelloWorld(.java)
--- java-template-project_test
--- test/mypackage
--- HelloWorldTest(.java)
потому что Gradle в настоящее время хочет источник и тесты в своем собственном пакете.
Что я пробовал
Очевидно, что это не первый вопрос по этой теме, все соответствующие вопросы, которые я нашел,
-
Проект Gradle, выполняющий jUnit 5 тестов в IntelliJ
Но, как вы видите, это относится к более старым версиям IntelliJ, и я уже использую синтаксис для IJ 2016.3.3 и выше в соответствии с одним из ответов в одной строке зависимости JUnit, так что это должно быть хорошо.
-
Обновление с JUnit 4 до JUnit 5 в intellij с помощью gradle
Ссылки на предыдущий вопрос и ссылки на этот блог Jetbrains, который использует ту же строку, что и выше. Также ссылки на:
-
Интеграция результатов теста JUnit 5 с протоколом испытаний Intellij. В этом вопросе указывается, что зависимость также
testRuntime("org.junit.vintage:junit-vintage-engine:5.0.0-M1")
что объясняется в: Почему JUnit Jupiter и JUnit Vintage были отделены, когда я запускал TestCase в IntelliJ? Ну, когда я запустил его, результат показал, что он не может найти эту версию, но в соответствии с репозиторием Maven это для JUnit 5:
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
В ответах там отмечается, что вы можете просто запускать тесты внутри IntelliJ, поскольку более поздние версии поддерживают JUnit 5. Я знаю, и тест отлично работает, когда я убегаю из IntelliJ. Но я хочу использовать Gradle (и Travis, который нуждается в управлении зависимостями).
-
Как захватить stdout/stderr в отчете о тестировании юнита 5?
Я попытался использовать
testCompile("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
testCompile("org.junit.jupiter:junit-jupiter-engine:5.0.0-M3")
но результаты не изменились.
Мой шаблонный проект находится на https://github.com/PHPirates/java-template-project, но этот вопрос должен содержать всю необходимую информацию.
Ответы
Ответ 1
Вам нужны движки для версий JUnit, и вам нужно применить плагин градиента платформы JUnit. Я не вижу этого в вашем файле gradle. Вот работающая градиентная сборка, выполняющая как JUnit 4, так и 5:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M4")
}
}
apply plugin: 'org.junit.platform.gradle.plugin'
...
dependencies {
...
testCompile("junit:junit:4.12")
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0-M4")
// Enable use of the JUnitPlatform Runner within the IDE
testCompile("org.junit.platform:junit-platform-runner:1.0.0-M4")
}
junitPlatform {
details 'tree'
}
Более подробную информацию см. В документе JUnit doc.
Ответ 2
Новое: поддержка JUnit 5 в Gradle 4.6
Как указано в этом выпуске GitHub от Gradle 4.6, поддержка JUnit 5 поддерживается! Официальные примечания к выпуску 4.6 (на момент редактирования последних, но проверьте ссылку ниже) на docs.gradle.org. Старая настройка по-прежнему будет работать, но использование этого делает файл сборки намного более чистым.
Обновить Gradle
Во-первых, убедитесь, что вы используете последнюю версию Gradle, проверьте последние выпуски в своих выпусках GitHub. Если это, например, 4.6, запустите в терминале в вашем проекте gradlew wrapper --gradle-version=4.6
или обязательно обновите эту строку в gradle/wrapper/gradle-wrapper.properties
: distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
.
Как использовать встроенный JUnit 5
Затем с помощью java файлов, структуры каталогов и т.д. Из вопроса будет build.gradle
файл build.gradle
(с использованием нового блока plugins
)
plugins {
id 'java'
}
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.3'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.0.3'
}
// These lines can be removed when you use the default directories src/main/kotlin and src/test/kotlin
sourceSets {
main.java.srcDirs += 'src'
main.resources.srcDirs += 'src'
test.java.srcDirs += 'test'
test.resources.srcDirs += 'test'
}
// Java target version
sourceCompatibility = 1.8
test {
// Enable JUnit 5 (Gradle 4.6+).
useJUnitPlatform()
// Always run tests, even when nothing changed.
dependsOn 'cleanTest'
// Show test results.
testLogging {
events "passed", "skipped", "failed"
}
}
PS Для абсолютной минимальной версии см. Ответ Рэй.
Ответ 3
В связи с GitHub выпуска встроенной поддержкой JUnit 5, запланированного на Gradle 4.6
Таким образом, с градиентом 4.6 ваш ожидаемый результат должен быть таким же, как и фактический результат.
Ожидаемый результат: Tthe JUnit 4 test дал хороший "пройденный" в выводе и html-отчет в build/reports/tests
.
UPD:
gradle 4.6-rc-1 был выпущен 16 февраля 2018 года, и эта версия обеспечивает встроенную поддержку junit 5.
Чтобы включить поддержку junit 5, вам необходимо обновить оболочку градиента:
gradle wrapper --gradle-version=4.6-rc-1
и добавьте только одну строку для build.gradle:
test {
useJUnitPlatform()
}
Ответ 4
просто добавляя к базе знаний, я просто получил следующее для работы с gradle 4.7:
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.1'
}
test {
useJUnitPlatform()
}