Aktivitäten der App testen

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()
            }
        }
    }
}