Zdezorientowany testCompile i androidTestCompile w Android Gradle

87

Jestem nowy w świecie testowania, a jeszcze bardziej w świecie testowania Androida. Podczas badań nad Robolectric, które pomagają w testach na Androidzie, jedna rzecz najbardziej mnie dezorientuje. Czasami w Internecie widzę ludzi używających testCompilesłowa kluczowego w zależnościach skryptu budującego gradle podczas odwoływania się do Robolectric, podczas gdy inni używają androidTestCompile. Z pewnością oba nie mogą być ważne?

Czy ktoś może wyjaśnić różnicę między obydwoma i które z nich powinny być używane podczas korzystania z Robolectric?

Lucas
źródło

Odpowiedzi:

120

Po prostu testCompilejest to konfiguracja dla testów jednostkowych (tych znajdujących się w src / test ) i androidTestCompilejest używana dla testowego interfejsu API (znajdującego się w src / androidTest ). Ponieważ zamierzasz pisać testy jednostkowe, powinieneś użyć testCompile.

Aktualizacja: główną testróżnicą między nimi jest zestaw źródeł uruchamiany na zwykłej JVM Java, podczas gdy androidTesttesty zestawu źródeł działają na urządzeniu z Androidem (lub emulatorze).

Mark Vieira
źródło
Dzięki. To właśnie pomyślałem na początku, ale jeśli tak jest, dlaczego niektóre referencyjne zależności robolectric z testCompile, a niektóre z androidTestCompile. Czy to nie jest biblioteka, która pomaga pisać testy integracyjne? Jeśli tak, to czy nie powinno się do niego odwoływać za pomocą androidTestCompile? Jednak nawet oficjalny przewodnik po robolectric zaleca użycie testCompile ... Przepraszam, ale jest to dla mnie zbyt zagmatwane, jak widzisz.
Lucas
3
Konwencje nazewnictwa są trochę dziwne. Zasadniczo, jeśli piszesz testy jednostkowe (testy, które nie zostaną uruchomione na urządzeniu), będą istniały w 'src / test' i dlatego ich zależności należą do testCompilekonfiguracji. Zależności dodane do androidTestCompilekonfiguracji będą dostępne tylko dla źródła w „src / androidTest”, które jest faktycznie wbudowane w plik APK i wdrażane na urządzeniu.
Mark Vieira
Dzięki za wskazanie mi jakiegoś kierunku. Nie odpowiedział na wszystkie moje pytania, ale pomógł mi w badaniach. Aby wyjaśnić, co powiedziałeś, testy jednostkowe to nie tylko te w folderze testowym (domyślnie). Jak na ironię, Google czasami wywołuje testy znajdujące się w androidTest również jako testy jednostkowe. Zależy to oczywiście od celu danego testu, ale nadal zwiększa zamieszanie.
Lucas
1
To głównie semantyka, więc nie będę się na nich rozłączał. Wiele testów napisanych w Roboelectric to prawdopodobnie testy integracyjne, a nie testy jednostkowe. To powiedziawszy, główna różnica między nimi polega na tym, że „src / test” działa na komputerze dewelopera w standardowej maszynie JVM, a „src / androidTest” jest spakowany w pakiecie APK i uruchamiany na rzeczywistym urządzeniu (lub emulatorze).
Mark Vieira
1
Myślę, że wsparcie dla 'src / test', które widzieliście wcześniej, było po prostu tym, które było dostępne za pośrednictwem standardowej wtyczki Gradle Java. Dlatego nie było wsparcia dla smaków lub typów kompilacji. Teraz wtyczka dla systemu Android w pełni obsługuje testy jednostkowe, w tym zestawy źródeł testów jednostkowych dla poszczególnych wariantów.
Mark Vieira
3

Aby odpowiedzieć na twoje pytanie - użyj testCompile dla robolectric

dlaczego, ponieważ robolectric działa na JVM, szydząc z zachowania urządzenia z Androidem.

testCompile i androidTestCompile to foldery systemu Android, których używa Gradle podczas wykonywania zadań udostępnianych przez wtyczkę dla Androida.

androidTestDebug wybiera testy z folderu androidTest, testDebug wybiera testy z folderu test,

Ponownie, są to tylko foldery konwencji, które możesz podać zestawy źródłowe dla tych konfiguracji

Uwaga: espresso to niesamowita biblioteka, spróbuj odejść od robolectric :)

Amit Kaushik
źródło
1

//testów jednostkowych

testCompile 'junit:junit:4.12'

Powyższy kod jest zależnością JUnit 4 w pliku build.gradle w Android Studio. Widzisz, że ma testCompile, ponieważ JUnit działa na JVM i nie wymaga do uruchomienia urządzenia ani emulatora. Oznacza to również, że testy JUnit nie będą wymagały do ​​uruchomienia kontekstu aplikacji, a jeśli będą wymagały, musielibyśmy je "MOCK".

// Insturmented Unit Testing

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Teraz widzimy tutaj androidTestCompile, ponieważ tym razem zamierzamy użyć urządzenia lub emulatora do testów, czyli testowania Instrumentacji. Aby uzyskać lepsze wyjaśnienie, proponuję przeczytać na stronie developer.android.com

Lazycoder_007
źródło
0

Aby dodać zależności dla testów JVM lub testów jednostkowych (testowanie tych opiera się tylko na środowisku java, nie potrzebujemy żadnego środowiska Android).

Używamy dyrektywy testCompile. Przykład:

dependencies {
    testCompile gradleTestKit()
}

Aby dodać zależność do testu instrumentacji (te testy polegają głównie na środowisku Android), używamy androidTestCompiledyrektywy.

Subhasish Nath
źródło