So führen Sie nur eine lokale Testklasse auf Gradle aus

428

Ich bin neu bei Gradle. Ich benutze Gradle 1.10 und Ubuntu 13.

Ich möchte wissen, ob es einen Befehl gibt, nur eine lokale Testklasse auszuführen , ähnlich wie 'testonly' in SBT.

bula
quelle
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.

Maleen Abewardana
quelle
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.

luftgeboren
quelle
30
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

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

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.

greperror
quelle
1
Oder einfach./gradlew :b-module:test --tests testToRun
Ahmed Ashour
32

Nachdem ich viel herausgefunden hatte, funktionierte Folgendes für mich:

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

Pratik Khadloya
quelle
10
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).

Anagaf
quelle
6
Genau in diese Situation geraten Danke!
JPM
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:

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

Unteres Beispiel zum Ausführen einer Klasse com.example.TestClassmit Variante Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 
Naveenprasanth Duraisamy
quelle
2

Sie sollten versuchen, am Ende Sternchen (*) hinzuzufügen.

gradle test --tests "com.abc *"

mutkan
quelle
2

Führen Sie einen einzelnen Test mit dem Namen MyTest aus:

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

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

Greg
quelle