Compte tenu des réponses, il devrait être clair qu'il s'agit de tests locaux , pas de tests instrumentés . Android / Gradle rend les choses déroutantes en appelant ces tests locaux des tests "unitaires".
tir38
Réponses:
562
Pour exécuter une seule classe de test, la réponse d'Airborn est bonne.
En utilisant certaines options de ligne de commande, qui se trouvent ici , vous pouvez simplement faire quelque chose comme ça.
gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui
À partir de la version 1.10 de gradle, il prend en charge la sélection de tests à l'aide d'un filtre de test . Par exemple,
apply plugin: 'java'
test {
filter {
//specific test method
includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"
//specific test method, use wildcard for packages
includeTestsMatching "*SomeTest.someSpecificFeature"
//specific test class
includeTestsMatching "org.gradle.SomeTest"
//specific test class, wildcard for packages
includeTestsMatching "*.SomeTest"
//all classes in package, recursively
includeTestsMatching "com.gradle.tooling.*"
//all integration tests, by naming convention
includeTestsMatching "*IntegTest"
//only ui tests from integration tests, by some naming convention
includeTestsMatching "*IntegTest*ui"
}
}
Pour les environnements à saveurs multiples (un cas d'utilisation courant pour Android), vérifiez cette réponse , car l' --testsargument ne sera pas pris en charge et vous obtiendrez une erreur.
l'approche du filtre pourrait également être combinée avec des règles de tâche pour une sélection de test pratique
Matt Whipple
Pour les grandes suites de tests, même si vous utilisez --testspour appeler une seule méthode de test au sein de la classe, nous constatons une itération sur toutes les classes, même toutes celles qui ne sont pas exécutées, ce qui est trop lent. Je ne sais pas si cette lenteur est due à notre env ou si elle aurait un impact sur les autres. Peut mettre à jour si vous en trouvez plus.
arntg
185
Vous pouvez le faire gradle -Dtest.single=ClassUnderTestTest testsi vous voulez tester une seule classe ou utiliser regexp comme gradle -Dtest.single=ClassName*Test testvous pouvez trouver plus d'exemples de classes de filtrage pour les tests sous ce lien section 23.12. Tester.
Les versions récentes (à partir de 1.10 environ) prennent en charge une --testsoption de ligne de commande, qui est définie pour remplacer -DtestTaskName.single.
Peter Niederwieser
58
Avec cette --testoption, vous pouvez également limiter les tests à une seule méthode au sein de votre classe de test. Par exemple: gradle test --tests *MyTest.someMethod exécutera uniquement le test unique someMethodau sein de votre MyTestclasse. Lorsque je crée un scénario de test, j'exécute généralement une seule méthode à la fois pour faciliter la concentration sur la sortie que je dois déboguer, puis j'exécute le scénario de test complet à la fin.
Jeff French
10
Il convient également de noter que si vous souhaitez exécuter un seul test dans un projet multi-module, la commande est gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Voir cette discussion sur gradle.org
Bulat
2
Vous pouvez également vouloir utiliser une --no-rebuildoption, par exemple gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testpour empêcher la reconstruction des dépendances, et à son tour pour exécuter ce test plus rapidement.
falconepl
2
Cette option est cependant obsolète en Gradle 5
Eyal
108
Dans le cas où vous avez un projet multi-modules:
disons que la structure de votre module est
root-module
-> a-module
-> b-module
et le test (testToRun) que vous cherchez à exécuter est en module B, avec le chemin complet: com.xyz.b.module.TestClass.testToRun
Comme ici, vous êtes intéressé à exécuter le test dans b-module, vous devriez donc voir les tâches disponibles pour b-module.
./gradlew :b-module:tasks
La commande ci-dessus listera toutes les tâches du module b avec une description. Et dans le cas idéal, vous aurez une tâche nommée test pour exécuter les tests unitaires dans ce module.
./gradlew :b-module:test
Maintenant, vous avez atteint le point d'exécuter tous les tests dans le module b, enfin vous pouvez passer un paramètre à la tâche ci-dessus pour exécuter des tests qui correspondent au certain modèle de chemin
cette commande ne fonctionne pas pour moi. > Erreur: option de ligne de commande inconnue '--tests'
Tarkik
32
Veuillez noter que cette --testsoption peut ne pas fonctionner si vous avez une version différente types/flavors(échoue avec Unknown command-line option '--tests'). Dans ce cas, il est nécessaire de spécifier la tâche de test particulière (par exemple testProdReleaseUnitTestau lieu de simplement test)
Pouvez-vous élaborer un exemple complet? J'essaie d'exécuter 3 tests qui correspondent à un caractère générique à l'aide ./gradlew test --tests *testMyCollectionTake*et je ne peux pas dire comment dois-je le remplacer testpar le nom du test générique
DanielCuadra
4
Vous trouverez ci-dessous la commande pour exécuter une seule classe de test à l'aide gradlewde l'option de ligne de commande:
Dans mon cas, mes avertissements du compilateur java eclipse étaient trop élevés et eclipse ne reconnaissait pas ma classe comme valide pour l'exécution. La mise à jour des paramètres de mon compilateur a résolu le problème. Vous pouvez en savoir plus à ce sujet ici: annotation-nonnull-can't-be-resolution
Réponses:
Pour exécuter une seule classe de test, la réponse d'Airborn est bonne.
En utilisant certaines options de ligne de commande, qui se trouvent ici , vous pouvez simplement faire quelque chose comme ça.
À partir de la version 1.10 de gradle, il prend en charge la sélection de tests à l'aide d'un filtre de test . Par exemple,
Pour les environnements à saveurs multiples (un cas d'utilisation courant pour Android), vérifiez cette réponse , car l'
--tests
argument ne sera pas pris en charge et vous obtiendrez une erreur.la source
--tests
pour appeler une seule méthode de test au sein de la classe, nous constatons une itération sur toutes les classes, même toutes celles qui ne sont pas exécutées, ce qui est trop lent. Je ne sais pas si cette lenteur est due à notre env ou si elle aurait un impact sur les autres. Peut mettre à jour si vous en trouvez plus.Vous pouvez le faire
gradle -Dtest.single=ClassUnderTestTest test
si vous voulez tester une seule classe ou utiliser regexp commegradle -Dtest.single=ClassName*Test test
vous pouvez trouver plus d'exemples de classes de filtrage pour les tests sous ce lien section 23.12. Tester.la source
--tests
option de ligne de commande, qui est définie pour remplacer-DtestTaskName.single
.--test
option, vous pouvez également limiter les tests à une seule méthode au sein de votre classe de test. Par exemple:gradle test --tests *MyTest.someMethod
exécutera uniquement le test uniquesomeMethod
au sein de votreMyTest
classe. Lorsque je crée un scénario de test, j'exécute généralement une seule méthode à la fois pour faciliter la concentration sur la sortie que je dois déboguer, puis j'exécute le scénario de test complet à la fin.gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Voir cette discussion sur gradle.org--no-rebuild
option, par exemplegradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
pour empêcher la reconstruction des dépendances, et à son tour pour exécuter ce test plus rapidement.Dans le cas où vous avez un projet multi-modules:
disons que la structure de votre module est
et le test (testToRun) que vous cherchez à exécuter est en module B, avec le chemin complet: com.xyz.b.module.TestClass.testToRun
Comme ici, vous êtes intéressé à exécuter le test dans b-module, vous devriez donc voir les tâches disponibles pour b-module.
La commande ci-dessus listera toutes les tâches du module b avec une description. Et dans le cas idéal, vous aurez une tâche nommée test pour exécuter les tests unitaires dans ce module.
Maintenant, vous avez atteint le point d'exécuter tous les tests dans le module b, enfin vous pouvez passer un paramètre à la tâche ci-dessus pour exécuter des tests qui correspondent au certain modèle de chemin
Maintenant, au lieu de cela si vous exécutez
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Il exécutera la tâche de test pour les modules a et b, ce qui pourrait entraîner un échec car rien ne correspond au modèle ci-dessus dans un module.
la source
./gradlew :b-module:test --tests testToRun
Après beaucoup de réflexion, ce qui suit a fonctionné pour moi:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
la source
Veuillez noter que cette
--tests
option peut ne pas fonctionner si vous avez une version différentetypes/flavors
(échoue avecUnknown command-line option '--tests'
). Dans ce cas, il est nécessaire de spécifier la tâche de test particulière (par exempletestProdReleaseUnitTest
au lieu de simplementtest
)la source
./gradlew test --tests *testMyCollectionTake*
et je ne peux pas dire comment dois-je le remplacertest
par le nom du test génériqueVous trouverez ci-dessous la commande pour exécuter une seule classe de test à l'aide
gradlew
de l'option de ligne de commande:Exemple ci-dessous pour exécuter une classe
com.example.TestClass
avec une varianteVariant_1
:la source
Vous devriez essayer d'ajouter des astérisques (*) à la fin.
la source
Exécutez un seul test appelé MyTest:
la source
Dans mon cas, mes avertissements du compilateur java eclipse étaient trop élevés et eclipse ne reconnaissait pas ma classe comme valide pour l'exécution. La mise à jour des paramètres de mon compilateur a résolu le problème. Vous pouvez en savoir plus à ce sujet ici: annotation-nonnull-can't-be-resolution
la source