C'était récemment le sujet du billet de blog de Gradle Arrêtez de réexécuter vos tests . L' auteur montre un exemple d'utilisation outputs.upToDateWhen { false }
et explique pourquoi c'est faux:
Cela ne force pas réellement les rediffusions
Ce que l'auteur de cet extrait de code voulait probablement dire, c'est "Toujours réexécuter mes tests". Ce n'est pas ce que fait cet extrait de code. Cela marquera uniquement la tâche obsolète, forçant Gradle à recréer la sortie. Mais voici le problème, si le cache de construction est activé, Gradle n'a pas besoin d'exécuter la tâche pour recréer la sortie. Il trouvera une entrée dans le cache et décompressera 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écompressera les résultats du test du cache de compilation une fois la sortie nettoyée, donc rien ne sera réexécuté. En bref, ces extraits créent un no-op très coûteux.
Si vous pensez maintenant «OK, je vais désactiver le cache aussi», laissez-moi vous dire pourquoi vous ne devriez pas.
Ensuite, l'auteur explique pourquoi réexécuter certains tests est une perte de temps:
La grande majorité de vos tests doivent être déterministes, c'est-à-dire, étant donné les mêmes entrées, ils devraient produire le même résultat.
Dans les quelques cas où vous souhaitez réexécuter des tests où le code n'a pas changé, vous devez les modéliser comme une entrée. Voici deux exemples du billet 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.