Angesichts der Antworten sollte klar sein, dass es sich um lokale Tests handelt, nicht um instrumentierte Tests. Android / Gradle macht die Dinge verwirrend, indem diese lokalen Tests "Unit" -Tests genannt werden.
tir38
Antworten:
559
Eine einzige Testklasse durchzuführen Die Antwort von Airborn ist gut.
Mit einigen Befehlszeilenoptionen, die hier zu finden sind , können Sie einfach so etwas tun.
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
Ab Version 1.10 von gradle unterstützt es die Auswahl Tests, unter Verwendung eines Testfilter . Zum Beispiel,
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"
}
}
Überprüfen Sie diese Antwort in Umgebungen mit mehreren Geschmacksrichtungen (ein häufiger Anwendungsfall für Android) , da das --testsArgument nicht unterstützt wird und Sie eine Fehlermeldung erhalten.
Der Filteransatz könnte wahrscheinlich auch mit Aufgabenregeln für eine bequeme Testauswahl kombiniert werden
Matt Whipple
Bei großen Testsuiten wird, selbst wenn --testseine einzelne Testmethode innerhalb der Klasse aufgerufen wird, eine Iteration über alle Klassen angezeigt, auch über alle nicht ausgeführten, was zu langsam ist. Ich weiß nicht, ob diese Langsamkeit auf unsere Umwelt zurückzuführen ist oder ob sie andere beeinflussen würde. Kann aktualisiert werden, wenn mehr gefunden wird.
Arntg
185
Sie können dies tun, gradle -Dtest.single=ClassUnderTestTest testwenn Sie eine einzelne Klasse testen oder Regexp verwenden möchten. gradle -Dtest.single=ClassName*Test testWeitere Beispiele zum Filtern von Klassen für Tests finden Sie unter diesem Link in Abschnitt 23.12. Prüfung.
Neuere Versionen (ab Version 1.10) unterstützen eine --testsBefehlszeilenoption, die ersetzt werden soll -DtestTaskName.single.
Peter Niederwieser
58
Mit dieser --testOption können Sie das Testen auch auf eine einzelne Methode innerhalb Ihrer Testklasse beschränken. Beispiel: gradle test --tests *MyTest.someMethod Führt nur den einzelnen Test someMethodin Ihrer MyTestKlasse aus. Während ich einen Testfall erstelle, führe ich normalerweise jeweils eine einzelne Methode aus, um es einfacher zu machen, mich nur auf die Ausgabe zu konzentrieren, die ich zum Debuggen benötige, und am Ende den gesamten Testfall auszuführen.
Jeff French
10
Beachten Sie auch, dass der Befehl lautet, wenn Sie einen einzelnen Test in einem Projekt mit mehreren Modulen ausführen möchten gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Siehe diese Diskussion auf gradle.org
Bulat
2
Möglicherweise möchten Sie auch eine --no-rebuildOption verwenden, z. B. um gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testzu verhindern, dass Abhängigkeiten neu erstellt werden, und um diesen einzelnen Test schneller auszuführen.
Falconepl
2
Diese Option ist in Gradle 5 jedoch veraltet
Eyal
108
Falls Sie ein Projekt mit mehreren Modulen haben:
Nehmen wir an, Ihre Modulstruktur ist
root-module
-> a-module
-> b-module
und der Test (testToRun), den Sie ausführen möchten, befindet sich im b-Modul mit dem vollständigen Pfad: com.xyz.b.module.TestClass.testToRun
Da Sie hier daran interessiert sind, den Test im B-Modul auszuführen, sollten Sie die für das B-Modul verfügbaren Aufgaben sehen.
./gradlew :b-module:tasks
Der obige Befehl listet alle Aufgaben im b-Modul mit Beschreibung auf. Im Idealfall haben Sie eine Aufgabe namens test , um die Komponententests in diesem Modul auszuführen.
./gradlew :b-module:test
Nachdem Sie den Punkt für die Ausführung aller Tests im b-Modul erreicht haben, können Sie der obigen Aufgabe einen Parameter übergeben, um Tests auszuführen, die dem bestimmten Pfadmuster entsprechen
Dieser Befehl funktioniert bei mir nicht. > Fehler: Unbekannte Befehlszeilenoption '--tests'
Tarkik
31
Bitte beachten Sie, dass diese --testsOption möglicherweise nicht funktioniert, wenn Sie einen anderen Build haben types/flavors(schlägt mit fehl Unknown command-line option '--tests'). In diesem Fall muss die jeweilige Testaufgabe angegeben werden (z. B. testProdReleaseUnitTeststatt nur test).
Können Sie ein vollständiges Beispiel ausarbeiten? Ich versuche 3 Tests auszuführen, die mit einem Platzhalter übereinstimmen, ./gradlew test --tests *testMyCollectionTake*und ich kann nicht sagen, wie ich ihn durch testden
Testnamen
4
Unten finden Sie den Befehl zum Ausführen einer einzelnen Testklasse mithilfe der gradlewBefehlszeilenoption:
In meinem Fall waren meine Eclipse-Java-Compiler-Warnungen zu hoch eingestellt, und Eclipse hat meine Klasse nicht als für die Ausführung gültig erkannt. Das Aktualisieren meiner Compilereinstellungen hat das Problem behoben. Sie können hier mehr darüber lesen: Annotation-nonnull-kann-nicht-aufgelöst werden
Antworten:
Eine einzige Testklasse durchzuführen Die Antwort von Airborn ist gut.
Mit einigen Befehlszeilenoptionen, die hier zu finden sind , können Sie einfach so etwas tun.
Ab Version 1.10 von gradle unterstützt es die Auswahl Tests, unter Verwendung eines Testfilter . Zum Beispiel,
Überprüfen Sie diese Antwort in Umgebungen mit mehreren Geschmacksrichtungen (ein häufiger Anwendungsfall für Android) , da das
--tests
Argument nicht unterstützt wird und Sie eine Fehlermeldung erhalten.quelle
--tests
eine einzelne Testmethode innerhalb der Klasse aufgerufen wird, eine Iteration über alle Klassen angezeigt, auch über alle nicht ausgeführten, was zu langsam ist. Ich weiß nicht, ob diese Langsamkeit auf unsere Umwelt zurückzuführen ist oder ob sie andere beeinflussen würde. Kann aktualisiert werden, wenn mehr gefunden wird.Sie können dies tun,
gradle -Dtest.single=ClassUnderTestTest test
wenn Sie eine einzelne Klasse testen oder Regexp verwenden möchten.gradle -Dtest.single=ClassName*Test test
Weitere Beispiele zum Filtern von Klassen für Tests finden Sie unter diesem Link in Abschnitt 23.12. Prüfung.quelle
--tests
Befehlszeilenoption, die ersetzt werden soll-DtestTaskName.single
.--test
Option können Sie das Testen auch auf eine einzelne Methode innerhalb Ihrer Testklasse beschränken. Beispiel:gradle test --tests *MyTest.someMethod
Führt nur den einzelnen TestsomeMethod
in IhrerMyTest
Klasse aus. Während ich einen Testfall erstelle, führe ich normalerweise jeweils eine einzelne Methode aus, um es einfacher zu machen, mich nur auf die Ausgabe zu konzentrieren, die ich zum Debuggen benötige, und am Ende den gesamten Testfall auszuführen.gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Siehe diese Diskussion auf gradle.org--no-rebuild
Option verwenden, z. B. umgradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
zu verhindern, dass Abhängigkeiten neu erstellt werden, und um diesen einzelnen Test schneller auszuführen.Falls Sie ein Projekt mit mehreren Modulen haben:
Nehmen wir an, Ihre Modulstruktur ist
und der Test (testToRun), den Sie ausführen möchten, befindet sich im b-Modul mit dem vollständigen Pfad: com.xyz.b.module.TestClass.testToRun
Da Sie hier daran interessiert sind, den Test im B-Modul auszuführen, sollten Sie die für das B-Modul verfügbaren Aufgaben sehen.
Der obige Befehl listet alle Aufgaben im b-Modul mit Beschreibung auf. Im Idealfall haben Sie eine Aufgabe namens test , um die Komponententests in diesem Modul auszuführen.
Nachdem Sie den Punkt für die Ausführung aller Tests im b-Modul erreicht haben, können Sie der obigen Aufgabe einen Parameter übergeben, um Tests auszuführen, die dem bestimmten Pfadmuster entsprechen
Jetzt stattdessen, wenn Sie laufen
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Es wird die Testaufgabe für Modul a und b ausgeführt, was zu einem Fehler führen kann, da in einem Modul nichts mit dem obigen Muster übereinstimmt.
quelle
./gradlew :b-module:test --tests testToRun
Nachdem ich viel herausgefunden hatte, funktionierte Folgendes für mich:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
quelle
Bitte beachten Sie, dass diese
--tests
Option möglicherweise nicht funktioniert, wenn Sie einen anderen Build habentypes/flavors
(schlägt mit fehlUnknown command-line option '--tests'
). In diesem Fall muss die jeweilige Testaufgabe angegeben werden (z. B.testProdReleaseUnitTest
statt nurtest
).quelle
./gradlew test --tests *testMyCollectionTake*
und ich kann nicht sagen, wie ich ihn durchtest
denUnten finden Sie den Befehl zum Ausführen einer einzelnen Testklasse mithilfe der
gradlew
Befehlszeilenoption:Unteres Beispiel zum Ausführen einer Klasse
com.example.TestClass
mit VarianteVariant_1
:quelle
Sie sollten versuchen, am Ende Sternchen (*) hinzuzufügen.
quelle
Führen Sie einen einzelnen Test mit dem Namen MyTest aus:
quelle
In meinem Fall waren meine Eclipse-Java-Compiler-Warnungen zu hoch eingestellt, und Eclipse hat meine Klasse nicht als für die Ausführung gültig erkannt. Das Aktualisieren meiner Compilereinstellungen hat das Problem behoben. Sie können hier mehr darüber lesen: Annotation-nonnull-kann-nicht-aufgelöst werden
quelle