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
Projet Gradle exécutant les tests jUnit 5 dans IntelliJ
Mais comme vous pouvez le constater, cela s’applique aux anciennes versions d’IntelliJ et j’utilise déjà la syntaxe pour IJ 2016.3.3 et les versions ultérieures en fonction de l’une des réponses, dans la ligne de dépendance JUnit, ce qui devrait donc convenir.
_ { Mise à niveau de JUnit 4 à JUnit 5 dans intellij with gradle } _
Liens retour à la question ci-dessus, et liens vers ce blog Jetbrains qui utilise la même ligne que la question ci-dessus. Liens également vers:
Intégrez les résultats des tests JUnit 5 au rapport de test Intellij } _ Celui-ci indique, dans la question, également sous forme de dépendance.
testRuntime("org.junit.vintage:junit-vintage-engine:5.0.0-M1")
ce qui est expliqué dans Pourquoi JUnit Jupiter et JUnit Vintage ont-ils été séparés lorsque j'exécute TestCase dans IntelliJ?Maven Repository celui-ci est pour JUnit 5:
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
Les réponses indiquent que vous pouvez simplement exécuter les tests dans IntelliJ puisque les versions ultérieures prennent en charge JUnit 5. Je sais, et le test se passe bien quand je cours à partir d'IntelliJ. Mais je veux utiliser Gradle (et Travis, qui nécessite une gestion de la dépendance).
_ { Comment capturer stdout/stderr dans le rapport de test junit 5 gradle? } _
J'ai essayé d'utiliser
testCompile("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
testCompile("org.junit.jupiter:junit-jupiter-engine:5.0.0-M3")
mais les résultats n'ont pas changé.
Mon projet de modèle est situé sur https://github.com/PHPirates/Java-template-project mais cette question doit contenir toutes les informations nécessaires.
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.
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 .
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()
}
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()
}
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.