AndroidJUnitRunner

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 AutomatorCompose.

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

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

Narzędzie Orchestrator umożliwia kontrolowanie testów JUnit
Rysunek 1. Struktura pliku APK sterowania testami Androida.

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