Klasa AndroidJUnitRunner
jest narzędziem testowym JUnit, które umożliwia przeprowadzanie z instrumentacją testów JUnit 4 na urządzeniach z Androidem, w tym na platformach testowych Espresso, UI Automator i Compose.
Uruchamiający test obsługuje wczytanie pakietu testowego i testowanej aplikacji na urządzenie, uruchamianie testów i zgłaszanie ich wyników.
Ten uruchamiający test obsługuje kilka typowych zadań testowania, takich jak:
- Pisanie testów JUnit
- Uzyskiwanie dostępu do kontekstu aplikacji
- Testy filtrowania
- Testy fragmentacji
Pisanie testów JUnit
Poniższy fragment kodu pokazuje, jak możesz napisać instrumentowany test JUnit 4, aby sprawdzić, czy operacja changeText
w klasie ChangeTextBehavior
działa prawidłowo:
Kotlin
@RunWith(AndroidJUnit4::class) // Only needed when mixing JUnit 3 and 4 tests @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) // Only needed when mixing JUnit 3 and 4 tests @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
Jeśli przeprowadzasz testy za pomocą metody AndroidJUnitRunner
, możesz uzyskać dostęp do kontekstu testowanej aplikacji, wywołując metodę statyczną ApplicationProvider.getApplicationContext()
. Jeśli w aplikacji masz utworzoną niestandardową podklasę Application
, ta metoda zwraca kontekst podklasy niestandardowej.
Jeśli implementujesz narzędzia, możesz uzyskać dostęp do interfejsów API niskiego poziomu za pomocą klasy InstrumentationRegistry
. Ta klasa zawiera obiekt Instrumentation
, obiekt aplikacji docelowej Context
, obiekt testowy aplikacji Context
oraz argumenty wiersza poleceń przekazane do testu.
Filtruj testy
W testach JUnit 4.x możesz użyć adnotacji, aby skonfigurować uruchomienie testowe. Ta funkcja minimalizuje konieczność dodawania do testów kodu stałego i warunkowego. Oprócz standardowych adnotacji obsługiwanych przez JUnit 4 system uruchamiający test obsługuje również adnotacje specyficzne dla Androida, w tym:
@RequiresDevice
: określa, że test powinien być przeprowadzany tylko na urządzeniach fizycznych, a nie w emulatorach.@SdkSuppress
: powstrzymuje uruchomienie testu na niższym poziomie interfejsu API Androida niż dany poziom. Aby na przykład wstrzymać testy na wszystkich poziomach interfejsu API niższych niż 23, użyj adnotacji@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
i@LargeTest
: określ, jak długo ma trwać test, a tym samym, jak często ma być przeprowadzany. Możesz użyć tej adnotacji do określenia, które testy należy uruchomić, ustawiając właściwośćandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
Testy fragmentów
Jeśli musisz przeprowadzać testy równolegle i udostępniać je wielu serwerom, aby przebiegały szybciej, możesz je podzielić na grupy lub fragmenty. Uruchamiający test obsługuje dzielenie jednego pakietu testowego na wiele fragmentów, co pozwala łatwo uruchamiać testy należące do tego samego fragmentu razem jako grupa. Każdy fragment jest identyfikowany numerem indeksu. Podczas testów użyj opcji -e numShards
, aby określić liczbę osobnych fragmentów do utworzenia i -e shardIndex
, aby wskazać fragment do uruchomienia.
Aby na przykład podzielić pakiet testowy na 10 fragmentów i uruchomić tylko testy pogrupowane w drugim fragmencie, użyj tego polecenia adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Użyj narzędzia Android Test Orchestrator
Android Test Orchestrator pozwala uruchamiać każdy test aplikacji we własnym wywołaniu Instrumentation
. Jeśli używasz AndroidaJUnitRunner w wersji 1.0 lub nowszej, masz dostęp do narzędzia Android Test Orchestrator.
Android Test Orchestrator zapewnia następujące korzyści dla środowiska testowego:
- Minimalny stan udostępniania: każdy test działa we własnej instancji
Instrumentation
. Dlatego, jeśli testy mają ten sam stan aplikacji, po każdym teście większość udostępnionego stanu jest usuwana z CPU lub pamięci urządzenia. Aby po każdym teście usunąć cały udostępniony stan z CPU i pamięci urządzenia, użyj flagiclearPackageData
. Przykład znajdziesz w sekcji Włączanie z Gradle. - Awarie są izolowane: nawet jeśli podczas jednego testu występują awarie, usuwane są tylko własne wystąpienie
Instrumentation
. Oznacza to, że pozostałe testy w pakiecie są nadal prowadzone, zapewniając pełne wyniki.
Ta izolacja może wydłużyć czas wykonywania testu, ponieważ Android Test Orchestrator ponownie uruchamia aplikację po każdym teście.
Zarówno Android Studio, jak i Laboratorium Firebase mają wstępnie zainstalowany Android Test Orchestrator, ale musisz włączyć tę funkcję w Android Studio.
Włącz z Gradle
Aby włączyć Android Test Orchestrator za pomocą narzędzia wiersza poleceń Gradle, wykonaj te czynności:
- Krok 1. Zmodyfikuj plik Gradle. Dodaj te instrukcje do pliku
build.gradle
projektu:
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łącz w Android Studio
Aby włączyć narzędzie Android Test Orchestrator w Android Studio, dodaj instrukcje podane w instrukcjach Włącz z Gradle do pliku build.gradle
aplikacji.
Włącz z wiersza poleceń
Aby użyć narzędzia Android Test Orchestrator w wierszu poleceń, uruchom te polecenia w oknie terminala:
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 poleceń, musisz zainstalować Android Test Orchestrator, a potem bezpośrednio z niego korzystać.
adb shell pm list instrumentation
Używanie różnych łańcuchów narzędzi
Jeśli do testowania aplikacji używasz innego łańcucha narzędzi, możesz użyć narzędzia Android Test Orchestrator, wykonując te czynności:
- Umieść niezbędne pakiety w pliku kompilacji aplikacji.
- Włącz Android Test Orchestrator z poziomu wiersza poleceń.
Architektura
Plik APK usługi Orchestrator jest przechowywany w procesie innym niż testowy plik APK i plik APK testowanej aplikacji:
Android Test Orchestrator zbiera testy JUnit na początku uruchamiania pakietu testowego, ale potem wykonuje każdy test oddzielnie we własnej instancji Instrumentation
.
Więcej informacji
Więcej informacji o korzystaniu z AndroidJUnitRunner znajdziesz w dokumentacji interfejsu API.
Dodatkowe materiały
Więcej informacji o korzystaniu z AndroidJUnitRunner
znajdziesz w tych materiałach.
Próbki
- AndroidJunitRunnerSample: prezentuje adnotacje testowe, testy z parametrami i tworzenie pakietu testowego.