web-dev-qa-db-fra.com

Comment utiliser JUnit 5 avec Gradle?

J'essaie d'utiliser JUnit 5 avec Gradle après avoir réussi à exécuter un test JUnit 4.

Résultat attendu: Le test JUnit 4 a donné le résultat positif de Nice et un rapport HTML au format build/reports/tests.

Résultat actuel: Le test JUnit 5 ci-dessous ne génère rien d'autre que (...) build succesful, bien que je sache que le test n'est pas exécuté car il n'y a pas de sortie du journal de test réussie/ignorée/en échec, et l'insertion d'une fail dans le test conserve. la construction réussie.

Exécuter gradle test --info génère Skipping task ':testClasses' as it has no actions. parmi beaucoup de sorties non significatives, je pense . De manière surprenante, il indique également Executing task ':test' et Generating HTML test report... Finished generating test html results et similaire pour le code XML dans build/test-results/test, alors que le code XML n'est pas généré, le code HTML ne montre aucun test exécuté ni erreur, et le test n'est en effet pas exécuté.

Ce que je trouve aussi très intéressant, c’est que gradle test --debug donne

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

ce que je pense est très étrange!

Mon fichier de construction 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 est, en utilisant le paquet mypackage,

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

et dans IntelliJ 2017.1.3, que j'utilise, 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 veut maintenant la source et les tests dans leur propre paquet.

Ce que j'ai essayé

De toute évidence, ce n’est pas la première question à ce sujet, toutes les questions pertinentes que j’ai trouvées sont

24
PHPirate

Vous avez besoin des moteurs pour les deux versions de JUnit et vous devez appliquer le plug-in Gradient de la plate-forme JUnit. Je ne vois pas cela dans votre dossier. Voici une version de travail qui exécute les 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 JUnit doc form pour plus d’informations à ce sujet.

18
Ralf Stuckert

Nouveau: Prise en charge de JUnit 5 dans Gradle 4.6

Comme indiqué dans ce numéro de GitHub à partir de Gradle 4.6, JUnit 5 est pris en charge! Notes de publication officielles de la version 4.6 (au moment de l'édition de la dernière, mais vérifiez le lien ci-dessous) à docs.gradle.org . L'ancienne configuration fonctionnera toujours, mais son utilisation rend le fichier de construction beaucoup plus propre.

Update Gradle

Tout d'abord, assurez-vous que vous utilisez la dernière version de Gradle, vérifiez les dernières versions à leurs versions GitHub . S'il s'agit par exemple de la version 4.6, exécutez-le dans un terminal à l'emplacement de votre projet gradlew wrapper --gradle-version=4.6 ou veillez à mettre à jour cette ligne dans votre fichier gradle/wrapper/gradle-wrapper.properties: distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.Zip.

Comment utiliser le JUnit 5 intégré

Ensuite, avec les fichiers Java, la structure de répertoire, etc. de la question, le fichier build.gradle sera (en utilisant le nouveau bloc 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 Pour la version minimale absolue, voir réponse de Ray .

30
PHPirate

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

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

Ainsi, depuis le niveau 4.6, votre résultat attendu doit être identique au résultat réel.

Résultat attendu: le test JUnit 4 a donné le résultat «Nice» dans la sortie et un rapport HTML dans build/reports/tests.

UPD:

gradle 4.6-rc-1 a été publié le 16 février 2018 et cette version fournit le support intégré pour Junit 5.

Pour activer la prise en charge de junit 5, vous devez mettre à jour Gradle wrapper:

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

et ajoutez juste une ligne à build.gradle:

test {
    useJUnitPlatform()
}
4
fbokovikov

Peut-être que quelque chose d’aide pour ceux qui ont eu ce problème en essayant d’intégrer JUnit5 avec gradle version 4.10

Could not find method test() for arguments [build_dzas89s5z18l3bfyn6b3q0dxv$_run_closure2$_closure9@8e60c6] on project ':app' of type org.gradle.api.Project.

En fait, avec 4.10, vous n'avez pas besoin d'ajouter ce bloc de configuration de test dans build.gradle pour activer JUnit5.

test {
    useJUnitPlatform()
}

Cela devrait fonctionner correctement en ajoutant simplement les dépendances nécessaires entre jupitor-api et jupitor-engine.

J'ai essayé d'explorer les notes de publication de 4.10 mais je n'ai rien trouvé à propos de ce changement. Si quelqu'un en sait plus sur le "Pourquoi" qui se cache derrière, je vous en prie, contactez-moi également. 

0
Wahib Ul Haq