Общие шаблоны

Вы можете протестировать свое приложение Compose, используя устоявшиеся подходы и шаблоны.

Тестируйте изолированно

ComposeTestRule позволяет вам запустить действие, отображающее любую составную часть: полное приложение, один экран или небольшой элемент. Также рекомендуется проверить, что ваши составные элементы правильно инкапсулированы и работают независимо, что позволяет упростить и сфокусировать тестирование пользовательского интерфейса.

Это не означает, что вам следует создавать только модульные тесты пользовательского интерфейса. Пользовательские тесты, охватывающие большую часть вашего пользовательского интерфейса, также очень важны.

Получите доступ к активности и ресурсам после настройки собственного контента.

Часто вам необходимо установить тестируемый контент с помощью composeTestRule.setContent , а также вам необходимо получить доступ к ресурсам активности, например, чтобы убедиться, что отображаемый текст соответствует строковому ресурсу. Однако вы не можете вызвать setContent для правила, созданного с помощью createAndroidComposeRule() если действие уже вызывает его.

Распространенным способом достижения этой цели является создание AndroidComposeTestRule с использованием пустого действия, такого как ComponentActivity .

class MyComposeTest {

    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    @Test
    fun myTest() {
        // Start the app
        composeTestRule.setContent {
            MyAppTheme {
                MainScreen(uiState = exampleUiState, /*...*/)
            }
        }
        val continueLabel = composeTestRule.activity.getString(R.string.next)
        composeTestRule.onNodeWithText(continueLabel).performClick()
    }
}

Обратите внимание, что ComponentActivity необходимо добавить в файл AndroidManifest.xml вашего приложения. Включите это, добавив эту зависимость в свой модуль:

debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")

Пользовательские свойства семантики

Вы можете создавать собственные свойства семантики , чтобы предоставлять информацию для тестов. Для этого определите новый SemanticsPropertyKey и сделайте его доступным с помощью SemanticsPropertyReceiver .

// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey

Теперь используйте это свойство в модификаторе semantics :

val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
    modifier = Modifier.semantics { pickedDate = datePickerValue }
)

В тестах используйте SemanticsMatcher.expectValue , чтобы подтвердить значение свойства:

composeTestRule
    .onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
    .assertExists()

Проверка восстановления состояния

Убедитесь, что состояние ваших элементов Compose правильно восстанавливается при воссоздании действия или процесса. Выполняйте такие проверки, не полагаясь на воссоздание активности с помощью класса StateRestorationTester .

Этот класс позволяет моделировать воссоздание составного объекта. Особенно полезно проверить реализацию rememberSaveable .


class MyStateRestorationTests {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun onRecreation_stateIsRestored() {
        val restorationTester = StateRestorationTester(composeTestRule)

        restorationTester.setContent { MainScreen() }

        // TODO: Run actions that modify the state

        // Trigger a recreation
        restorationTester.emulateSavedInstanceStateRestore()

        // TODO: Verify that state has been correctly restored.
    }
}

Тестируйте различные конфигурации устройств

Приложениям Android необходимо адаптироваться ко многим меняющимся условиям: размерам окон, языковым стандартам, размерам шрифтов, темным и светлым темам и т. д. Большинство этих условий извлекаются из значений уровня устройства, контролируемых пользователем и предоставляемых текущим экземпляром Configuration . Тестирование различных конфигураций непосредственно в тесте затруднительно, поскольку тест должен настраивать свойства уровня устройства.

DeviceConfigurationOverride — это API, предназначенный только для тестирования, который позволяет локализованно моделировать различные конфигурации устройств для тестируемого содержимого @Composable .

Сопутствующий объект DeviceConfigurationOverride имеет следующие функции расширения, которые переопределяют свойства конфигурации на уровне устройства:

Чтобы применить конкретное переопределение, оберните тестируемое содержимое вызовом функции верхнего уровня DeviceConfigurationOverride() , передав переопределение для применения в качестве параметра.

Например, следующий код применяет переопределение DeviceConfigurationOverride.ForcedSize() для локального изменения плотности, заставляя компонуемый MyScreen отображаться в большом альбомном окне, даже если устройство, на котором выполняется тест, не поддерживает этот размер окна напрямую. :

composeTestRule.setContent {
    DeviceConfigurationOverride(
        DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp))
    ) {
        MyScreen() // Will be rendered in the space for 1280dp by 800dp without clipping.
    }
}

Чтобы применить несколько переопределений одновременно, используйте DeviceConfigurationOverride.then() :

composeTestRule.setContent {
    DeviceConfigurationOverride(
        DeviceConfigurationOverride.FontScale(1.5f) then
            DeviceConfigurationOverride.FontWeightAdjustment(200)
    ) {
        Text(text = "text with increased scale and weight")
    }
}

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

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