Как использовать JUnit 5 с Gradle?
Я пытаюсь использовать JUnit 5 с Gradle после того, как мне удалось запустить тест JUnit 4.
Ожидаемый результат: тест JUnit 4 дал хороший результат на выходе и 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 в отчёт о тестировании в gradle на junit 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 но этот вопрос должен содержать всю необходимую информацию.
7 ответов
Вам нужны движки для обеих версий JUnit, и вам нужно применить плагин Gradle платформы JUnit. Я не вижу этого в вашем файле Gradle. Вот рабочая сборка 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 для получения дополнительной информации об этом.
Новое: поддержка 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
файл будет (используя новый 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 Абсолютно минимальную версию смотрите в ответе Рэя.
Просто добавив в базу знаний, я получил следующее для работы с 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()
}
Из-за проблемы github встроена поддержка JUnit 5, запланированная на Gradle 4.6
Таким образом, начиная с версии 4.6, ваш ожидаемый результат должен совпадать с фактическим результатом.
Ожидаемый результат: тест JUnit 4 дал хороший результат на выходе и HTML-отчет в
build/reports/tests
,
UPD:
gradle 4.6-rc-1 был выпущен 16 февраля 2018 года, и эта версия обеспечивает встроенную поддержку для junit 5.
Чтобы включить поддержку junit 5, вам нужно обновить упаковщик Gradle:
gradle wrapper --gradle-version=4.6-rc-1
и добавьте только одну строку в build.gradle:
test {
useJUnitPlatform()
}
Ознакомьтесь с официальной документацией junit о том, как использовать junit 5 с Gradle.
build.gradle
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation('org.junit.jupiter:junit-jupiter:5.4.0')
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
Для Gradle Kotlin DSL (build.gradle.kts) вот все, что вам нужно для совместного запуска тестов JUnit 5 и/или JUnit 4 :
tasks.withType<Test> {
useJUnitPlatform() // Enables JUnit Platform (JUnit 5 + JUnit 4)
}
dependencies {
// Aggregator dependency that also brings JUnit 5 parameterized tests etc.
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
// Include the Vintage engine to be able to run JUnit 4 tests as well
testImplementation("org.junit.vintage:junit-vintage-engine:5.10.0")
}
src/test/java/com/example/MyTestClass.java:
package com.example
import org.junit.jupiter.api.Test
//...
public class MyTestClass {
@Test // <- JUnit 5 test
public void jUnit5test() {
// ...
}
@org.junit.Test // <- JUnit 4 test
public void jUnit4Test() {
// ...
}
}
Выполните свои тесты, запустив задачу Gradle.test
илиcheck
так:
./gradlew test
Или выполнить только некоторые тесты:
./gradlew test --tests "com.example.MyTestClass"
Может быть, что-то полезное для тех, кто был поражен этой проблемой при попытке интегрировать JUnit5 с Gradle версии 4.10.
Could not find method test() for arguments [build_dzas89s5z18l3bfyn6b3q0dxv$_run_closure2$_closure9@8e60c6] on project ':app' of type org.gradle.api.Project.
На самом деле, с 4.10 вам не нужно добавлять этот тестовый конфигурационный блок в build.gradle, чтобы включить JUnit5.
test {
useJUnitPlatform()
}
Он должен работать нормально, просто добавив необходимые зависимости jupitor-api и jupitor-engine.
Я попытался изучить примечания к выпуску 4.10, но ничего не нашел об этом изменении. Если кто-то знает больше о "Почему" за этим, пожалуйста, просветите меня.