Aktivitäten dienen als Container für jede Nutzerinteraktion in Ihrer App. Daher ist es wichtig, zu testen, wie sich die Aktivitäten Ihrer App bei Ereignissen auf Geräteebene verhalten, z. B. bei folgenden:
- Eine andere App, z. B. die Telefon App des Geräts, unterbricht die Aktivität Ihrer App.
- Das System beendet und startet Ihre Aktivität neu.
- Der Nutzer platziert Ihre Activity in einer neuen Windowing-Umgebung, z. B. im Bild-im-Bild-Modus (BiB) oder im Mehrfenstermodus.
Insbesondere ist es wichtig, dass sich Ihre Aktivität korrekt verhält, wenn die in Aktivitätslebenszyklus beschriebenen Ereignisse eintreten.
In dieser Anleitung wird beschrieben, wie Sie die Fähigkeit Ihrer App bewerten können, die Datenintegrität und eine gute Nutzererfahrung aufrechtzuerhalten, wenn die Aktivitäten Ihrer App in ihren Lebenszyklen verschiedene Status durchlaufen.
Aktivitäten in Compose testen
Wenn Sie eine mit Jetpack Compose erstellte App testen, verwenden Sie in der Regel createAndroidComposeRule, um Ihre Aktivität zu starten und mit Ihren UI-Komponenten zu interagieren.
Wenn Sie jedoch Ereignisse auf Geräteebene testen möchten, z. B. Konfigurationsänderungen oder das Versetzen der Aktivität in den Hintergrund oder das Beenden der Aktivität durch das System, müssen Sie den Lebenszyklus der Aktivität direkt manipulieren. Dazu verwenden Sie das zugrunde liegende ActivityScenario-Framework.
Die Compose-Testregel übernimmt das automatische Umschließen und Verwalten dieses Szenarios für Sie. In diesem Leitfaden wird das folgende Muster verwendet, um die Lücke zwischen modernen UI-Tests und dem Standard-Lebenszyklusmanagement zu schließen:
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
val scenario = composeTestRule.activityRule.scenario
// ...
}
Status einer Aktivität ändern
Ein wichtiger Aspekt beim Testen der Aktivitäten Ihrer App ist, dass Sie die Aktivitäten in bestimmte Zustände versetzen. Um diesen „gegebenen“ Teil Ihrer Tests zu definieren, verwenden Sie Instanzen von ActivityScenario, die Teil der AndroidX Test-Bibliothek sind. Mit dieser Klasse können Sie Ihre Aktivität in Zustände versetzen, die Ereignisse auf Geräteebene simulieren.
ActivityScenario ist eine plattformübergreifende API, die Sie sowohl in lokalen Unit-Tests als auch in On-Device-Integrationstests verwenden können. Auf einem echten oder virtuellen Gerät bietet ActivityScenario Threadsicherheit, indem Ereignisse zwischen dem Instrumentation-Thread Ihres Tests und dem Thread synchronisiert werden, in dem die zu testende Aktivität ausgeführt wird.
Die API eignet sich besonders gut, um zu bewerten, wie sich eine zu testende Aktivität verhält, wenn sie zerstört oder erstellt wird. In diesem Abschnitt werden die häufigsten Anwendungsfälle für diese API beschrieben.
Aktivität erstellen
Fügen Sie den Code im folgenden Snippet hinzu, um die zu testende Aktivität zu erstellen:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use {
}
}
}
Nachdem die Aktivität erstellt wurde, wird sie von ActivityScenario in den Status RESUMED versetzt. Dieser Status gibt an, dass Ihre Aktivität ausgeführt wird und für Nutzer sichtbar ist. In diesem Status können Sie mit den Composables Ihrer Aktivität über die Compose-Test-APIs interagieren.
Google empfiehlt, close für die Aktivität aufzurufen, wenn der Test abgeschlossen ist.
Dadurch werden die zugehörigen Ressourcen bereinigt und die Stabilität Ihrer Tests verbessert. ActivityScenario implementiert Closeable. Sie können also die Erweiterung use verwenden, damit die Aktivität automatisch geschlossen wird.
Alternativ können Sie createAndroidComposeRule verwenden, um die Activity vor jedem Test automatisch zu starten, die Bereinigung durchzuführen und Ihnen Zugriff auf die Compose UI-Testmethoden und das zugrunde liegende ActivityScenario zu gewähren. Im folgenden Beispiel wird gezeigt, wie Sie eine Regel definieren und eine Instanz eines Szenarios daraus abrufen:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
val scenario = composeTestRule.activityRule.scenario
}
}
Aktivität in einen neuen Status versetzen
Um die Aktivität in einen anderen Status zu versetzen, z. B. CREATED oder STARTED, rufen Sie moveToState auf. Mit dieser Aktion wird eine Situation simuliert, in der deine Aktivität beendet oder pausiert wird, weil sie durch eine andere App oder eine Systemaktion unterbrochen wird.
Ein Beispiel für die Verwendung von moveToState finden Sie im folgenden Code-Snippet:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use { scenario ->
scenario.moveToState(State.CREATED)
}
}
}
Aktuellen Aktivitätsstatus ermitteln
Um den aktuellen Status einer zu testenden Aktivität zu ermitteln, rufen Sie den Wert des Felds state in Ihrem ActivityScenario-Objekt ab. Es ist besonders hilfreich, den Status einer Aktivität zu prüfen, die getestet wird, wenn die Aktivität zu einer anderen Aktivität weitergeleitet wird oder selbst beendet wird, wie im folgenden Code-Snippet gezeigt:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use { scenario ->
scenario.onActivity { activity ->
startActivity(Intent(activity, MyOtherActivity::class.java))
}
val originalActivityState = scenario.state
}
}
}
Aktivität neu erstellen
Wenn auf einem Gerät nur noch wenige Ressourcen verfügbar sind, kann das System eine Aktivität beenden. In diesem Fall muss Ihre App die Aktivität neu erstellen, wenn der Nutzer zu Ihrer App zurückkehrt. Rufen Sie recreate auf, um diese Bedingungen zu simulieren:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use { scenario ->
scenario.recreate()
}
}
}
In der Klasse ActivityScenario werden der gespeicherte Instanzstatus der Aktivität und alle mit @NonConfigurationInstance annotierten Objekte verwaltet. Diese Objekte werden in die neue Instanz der zu testenden Aktivität geladen.
Aktivitätsergebnisse abrufen
Wenn Sie den Ergebniscode oder die Daten einer abgeschlossenen Aktivität abrufen möchten, rufen Sie den Wert des Felds result in Ihrem ActivityScenario-Objekt ab. Mit createAndroidComposeRule können Sie ganz einfach die UI-Aktion auslösen, die die Aktivität beendet, wie im folgenden Code-Snippet gezeigt:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testResult() {
composeTestRule.onNodeWithTag("finish_button").performClick()
val scenario = composeTestRule.activityRule.scenario
val resultCode = scenario.result.resultCode
val resultData = scenario.result.resultData
}
}
Aktionen in der Aktivität auslösen
Alle Methoden in ActivityScenario sind blockierende Aufrufe. Daher müssen Sie sie im Instrumentation-Thread ausführen.
Verwenden Sie Compose-Test-APIs, um mit Ihren Composables zu interagieren und Aktionen in der zu testenden Aktivität auszulösen:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
composeTestRule.onNodeWithText("Refresh").performClick()
}
}
Wenn Sie jedoch eine Methode für die Aktivität selbst aufrufen müssen, können Sie dies sicher mit onActivity tun:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use { scenario ->
scenario.onActivity { activity ->
activity.handleSwipeToRefresh()
}
}
}
}
Zusätzliche Ressourcen
Weitere Informationen zum Testen finden Sie in den folgenden zusätzlichen Ressourcen: