Interoperabilität

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

Interoperabilität mit Espresso

In einer Hybridanwendung finden Sie „Compose“-Komponenten innerhalb von Ansichtshierarchien und ‐Ansichten in „Compose“-Komponenten (über die zusammensetzbare Funktion AndroidView).

Es sind keine besonderen Schritte erforderlich, um einen der beiden Typen abzugleichen. Sie gleichen Ansichten mit onView von Espresso und unter „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 sind zusammensetzbare Funktionen in UiAutomator nur über die passenden Deskriptoren (angezeigter Text, Inhaltsbeschreibung usw.) zugänglich. Wenn Sie auf eine zusammensetzbare Funktion zugreifen möchten, die Modifier.testTag verwendet, müssen Sie das semantische Attribut testTagsAsResourceId für den Unterstruktur der jeweiligen zusammensetzbaren Funktion aktivieren. Das ist nützlich für zusammensetzbare Funktionen, 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. So sorgen Sie dafür, dass alle verschachtelten zusammensetzbaren Funktionen 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
    }
}

Jede zusammensetzbare Funktion mit dem Modifier.testTag(tag) kann mithilfe von By.res(resourceName) aufgerufen werden. Verwenden Sie dabei dieselbe tag wie für resourceName.

val device = UiDevice.getInstance(getInstrumentation())

val lazyColumn: UiObject2 = device.findObject(By.res("myLazyColumn"))
// Some interaction with the lazyColumn.

Weitere Ressourcen

  • Test-Apps unter Android: Die Haupt-Landingpage für Android-Tests bietet einen umfassenderen Überblick über die Grundlagen und Techniken von Tests.
  • Grundlagen des Testens:Weitere Informationen zu den Kernkonzepten des Testens einer Android-App.
  • Lokale Tests:Sie können einige Tests lokal auf Ihrer eigenen Workstation ausführen.
  • Instrumentierte Tests:Es empfiehlt sich, auch instrumentierte Tests durchzufü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.
  • Testen Sie verschiedene Bildschirmgrößen:Da Nutzer auf vielen Geräten zur Verfügung stehen, sollten Sie Tests für unterschiedliche Bildschirmgrößen durchführen.
  • Espresso: Diese Espresso-Kenntnisse sind zwar für ansichtsbasierte UIs vorgesehen, können aber für einige Aspekte von Compose-Tests hilfreich sein.