Compose lässt sich in gängige Test-Frameworks einbinden.
Interoperabilität mit Espresso
In einer Hybrid-App finden Sie Compose-Komponenten in Ansichtshierarchien und Ansichten in Compose-Kompositen (über das AndroidView
-Komposit).
Für beide Typen sind keine speziellen Schritte erforderlich. Ansichten werden mit dem onView
von Espresso abgeglichen und Elemente werden mit dem ComposeTestRule
komponiert.
@Test
fun androidViewInteropTest() {
// Check the initial state of a TextView that depends on a Compose state.
Espresso.onView(withText("Hello Views")).check(matches(isDisplayed()))
// Click on the Compose button that changes the state.
composeTestRule.onNodeWithText("Click here").performClick()
// Check the new value.
Espresso.onView(withText("Hello Compose")).check(matches(isDisplayed()))
}
Interoperabilität mit UiAutomator
Standardmäßig können Sie über UiAutomator nur über die praktischen Beschreibungen (angezeigter Text, Inhaltsbeschreibung usw.) auf Composeables zugreifen. Wenn Sie auf ein Composable zugreifen möchten, das Modifier.testTag
verwendet, müssen Sie die semantische Eigenschaft testTagsAsResourceId
für den untergeordneten Knoten des jeweiligen Composables aktivieren. Das Aktivieren dieses Verhaltens ist nützlich für Elemente, die keinen anderen eindeutigen Handle haben, z. B. scrollbare Elemente (z. B. LazyColumn
).
Aktivieren Sie die semantische Eigenschaft nur einmal hoch in der Hierarchie Ihrer Composeables, damit alle verschachtelten Composeables mit Modifier.testTag
über UiAutomator zugänglich sind.
Scaffold(
// Enables for all composables in the hierarchy.
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
){
// Modifier.testTag is accessible from UiAutomator for composables nested here.
LazyColumn(
modifier = Modifier.testTag("myLazyColumn")
){
// Content
}
}
Auf alle Elemente, die mit dem Modifier.testTag(tag)
erstellt wurden, kann mithilfe von By.res(resourceName)
zugegriffen werden. Dabei wird dieselbe tag
wie für das resourceName
verwendet.
val device = UiDevice.getInstance(getInstrumentation())
val lazyColumn: UiObject2 = device.findObject(By.res("myLazyColumn"))
// Some interaction with the lazyColumn.
Zusätzliche Ressourcen
- Apps unter Android testen: Die Haupt-Landingpage für Android-Tests bietet einen umfassenderen Überblick über die Grundlagen und Techniken des Testens.
- Grundlagen des Testens:Hier erfahren Sie mehr über die grundlegenden Konzepte beim Testen einer Android-App.
- Lokale Tests:Einige Tests können Sie lokal auf Ihrer eigenen Workstation ausführen.
- Instrumentierte Tests:Es empfiehlt sich, auch instrumentierte Tests auszuführen. Das sind Tests, die direkt auf dem Gerät ausgeführt werden.
- Continuous Integration: Mit Continuous Integration können Sie Ihre Tests in Ihre Bereitstellungspipeline einbinden.
- Unterschiedliche Bildschirmgrößen testen:Da Nutzern eine Vielzahl von Geräten zur Verfügung steht, sollten Sie verschiedene Bildschirmgrößen testen.
- Espresso: Obwohl Espresso für viewbasierte UIs gedacht ist, können Kenntnisse zu Espresso auch für einige Aspekte von Compose-Tests hilfreich sein.