56 votes

Comment utiliser JUnit 5 avec Gradle?

Je suis en train d'utiliser JUnit 5 avec Gradle après j'ai réussi à l'exécution d'un test JUnit 4.

Résultat attendu: La JUnit 4 test a donné une belle "réussi" dans la sortie et un rapport html en build/reports/tests.

Résultat réel: JUnit 5 test ci-dessous n'a pas de sortie à autre chose qu' (...) build succesful, tandis que je sais que le test n'est pas fait exécuter, car il n'existe pas de test de la sortie du journal réussi/sauté/l'échec, et de mettre un fail dans le test continue la construction réussie.

L'exécution gradle test --info rendements en Skipping task ':testClasses' as it has no actions. parmi beaucoup de je pense surtout que unrelevant de sortie. Étonnamment, elle aussi, dit - Executing task ':test' et Generating HTML test report... Finished generating test html results et similaires pour le xml en build/test-results/test, tandis que le xml n'est pas généré, le html ne montre aucune exécution des tests et pas d'erreurs, et le test est en effet pas l'exécuter.

Ce que je pense aussi très intéressant, c'est qu' gradle test --debug rendements

[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

alors que mon seul test contient

fail("test fails");

je pense que c'est très étrange!

Mon fichier de build est

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"
    }
}

Mon test est

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");
    }
}

Ma structure de dossier, à l'aide de paquet mypackage,

java-template-project
--- src
    --- mypackage
        --- HelloWorld.java
--- test
    --- mypackage
        --- HelloWorldTest.java

et dans IntelliJ 2017.1.3, dont je suis l'aide, la structure du module ressemble à ceci

java-template-project
--- java-template-project_main
    --- src/mypackage
        --- HelloWorld(.java)
--- java-template-project_test
    --- test/mypackage
        --- HelloWorldTest(.java)

parce que Gradle de nos jours veut la source et de tests dans leur propre paquet.

Ce que j'ai essayé

Évidemment, ce n'est pas la première question à ce sujet, toutes les questions que j'ai trouvé sont

55voto

PHPirate Points 1126

Nouveau: JUnit 5 soutien dans Gradle 4.6

Comme l'a souligné dans ce GitHub question de Gradle de 4,6 à partir de JUnit 5 est pris en charge! Notes officielles de 4,6 (au moment de l'édition la plus récente, mais vérifiez le GitHub communiqués de vous assurer que vous utilisez la dernière version) à docs.gradle.org. L'ancienne installation fonctionnera toujours, mais en utilisant cela rend le fichier build beaucoup plus propre.

[Edit Mai 2019] Comme @deFreitas l'a souligné dans sa réponse, la JUnit documentation s'est améliorée, et maintenant, ils fournissent un exemple complet à https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle, voir en particulier l' build.gradle - il. Heureusement, il s'avère être effectivement le même que celui de cette réponse.

Mise À Jour De Gradle

Tout d'abord, assurez-vous que vous utilisez la dernière Gradle version, vérifiez les dernières mises à leur GitHub communiqués. Si c'est pour l'exemple 4.6, exécutez dans un terminal dans votre projet à l'emplacement de gradlew wrapper --gradle-version=4.6 ou assurez-vous de mettre à jour cette ligne dans votre gradle/wrapper/gradle-wrapper.properties le fichier: distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip.

Comment faire pour utiliser le haut-JUnit 5

Puis avec les fichiers java, la structure du répertoire etc. à partir de la question de l' build.gradle le fichier sera (à l'aide de la nouvelle - plugins de l'îlot)

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 Pour le strict minimum version, voir Ray réponse.

Android

Sur Android, j'ai réussi à exécuter la JUnit 5 test à partir de la question par adjonction, à mon application module fichier build. Comme vous pouvez le voir les dépendances sont les mêmes, mais je n'ai pas besoin d' useJUnitPlatform() et le test de bloc de configuration est légèrement différente.

apply plugin: 'com.android.application'
// In fact I am not sure you need this, but I had it included to run Spek tests anyway
apply plugin: 'de.mannodermaus.android-junit5' 

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}


android {
    // I'm omitting your other configurations like compileSdkVersion, buildTypes etc.

    testOptions {
        unitTests.all {

            // Always run tests, even when nothing changed.
            dependsOn 'clean'

            // Show test results.
            testLogging {
                events "passed", "skipped", "failed"
            }
        }
    }
}

toutefois , il ne fonctionne que pour moi, quand j'exécute le Gradle test de tâche, pas quand je lance l' check de la tâche. Comme d'habitude, j'ai tester en créant un test en échec, puis-je essayer si le Gradle tâche réussit ou échoue.

25voto

Ralf Stuckert Points 1299

Vous avez besoin des moteurs pour les deux versions de JUnit et vous devez appliquer le plugin gradle de la plate-forme JUnit. Je ne vois pas cela dans votre dossier Gradle. Voici une version de gradle qui exécute JUnit 4 et 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'
}
 

Voir le formulaire doc JUnit pour plus d'informations à ce sujet.

15voto

Ray Tayek Points 4635

En ajoutant simplement à la base de connaissances, je viens de recevoir les éléments suivants pour travailler avec 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()
}
 

7voto

fbokovikov Points 621

En raison de github question de la prise en charge intégrée pour JUnit 5, prévue pour Gradle 4.6

Ainsi, depuis gradle 4.6 votre résultat escompté être le même que le résultat réel.

Résultat attendu: La JUnit 4 test a donné une belle "réussi" dans la sortie et un rapport html en build/reports/tests.

UPD:

gradle 4.6-rc-1 a été publié le 16 février 2018 et cette version fournit la prise en charge intégrée pour junit 5.

Pour activer junit 5 soutien dont vous avez besoin pour mettre à jour gradle wrapper:

gradle wrapper --gradle-version=4.6-rc-1

et ajouter une ligne à construire.gradle:

test {
    useJUnitPlatform()
}

2voto

deFreitas Points 17

Consultez la documentation officielle de junit sur l'utilisation de junit 5 avec 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"
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X