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

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

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

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, но ничего не нашел об этом изменении. Если кто-то знает больше о "Почему" за этим, пожалуйста, просветите меня.

Другие вопросы по тегам