Narzędzie Compose integruje się z popularnymi platformami testowania.
Interoperacyjność z Espresso
W aplikacji hybrydowej komponenty Compose można znaleźć wewnątrz hierarchii widoków i widoków w funkcjach kompozycyjnych Compose (za pomocą funkcji kompozycyjnej AndroidView
).
Aby dopasować oba typy, nie musisz wykonywać żadnych specjalnych kroków. Widoki dopasowujesz do elementów onView
Espresso, a elementy Utwórz – za pomocą 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()))
}
Interoperacyjność z UiAutomator
Domyślnie elementy kompozycyjne są dostępne w UiAutomator tylko przez ich wygodne deskryptory (wyświetlany tekst, opis treści itp.). Jeśli chcesz uzyskać dostęp do funkcji kompozycyjnej używającej funkcji Modifier.testTag
, musisz włączyć właściwość semantyczną testTagsAsResourceId
dla konkretnego poddrzewa tej funkcji. Włączenie tego działania jest przydatne w przypadku elementów kompozycyjnych, które nie mają żadnego innego unikalnego uchwytu, takich jak elementy kompozycyjne z możliwością przewijania (np. LazyColumn
).
Włącz właściwość semantyczną tylko raz na najwyższym poziomie w hierarchii elementów kompozycyjnych, aby mieć pewność, że wszystkie zagnieżdżone funkcje kompozycyjne korzystające z funkcji Modifier.testTag
będą dostępne w usłudze 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
}
}
Wszystkie funkcje kompozycyjne korzystające z funkcji Modifier.testTag(tag)
mogą być dostępne przy użyciu klasy By.res(resourceName)
i takiej samej klasy tag
jak 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 testowania na Androida zawiera szersze omówienie podstaw i technik testowania.
- Podstawy testowania: dowiedz się więcej o podstawowych założeniach testowania aplikacji na Androida.
- Testy lokalne: niektóre testy możesz przeprowadzić lokalnie, na swojej stacji roboczej.
- Testy instrumentowane: warto też przeprowadzać testy instrumentowane. Chodzi o testy przeprowadzane bezpośrednio na urządzeniu.
- Tryb ciągłej integracji: tryb ciągłej integracji umożliwia integrację testów z potokiem wdrażania.
- Przetestuj różne rozmiary ekranów: warto przetestować różne rozmiary ekranów w przypadku dużej liczby urządzeń dostępnych dla użytkowników.
- Espresso: chociaż wiedza o Espresso jest przeznaczona dla interfejsu opartego na widoku, może okazać się przydatna w niektórych aspektach testowania funkcji Compose.