Interoperabilität

Compose lässt sich in gängige Test-Frameworks einbinden.

Interoperabilität mit Espresso

In einer Hybridanwendung finden Sie Komponenten des Typs „Compose“ in Ansichtshierarchien und Ansichten in zusammensetzbaren Funktionen vom Typ „Compose“ (über die zusammensetzbare Funktion AndroidView).

Es sind keine besonderen Schritte für die Übereinstimmung mit beiden Typen erforderlich. Ansichten abgleichen Sie mit onView von Espresso und Elemente vom Typ „Compose“ mit dem ComposeTestRule ab.

@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 kann in UiAutomator nur mit den passenden Deskriptoren (angezeigter Text, Inhaltsbeschreibung usw.) auf Zusammensetzbare zugegriffen werden. Wenn Sie auf eine zusammensetzbare Funktion zugreifen möchten, in der Modifier.testTag verwendet wird, müssen Sie das semantische Attribut testTagsAsResourceId für die Unterstruktur der jeweiligen zusammensetzbaren Funktion aktivieren. Das Aktivieren dieses Verhaltens ist bei zusammensetzbaren Funktionen nützlich, die keinen anderen eindeutigen Handle haben, z. B. scrollbare zusammensetzbare Funktionen (z. B. LazyColumn).

Aktivieren Sie das semantische Attribut nur einmal hoch in der Hierarchie der zusammensetzbaren Funktionen, damit über UiAutomator auf alle verschachtelten zusammensetzbaren Funktionen mit Modifier.testTag zugegriffen werden kann.

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

Jede mit dem Modifier.testTag(tag) zusammensetzbare Funktion kann mit By.res(resourceName) mit demselben tag wie resourceName aufgerufen werden.

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 Testverfahren.
  • Testgrundlagen:Hier findest du weitere Informationen zu den Kernkonzepten, die dem Testen von Android-Apps zugrunde liegen.
  • Lokale Tests:Sie können einige Tests 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.
  • Kontinuierliche Integration: Mit der kontinuierlichen Integration können Sie Ihre Tests in Ihre Bereitstellungspipeline einbinden.
  • Verschiedene Bildschirmgrößen testen:Da einige Geräte den Nutzern zur Verfügung stehen, solltest du verschiedene Bildschirmgrößen testen.
  • Espresso: Diese Funktion ist zwar für Ansichtsbasierte Benutzeroberflächen gedacht, kann aber bei einigen Aspekten des Compose-Tests hilfreich sein.