AndroidJUnitRunner

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

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 flagi clearPackageData. 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:

  1. Umieść niezbędne pakiety w pliku kompilacji aplikacji.
  2. 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:

Administrator umożliwia kontrolowanie testów JUnit
Rysunek 1. Struktura pliku APK do administrowania testami w Androidzie.

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