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.

bula
źródło
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.

Maleen Abewardana
źródło
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.

airborn
źródło
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.

greperror
źródło
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"

Pratik Khadloya
źródło
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)

anagaf
źródło
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 
Naveenprasanth Duraisamy
źródło
2

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

test stopniowy - testy „com.abc *”

mutkan
źródło
2

Uruchom pojedynczy test o nazwie MyTest:

./gradlew app:testDebug --tests=com.example.MyTest
kreker
źródło
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ć

Greg
źródło