Klasa AndroidJUnitRunner
to narzędzie do testowania JUnit, które umożliwia uruchamianie testów JUnit 4 z instrumentacją na urządzeniach z Androidem, w tym testów korzystających z ramek testowych Espresso, UI Automator i Compose.
Uruchamiacz testów odpowiada za wczytywanie pakietu testów i aplikacji poddawanej testom na urządzeniu, uruchamianie testów i raportowanie wyników.
Ten test runner obsługuje kilka typowych zadań testowych, w tym:
Pisanie testów JUnit
Ten fragment kodu pokazuje, jak napisać test JUnit 4 z instrumentacją, aby sprawdzić, czy operacja changeText
w klasie ChangeTextBehavior
działa prawidłowo:
Kotlin
@RunWith(AndroidJUnit4::class) @LargeTest // Optional runner annotation class ChangeTextBehaviorTest { val stringToBeTyped = "Espresso" // ActivityTestRule accesses context through the runner @get:Rule val activityRule = ActivityTestRule(MainActivity::class.java) @Test fun changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()) onView(withId(R.id.changeTextBt)).perform(click()) // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))) } }
Java
@RunWith(AndroidJUnit4.class) @LargeTest // Optional runner annotation public class ChangeTextBehaviorTest { private static final String stringToBeTyped = "Espresso"; @Rule public ActivityTestRule<MainActivity>; activityRule = new ActivityTestRule<>;(MainActivity.class); @Test public void changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()); onView(withId(R.id.changeTextBt)).perform(click()); // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))); } }
Dostęp do kontekstu aplikacji
Gdy używasz do testowania narzędzia AndroidJUnitRunner
, możesz uzyskać dostęp do kontekstu aplikacji, której dotyczy test, wywołując stałą metodę ApplicationProvider.getApplicationContext()
. Jeśli w aplikacji utworzysz niestandardową podklasę klasy Application
, ta metoda zwróci kontekst tej podklasy.
Jeśli jesteś implementatorem narzędzi, możesz uzyskać dostęp do interfejsów API testowania na niższym poziomie za pomocą klasy InstrumentationRegistry
. Ta klasa zawiera obiekt Instrumentation
, obiekt aplikacji docelowej Context
, obiekt aplikacji testowej Context
oraz argumenty wiersza poleceń przekazane do testu.
Testy filtra
W testach JUnit 4.x możesz używać adnotacji do konfigurowania wykonywania testu. Ta funkcja minimalizuje potrzebę dodawania w testach szablonów i kodu warunkowego. Oprócz standardowych adnotacji obsługiwanych przez JUnit 4 test runner obsługuje też adnotacje specyficzne dla Androida, w tym:
@RequiresDevice
: określa, że test powinien być przeprowadzany tylko na fizycznych urządzeniach, a nie na emulatorach.@SdkSuppress
: uniemożliwia uruchamianie testu na niższym poziomie interfejsu API Androida niż podany poziom. Aby na przykład zablokować uruchamianie testów na wszystkich poziomach interfejsu API niższych niż 23, użyj adnotacji@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
i@LargeTest
: określ, jak długo powinien trwać test i jak często możesz go przeprowadzać. Za pomocą tej adnotacji możesz filtrować testy, które mają być wykonywane, ustawiając właściwośćandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
Testy w ramach wspólnego projektu
Jeśli chcesz równolegle wykonywać testy, dzieląc je na kilka serwerów, aby przyspieszyć ich działanie, możesz je podzielić na grupy lub podzbiory. Narzędzie do uruchamiania testów umożliwia podzielenie jednego pakietu testów na wiele części, dzięki czemu można łatwo uruchamiać testy należące do tego samego fragmentu jako grupy. Każdy fragment jest identyfikowany za pomocą numeru indeksu. Podczas wykonywania testów użyj opcji -e numShards
, aby określić liczbę tworzonych oddzielnych fragmentów, i opcji -e shardIndex
, aby określić, który fragment ma być uruchomiony.
Aby na przykład podzielić zestaw testów na 10 fragmentów i uruchomić tylko testy zgrupowane w 2. fragmentach, użyj tego polecenia adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Korzystanie z Android Test Orchestrator
Narzędzie Android Test Orchestrator umożliwia uruchamianie poszczególnych testów aplikacji w ramach ich własnych wywołań Instrumentation
. Jeśli używasz wersji 1.0 lub nowszej narzędzia AndroidJUnitRunner, masz dostęp do narzędzia Android Test Orchestrator.
Android Test Orchestrator zapewnia następujące korzyści dla środowiska testowego:
- Minimalny stan współdzielony: każdy test jest wykonywany w osobnej instancji
Instrumentation
. Dlatego jeśli testy udostępniają stan aplikacji, większość tego stanu jest usuwana z procesora lub pamięci urządzenia po każdym teście. Aby po każdym teście usunąć cały stan współdzielony z procesora i pamięci urządzenia, użyj flagiclearPackageData
. Przykład znajdziesz w sekcji Włączanie z Gradle. - Błędy są izolowane: nawet jeśli jeden test ulegnie awarii, powoduje to wyłączenie tylko jego własnej instancji
Instrumentation
. Oznacza to, że inne testy w Twoim zestawie nadal się wykonują i zapewniają pełne wyniki.
Ta izolacja może spowodować wydłużenie czasu wykonywania testu, ponieważ Android Test Orchestrator uruchamia aplikację po każdym teście.
Zarówno Android Studio, jak i Firebase Test Lab mają wstępnie zainstalowany Android Test Orchestrator, ale musisz włączyć tę funkcję w Android Studio.
Włączanie w Gradle
Aby włączyć Android Test Orchestrator za pomocą narzędzia wiersza poleceń Gradle, wykonaj te czynności:
- Krok 1. Zmodyfikuj plik gradle. Dodaj do pliku
build.gradle
projektu te instrukcje:
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
}
dependencies {
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestUtil 'androidx.test:orchestrator:1.1.0'
}
- Krok 2. Uruchom Android Test Orchestrator, wykonując to polecenie:
./gradlew connectedCheck
Włączanie w Android Studio
Aby włączyć Android Test Orchestrator w Android Studio, dodaj do pliku build.gradle
aplikacji instrukcje podane w sekcji Włączanie z Gradle.
Włączanie z poziomu wiersza poleceń
Aby używać Android Test Orchestrator w wierszu poleceń, uruchom w oknie terminala te polecenia:
DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)
FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
FORCE_QUERYABLE_OPTION="--force-queryable"
fi
# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator
# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk
# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.apk
# Replace "com.example.test" with the name of the package containing your tests.
# Add "-e clearPackageData true" to clear your app's data in between runs.
adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
androidx.test.orchestrator/.AndroidTestOrchestrator'
Jak widać w składni polecenia, najpierw instalujesz Android Test Orchestrator, a potem używasz go bezpośrednio.
adb shell pm list instrumentation
Korzystanie z różnych łańcuchów narzędzi
Jeśli do testowania aplikacji używasz innego zestawu narzędzi, nadal możesz korzystać z Android Test Orchestrator. Aby to zrobić, wykonaj te czynności:
- Uwzględnij w pliku kompilacji aplikacji niezbędne pakiety.
- Włącz Android Test Orchestrator z poziomu wiersza poleceń.
Architektura
Plik APK usługi Orchestrator jest przechowywany w procesie oddzielnym od testowego pliku APK i pliku APK aplikacji, której dotyczy test:
Na początku testowania zbioru testów Android Test Orchestrator zbiera testy JUnit, ale następnie wykonuje każdy test osobno w osobnym wystąpieniu Instrumentation
.
Więcej informacji
Więcej informacji o używaniu AndroidJUnitRunner znajdziesz w dokumentacji API.
Dodatkowe materiały
Więcej informacji o używaniu AndroidJUnitRunner
znajdziesz w tych materiałach.
Próbki
- AndroidJunitRunnerSample: przykłady adnotacji testów, testów parametrycznych i tworzenia zestawów testów.