Interoperabilität

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-Composable-Funktionen (über die AndroidView-Composable-Funktion).

Für die beiden Typen sind keine besonderen Schritte erforderlich. Ansichten werden mit onView von Espresso und Compose-Elemente mit ComposeTestRule abgeglichen.

@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 sind Composables über UiAutomator nur über ihre praktischen Deskriptoren (angezeigter Text, Inhaltsbeschreibung usw.) zugänglich. Wenn Sie auf ein beliebiges Composable zugreifen möchten, das Modifier.testTag verwendet, müssen Sie die semantische Eigenschaft testTagsAsResourceId für den untergeordneten Baum des jeweiligen Composables aktivieren. Dieses Verhalten ist nützlich für Composables, die keinen anderen eindeutigen Handle haben, z. B. scrollbare Composables (z. B. LazyColumn).

Aktivieren Sie die semantische Property nur einmal hoch oben in der Hierarchie Ihrer Composables, damit alle verschachtelten Composables 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 jedes Composable mit dem Modifier.testTag(tag) kann mit By.res(resourceName) zugegriffen werden, wobei derselbe tag wie der resourceName verwendet wird.

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: Auf der Haupt-Landingpage für Android-Tests finden Sie einen umfassenderen Überblick über die Grundlagen und Techniken des Testens.
  • Grundlagen des Testens:Hier finden Sie weitere Informationen zu den grundlegenden Konzepten für das Testen einer Android-App.
  • Lokale Tests:Einige Tests können lokal auf Ihrer Workstation ausgeführt werden.
  • 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.
  • Verschiedene Bildschirmgrößen testen:Da Nutzer viele verschiedene Geräte verwenden können, sollten Sie verschiedene Bildschirmgrößen testen.
  • Espresso: Obwohl Espresso für ansichtsbasierte UIs gedacht ist, kann es für einige Aspekte von Compose-Tests hilfreich sein.