Как использовать 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 в настоящее время хочет источник и тесты в своем собственном пакете.

Что я пробовал

Очевидно, что это не первый вопрос по этой теме, все соответствующие вопросы, которые я нашел,

Ответ 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()
}