Interoperabilità

Compose si integra con i framework di test comuni.

Interoperabilità con Espresso

In un'app ibrida, puoi trovare componenti Compose all'interno delle gerarchie di visualizzazione e le visualizzazioni all'interno dei composabili Compose (tramite il composable AndroidView).

Non sono necessari passaggi speciali per la corrispondenza di nessuno dei due tipi. Abbina le visualizzazioni con onView di Espresso e gli elementi di composizione 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 composabili sono accessibili da UiAutomator solo tramite i relativi descrittori utili (testo visualizzato, descrizione dei contenuti e così via). Se vuoi accedere a qualsiasi composable che utilizza Modifier.testTag, devi attivare la proprietà semantica testTagsAsResourceId per il sottoalbero del composable in questione. L'attivazione di questo comportamento è utile per i composabili che non hanno un altro handle univoco, ad esempio i composabili scorrevoli (ad esempio LazyColumn).

Attiva la proprietà semantica solo una volta nella gerarchia dei composabili per assicurarti che tutti i composabili 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 composable con il Modifier.testTag(tag) può essere accessibile con l'uso di By.res(resourceName) utilizzando lo stesso tag del 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 su Android offre una visione più ampia delle nozioni di base e delle tecniche di test.
  • Nozioni di base sui 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 con strumenti: è buona prassi eseguire anche test con strumenti. ovvero i test eseguiti direttamente sul dispositivo.
  • Integrazione continua: l'integrazione continua ti consente di integrare i test nella pipeline di deployment.
  • Esegui test su diverse dimensioni dello schermo: con così tanti dispositivi a disposizione degli utenti, devi testare diverse dimensioni dello schermo.
  • Espresso: sebbene sia destinato alle UI basate su visualizzazioni, le conoscenze di Espresso possono essere utili per alcuni aspetti dei test di Compose.