J'ai mon script de qualité mis en place. Lorsque j'exécute la construction Gradle, tout fonctionne et les tests jUnit sont exécutés.
Après cela, lorsque je lance le test Gradle, j’obtiens ce qui suit:
C:\Users\..\..\Project>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
Quand je joue gradle clean
, puis Gradle build fonctionne, bien sûr ... Je veux pouvoir réinitialiser uniquement les tests, et non pas tout le projet: comment dois-je procéder?
Une option serait d'utiliser le --rerun-tasks
drapeau dans le ligne de commande . Cela relancerait toute la tâche de test et toutes les tâches qui en dépendent.
Si vous souhaitez uniquement réexécuter les tests, une autre option consiste à faire en sorte que les résultats des tests soient nettoyés avant d'exécuter les tests. Cela peut être fait en utilisant la tâche cleanTest
.
Un peu d’arrière-plan - le plugin Java définit une tâche propre pour chacune des autres tâches. Selon la documentation :
cleanTaskName - Supprime les fichiers créés par la tâche spécifiée. cleanJar supprimera le fichier JAR créé par la tâche jar et cleanTest supprimera les résultats du test créé par la tâche de test.
Par conséquent, tout ce dont vous avez besoin pour ré-exécuter vos tests est d’exécuter également la tâche cleanTest
, c’est-à-dire:gradle cleanTest test
Une autre option serait d’ajouter ce qui suit dans votre build.gradle:
test.outputs.upToDateWhen {false}
gradle test --rerun-tasks
Spécifie que toute optimisation de tâche est ignorée.
Source: https://gradle.org/docs/current/userguide/gradle_command_line.html
Voici une solution utilisant le fichier "build.gradle", au cas où vous ne voudriez pas modifier votre ligne de commande:
test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}
Et voici la sortie. Avis 2 changements de votre sortie précédente:
1) Une nouvelle tâche 'cleanTest' apparaît dans la sortie.
2) 'test' est toujours nettoyé (c'est-à-dire jamais 'UP-TO-DATE') pour qu'il soit exécuté à chaque fois:
$ gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:cleanTest
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build
C'était récemment le sujet sur le blog de Gradle Arrêtez de réexécuter vos tests . Le auteur montre un exemple utilisant outputs.upToDateWhen { false }
et explique pourquoi c'est faux:
Cela ne force pas les rediffusions
Ce que l'auteur de cet extrait aurait probablement voulu dire, c'est "Toujours relancer mes tests". Ce n’est cependant pas ce que fait cet extrait. Cela ne marquera que la tâche périmée, forçant Gradle à recréer la sortie. Mais voici le problème: si le cache de construction est activé, Gradle n’a pas besoin de lancer la tâche pour recréer la sortie. Il trouvera une entrée dans le cache et décompactera le résultat dans le répertoire de sortie du test.
La même chose est vraie pour cet extrait:
test.dependsOn cleanTest
Gradle décompactera les résultats du test à partir du cache de construction après le nettoyage de la sortie, afin que rien ne soit réexécuté. En bref, ces extraits créent un no-op très coûteux.
Si vous pensez maintenant "d'accord, je vais également désactiver le cache", laissez-moi vous dire pourquoi vous ne devriez pas le faire.
L'auteur explique ensuite pourquoi la relance de tests est une perte de temps:
La grande majorité de vos tests doit être déterministe, c’est-à-dire qu’ils doivent produire le même résultat si les mêmes entrées sont utilisées.
Dans les rares cas où vous souhaitez réexécuter des tests dont le code n'a pas changé, vous devez les modéliser en tant qu'entrée. Voici les deux exemples de l'article de blog qui montrent l'ajout d'une entrée afin que la tâche l'utilise lors de ses vérifications à jour.
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
Je recommande de lire l'intégralité du billet de blog.
Aussi, avoir à ajouter --rerun-tasks
est vraiment redondant. Ça n'arrive jamais. Créer un --no-rerun-tasks
et fais --rerun-tasks
_ défaut quand cleanTask