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.


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.


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.


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"


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


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 

2

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

gradle test --tests "com.abc *"


2

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.