Interoperacyjność

Compose jest zintegrowany z popularnymi platformami testowymi.

Interoperacyjność z Espresso

W aplikacji hybrydowej komponenty Compose znajdziesz w hierarchiach widoków, a widoki w komponentach Compose (za pomocą komponentu AndroidView).

Dopasowanie do żadnego z tych typów nie wymaga specjalnych czynności. Widoki dopasowujesz do onView Espresso, a elementy Compose do 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()))
}

Współdziałanie z UiAutomator

Domyślnie elementy kompozycyjne są dostępne z UiAutomator tylko za pomocą wygodnych deskryptorów (wyświetlany tekst, opis treści itp.). Jeśli chcesz uzyskać dostęp do dowolnego komponentu, który używa Modifier.testTag, musisz włączyć właściwość semantyczną testTagsAsResourceId dla poddrzewa danego komponentu. Włączenie tego działania jest przydatne w przypadku komponentów kompozycyjnych, które nie mają innego unikalnego uchwytu, np. komponentów kompozycyjnych z możliwością przewijania (np. LazyColumn).

Włącz właściwość semantyczną tylko raz na wysokim poziomie hierarchii funkcji kompozycyjnych, aby zapewnić dostępność wszystkich zagnieżdżonych funkcji kompozycyjnych z Modifier.testTag z poziomu 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
    }
}

Każdy element kompozycyjny z atrybutem Modifier.testTag(tag) może być dostępny za pomocą atrybutu By.res(resourceName) przy użyciu tego samego atrybutu tag co atrybut resourceName.

val device = UiDevice.getInstance(getInstrumentation())

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

Dodatkowe materiały

  • Testowanie aplikacji na Androida: główna strona docelowa dotycząca testowania na Androidzie zawiera szersze omówienie podstaw i technik testowania.
  • Podstawy testowania: dowiedz się więcej o podstawowych koncepcjach związanych z testowaniem aplikacji na Androida.
  • Testy lokalne: niektóre testy możesz przeprowadzać lokalnie, na własnej stacji roboczej.
  • Testy z użyciem instrumentacji: warto też przeprowadzać testy z użyciem instrumentacji. Są to testy, które są przeprowadzane bezpośrednio na urządzeniu.
  • Ciągła integracja: Ciągła integracja umożliwia zintegrowanie testów z potokiem wdrażania.
  • Testowanie różnych rozmiarów ekranu: użytkownicy mają do dyspozycji wiele urządzeń, dlatego warto testować różne rozmiary ekranu.
  • Espresso: chociaż Espresso jest przeznaczony do interfejsów opartych na widokach, wiedza na jego temat może być przydatna w przypadku niektórych aspektów testowania Compose.