Совместимость

Compose интегрируется с распространенными фреймворками тестирования.

Совместимость с Espresso

В гибридном приложении вы можете найти компоненты Compose внутри иерархий представлений, а представления — внутри компонуемых объектов Compose (через компонуемый объект AndroidView ).

Для сопоставления любого типа не требуется никаких специальных шагов. Вы сопоставляете представления с помощью onView в Espresso, а элементы Compose — с помощью 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()))
}

Взаимодействие с UiAutomator

По умолчанию компонуемые элементы доступны из UiAutomator только по их удобным дескрипторам (отображаемый текст, описание содержимого и т. д.). Если вы хотите получить доступ к любому компонуемому элементу, который использует Modifier.testTag , вам необходимо включить семантическое свойство testTagsAsResourceId для поддерева конкретного компонуемого элемента. Включение этого поведения полезно для компонуемых элементов, которые не имеют других уникальных дескрипторов, таких как прокручиваемые компонуемые элементы (например, LazyColumn ).

Включите семантическое свойство только один раз высоко в иерархии компонуемых объектов, чтобы гарантировать, что все вложенные компонуемые объекты с Modifier.testTag доступны из 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
    }
}

Любой составной объект с Modifier.testTag(tag) может быть доступен с помощью By.res(resourceName) с использованием того же tag , что и resourceName .

val device = UiDevice.getInstance(getInstrumentation())

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

Дополнительные ресурсы

  • Тестирование приложений на Android : главная целевая страница тестирования Android предоставляет более широкий обзор основ и методов тестирования.
  • Основы тестирования : узнайте больше об основных концепциях тестирования приложений Android.
  • Локальные тесты : вы можете запустить некоторые тесты локально, на своей рабочей станции.
  • Инструментированные тесты : Хорошей практикой является также запуск инструментированных тестов. То есть тестов, которые запускаются непосредственно на устройстве.
  • Непрерывная интеграция : Непрерывная интеграция позволяет интегрировать ваши тесты в конвейер развертывания.
  • Тестируйте разные размеры экранов : поскольку пользователям доступно множество устройств, вам следует тестировать экраны разных размеров.
  • Espresso : хотя знание Espresso и предназначено для пользовательских интерфейсов на основе View, оно все равно может быть полезно для некоторых аспектов тестирования Compose.