web-dev-qa-db-fra.com

Comment exécuter le test Gradle lorsque tous les tests sont UP-TO-DATE?

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?

100
USer22999299

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

139
Amnon Shochot

Une autre option serait d’ajouter ce qui suit dans votre build.gradle:

test.outputs.upToDateWhen {false}
40
frant.hartm

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

18
Martin Andersson

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
12
TealSeed

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.

6
mkobit

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

1
user1648995