Aktivitäten dienen als Container für jede Nutzerinteraktion in Ihrer App. ist es wichtig, das Verhalten der App-Aktivitäten auf Geräteebene wie die folgenden:
- Eine andere App, z. B. die Telefon-App des Geräts, stört die App-Aktivitäten.
- Das System zerstört und reproduziert deine Aktivitäten.
- Der Nutzer platziert Ihre Aktivität in einer neuen Fensterumgebung, z. B. Bild im Bild (BiB) oder Mehrfenstermodus.
Insbesondere ist es wichtig sicherzustellen, dass Ihre Aktivitäten in Reaktion auf die unter Die Aktivität Lebenszyklus.
In diesem Leitfaden wird beschrieben, wie Sie die Fähigkeit Ihrer App zur Verwaltung von Daten bewerten Integrität und Nutzerfreundlichkeit zu verbessern, wenn sich die Aktivitäten Ihrer App verschiedene Stadien ihres Lebenszyklus durchlaufen.
Status einer Aktivität bestimmen
Ein wichtiger Aspekt beim Testen der Aktivitäten Ihrer App ist das Platzieren der
Aktivitäten in bestimmten Bundesstaaten. Um dies zu definieren, verwenden, verwenden Sie
Instanzen von ActivityScenario
,
Teil des
AndroidX-Testbibliothek. In diesem Kurs können Sie Folgendes tun:
Ihre Aktivitäten in Status einordnen, die Ereignisse auf Geräteebene simulieren.
ActivityScenario
ist eine plattformübergreifende API, die Sie in lokalen Einheitentests verwenden können
und On-Device-Integrationstests gleichermaßen. Auf einem echten oder virtuellen Gerät
ActivityScenario
bietet Thread-Sicherheit und synchronisiert Ereignisse zwischen Ihrem
den Instrumentierungs-Thread des Tests und den Thread, der die zu testende Aktivität ausführt.
Die API eignet sich besonders gut, um zu beurteilen, wie eine Aktivität unter verhält sich der Test, wenn er gelöscht oder erstellt wird. In diesem Abschnitt werden die gängigsten Anwendungsfälle im Zusammenhang mit dieser API.
Aktivität erstellen
Fügen Sie zum Erstellen der zu testenden Aktivität den im folgenden Snippet gezeigten Code hinzu:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
Nachdem die Aktivität erstellt wurde, übergibt ActivityScenario
sie in den
RESUMED
. Dieser Status zeigt an, dass Ihre Aktivität läuft und
für Nutzer sichtbar. In diesem Status können Sie mit den Funktionen
View
-Elemente mithilfe von Espresso-UI-Tests
Google empfiehlt, beim Test close
für die Aktivität aufzurufen
abgeschlossen wird. Dadurch werden die verknüpften Ressourcen bereinigt und die
die Stabilität Ihrer Tests. ActivityScenario
implementiert Closeable
, sodass Sie Folgendes tun können:
Anwendung der Erweiterung use
oder try-with-resources
in der Java-Programmierung
sodass die Aktivität automatisch beendet wird.
Alternativ können Sie mit ActivityScenarioRule
automatisch einen Anruf
ActivityScenario.launch
vor jedem Test und ActivityScenario.close
beim Teardown. Das folgende Beispiel zeigt, wie Sie eine Regel definieren und eine
Instanz eines Szenarios daraus:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
Aktivität ändern
Wenn Sie die Aktivität ändern möchten, z. B. CREATED
oder STARTED
, rufen Sie
moveToState()
Diese Aktion simuliert eine Situation, in der deine Aktivität
weil die Wiedergabe durch eine andere App oder einen
Systemaktion.
Das folgende Code-Snippet enthält ein Beispiel für die Verwendung von moveToState()
:
@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
state
-Feld innerhalb des ActivityScenario
-Objekts. Es ist besonders hilfreich,
um den Status einer zu testenden Aktivität zu prüfen, wenn die Aktivität auf
eine andere Aktivität ausführen oder sich selbst beendet, wie im folgenden Code
snippet:
@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 wenig Ressourcen zur Verfügung stehen, zerstört das System möglicherweise eine Aktivität.
Ihre App muss diese 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() } } }
Die Klasse ActivityScenario
behält den gespeicherten Instanzstatus der Aktivität und
Alle Objekte, die mit @NonConfigurationInstance
annotiert sind. Diese Objekte werden geladen
in die neue Instanz der zu testenden Aktivität.
Aktivitätsergebnisse abrufen
Um den Ergebniscode oder die Daten für eine abgeschlossene Aktivität zu erhalten, rufe den
des Felds result
in Ihrem ActivityScenario
-Objekt, wie in
das folgende Code-Snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
Aktionen in der Aktivität auslösen
Alle Methoden in ActivityScenario
blockieren Aufrufe, daher benötigt die API
um sie im Instrumentierungs-Thread auszuführen.
Wenn Sie Aktionen in der getesteten Aktivität auslösen möchten, verwenden Sie Espresso-Matcher, um mit Elementen in Ihrer Ansicht interagieren:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
Wenn Sie jedoch eine Methode für die Aktivität selbst aufrufen müssen, können Sie dies tun.
indem Sie ActivityAction
implementieren:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }