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.
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.
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.
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' --tests
argument ne sera pas pris en charge et vous obtiendrez une erreur.
--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 comme gradle -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.
--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 unique someMethod
au sein de votre MyTest
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 exemple gradle -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
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.
./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"
Veuillez noter que cette --tests
option 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 testProdReleaseUnitTest
au lieu de simplement test
)
./gradlew test --tests *testMyCollectionTake*
et je ne peux pas dire comment dois-je le remplacer test
par le nom du test générique
Vous trouverez ci-dessous la commande pour exécuter une seule classe de test à l'aide gradlew
de 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.TestClass
avec une variante Variant_1
:
gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass
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