Interoperabilità

Compose si integra con i framework di test più comuni.

Interoperabilità con Espresso

In un'app ibrida, puoi trovare i componenti di Compose all'interno delle gerarchie delle visualizzazioni e delle viste all'interno dei componenti componibili di Compose (tramite il componibile AndroidView).

Non sono necessari passaggi speciali per la corrispondenza con entrambi i tipi. Puoi abbinare le visualizzazioni all'elemento onView di Espresso e gli elementi Compose con ComposeTestRule.

@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à con UiAutomator

Per impostazione predefinita, i componibili sono accessibili da UiAutomator solo tramite i relativi descrittori utili (testo visualizzato, descrizione dei contenuti e così via). Se vuoi accedere a qualsiasi componibile che utilizza Modifier.testTag, devi abilitare la proprietà semantica testTagsAsResourceId per il sottoalbero dello specifico componibile. L'attivazione di questo comportamento è utile per gli elementi componibili che non hanno altri handle univoci, come gli elementi componibili scorrevoli (ad esempio LazyColumn).

Attiva la proprietà semantica solo una volta in alto nella gerarchia dei componibili per assicurarti che tutti gli elementi componibili nidificati con Modifier.testTag siano accessibili da UiAutomator.

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

Qualsiasi componibile con Modifier.testTag(tag) può essere accessibile con By.res(resourceName) utilizzando lo stesso tag di resourceName.

val device = UiDevice.getInstance(getInstrumentation())

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

Risorse aggiuntive

  • Testare le app su Android: la pagina di destinazione principale per i test di Android offre una visione più ampia delle nozioni di base e delle tecniche di test.
  • Concetti fondamentali del test: scopri di più sui concetti fondamentali alla base del test di un'app per Android.
  • Test locali: puoi eseguire alcuni test localmente sulla tua workstation.
  • Test strumentati: è buona norma eseguire anche test strumentati. Vale a dire che i test vengono eseguiti direttamente sul dispositivo.
  • Integrazione continua: l'integrazione continua ti consente di integrare i test nella pipeline di deployment.
  • Prova schermi di dimensioni diverse: con alcuni dispositivi a disposizione degli utenti, ti conviene eseguire test per schermi di dimensioni diverse.
  • Espresso: sebbene sia destinata alle UI basate su View, le conoscenze di Espresso possono comunque essere utili per alcuni aspetti del test di Compose.