Jak uruchomić tylko jedną lokalną klasę testową na Gradle


429

Jestem nowy w Gradle. Używam Gradle 1.10 i Ubuntu 13.

Chcę wiedzieć, czy jest jakaś komenda do wykonania tylko jednej lokalnej klasy testowej, podobnej do „testonly” w SBT.


Biorąc pod uwagę odpowiedzi, powinno być jasne, że chodzi o testy lokalne , a nie testy instrumentalne . Android / Gradle wprowadza zamieszanie, nazywając te testy lokalne testami „jednostkowymi”.
tir38

Odpowiedzi:


560

Aby uruchomić jedną klasę testową, odpowiedź Airborn jest dobra.

Korzystając z niektórych opcji wiersza poleceń, które tutaj znajdziesz, możesz po prostu zrobić coś takiego.

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

Od wersji 1.10 klasy obsługuje wybieranie testów przy użyciu filtra testowego . Na przykład,

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"
   }
}

W przypadku środowisk o wielu smakach (częsty przypadek użycia dla Androida) sprawdź tę odpowiedź , ponieważ --testsargument nie będzie obsługiwany, a otrzymasz błąd.


podejście do filtrowania można również prawdopodobnie połączyć z regułami zadań w celu wygodnego wyboru testu
Matt Whipple

W przypadku dużych pakietów testowych, nawet jeśli --testswywołuje się jedną metodę testową w klasie, widzimy iterację we wszystkich klasach, nawet tych, które nie są uruchamiane, co jest zbyt wolne. Nie wiem, czy ta powolność wynika z naszej env, czy może wpłynie na innych. Można zaktualizować, jeśli znajdziesz więcej.
arntg

185

Możesz to zrobić, gradle -Dtest.single=ClassUnderTestTest testjeśli chcesz przetestować pojedynczą klasę lub użyć wyrażenia regularnego, tak jak gradle -Dtest.single=ClassName*Test testmożesz znaleźć więcej przykładów klas filtrujących do testów pod tym linkiem w sekcji 23.12. Test.


30
Najnowsze wersje (od wersji 1.10) obsługują --testsopcję wiersza poleceń, która jest ustawiona na zastąpienie -DtestTaskName.single.
Peter Niederwieser

58
Dzięki tej --testopcji możesz również ograniczyć testowanie do jednej metody w swojej klasie testowej. Na przykład: gradle test --tests *MyTest.someMethod przeprowadzi tylko jeden test someMethodw twojej MyTestklasie. Kiedy buduję przypadek testowy, zwykle uruchamiam pojedynczą metodę na raz, aby ułatwić skupienie się tylko na danych wyjściowych potrzebnych do debugowania, a następnie uruchomić całą walizkę testową na końcu.
Jeff French

10
Warto również zauważyć, że jeśli chcesz uruchomić pojedynczy test w projekcie wielomodułowym, to polecenie to gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Zobacz tę dyskusję na gradle.org
Bulat,

2
Możesz także skorzystać z --no-rebuildopcji, np. gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testAby zapobiec odbudowywaniu zależności, a tym samym szybciej wykonać ten test.
falconepl

2
Ta opcja jest przestarzała w Grade 5
Eyal

108

W przypadku projektu wielomodułowego:

powiedzmy, że twoja struktura modułu jest

root-module
 -> a-module
 -> b-module

a test (testToRun), który chcesz uruchomić, jest w module b, z pełną ścieżką: com.xyz.b.module.TestClass.testToRun

Ponieważ tutaj jesteś zainteresowany uruchomieniem testu w b-module, więc powinieneś zobaczyć zadania dostępne dla b-modułu.

./gradlew :b-module:tasks

Powyższe polecenie wyświetli listę wszystkich zadań w b-module z opisem. W idealnym przypadku będziesz mieć zadanie o nazwie test, aby uruchomić testy jednostkowe w tym module.

./gradlew :b-module:test

Teraz osiągnąłeś punkt uruchomienia wszystkich testów w module b, w końcu możesz przekazać parametr do powyższego zadania, aby uruchomić testy, które pasują do określonego wzorca ścieżki

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

Teraz zamiast tego, jeśli uruchomisz

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

Uruchomi to zadanie testowe zarówno dla modułu a i b, co może doprowadzić do niepowodzenia, ponieważ nic nie pasuje do powyższego wzorca w module a.


1
Lub po prostu./gradlew :b-module:test --tests testToRun
Ahmed Ashour

32

Po wielu rozmyślaniach, dla mnie zadziałało:

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


10
to polecenie nie działa dla mnie. > Błąd: Nieznana opcja wiersza polecenia „--tests”
Tarkik

31

Pamiętaj, że --testsopcja może nie działać, jeśli masz inną kompilację types/flavors(nie działa Unknown command-line option '--tests'). W takim przypadku konieczne jest określenie konkretnego zadania testowego (np. testProdReleaseUnitTestZamiast po prostu test)


6
Wpadłem na tę dokładną sytuację Dzięki!
JPM

Czy potrafisz podać pełny przykład? Próbuję uruchomić 3 testy, które pasują do znaku wieloznacznego ./gradlew test --tests *testMyCollectionTake*i nie wiem, jak mam zastąpić testgo testowym
znakiem

4

Poniżej znajduje się polecenie uruchomienia jednej klasy testowej przy użyciu gradlewopcji wiersza polecenia:

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

Poniżej przykład uruchomienia klasy com.example.TestClassz wariantem Variant_1:

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

2

Powinieneś spróbować dodać gwiazdkę (*) na końcu.

test stopniowy - testy „com.abc *”


2

Uruchom pojedynczy test o nazwie MyTest:

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

0

W moim przypadku ostrzeżenia mojego kompilatora Java Eclipse zostały ustawione zbyt wysoko, a środowisko Eclipse nie rozpoznało mojej klasy jako ważnej do wykonania. Aktualizacja ustawień mojego kompilatora naprawiła problem. Możesz przeczytać więcej na ten temat tutaj: adnotacja-nonnull-nie można rozwiązać

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.