Comment exécuter une seule classe de test locale sur Gradle


430

Je suis nouveau à Gradle. J'utilise Gradle 1.10 et Ubuntu 13.

Je veux savoir s'il existe une commande pour exécuter une seule classe de test locale , similaire à «testonly» dans SBT.


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.


30
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

./gradlew :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"

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.


1
Ou tout simplement./gradlew :b-module:test --tests testToRun
Ahmed Ashour

32

Après beaucoup de réflexion, ce qui suit a fonctionné pour moi:

gradle test --tests "a.b.c.MyTestFile.mySingleTest"


11
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)


6
Ran dans cette situation exacte Merci!
JPM

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:

gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

Exemple ci-dessous pour exécuter une classe com.example.TestClassavec une variante Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 

2

Vous devriez essayer d'ajouter des astérisques (*) à la fin.

test gradle - tests "com.abc *"


2

Exécutez un seul test appelé MyTest:

./gradlew app:testDebug --tests=com.example.MyTest

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.