Используйте Espresso Device API для тестирования вашего приложения при распространенных изменениях конфигурации устройства, таких как поворот и разворачивание экрана. Espresso Device API — это рекомендуемый инструмент для выполнения действий на уровне устройства в дополнение к правилам тестирования Jetpack Compose. Если вы новичок в написании UI-тестов для Jetpack Compose, см. раздел «Тестирование макета Compose» .
API устройств Espresso позволяет запускать изменения конфигурации на виртуальном устройстве и выполнять тесты синхронно, поэтому одновременно выполняется только одно действие или проверка пользовательского интерфейса, а результаты тестов становятся более надежными. Если вы новичок в написании тестов пользовательского интерфейса с помощью Espresso, ознакомьтесь с его документацией .
Для использования API устройства Espresso вам потребуется следующее:
- Android Studio Iguana или выше
- Плагин Android Gradle версии 8.3 или выше
- Эмулятор Android версии 33.1.10 или выше.
- Виртуальное устройство Android, работающее под управлением API уровня 24 или выше.
Настройте свой проект для работы с API устройств Espresso.
Чтобы настроить ваш проект для поддержки API устройств Espresso, выполните следующие действия:
Чтобы тест мог передавать команды на тестируемое устройство, добавьте необходимые сетевые разрешения в файл манифеста в наборе источников
androidTest:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Если ваш тест ориентирован на Android 17 (уровень API 37) или выше , вам также необходимо объявить разрешение
ACCESS_LOCAL_NETWORK:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />Включите экспериментальный флаг
enableEmulatorControlв файлеgradle.properties:android.experimental.androidTest.enableEmulatorControl=trueВключите параметр
emulatorControlв скрипте сборки на уровне модуля:Котлин
testOptions { emulatorControl { enable = true } }
Классный
testOptions { emulatorControl { enable = true } }
В скрипте сборки на уровне модуля импортируйте библиотеку Espresso Device в свой проект:
Котлин
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0") }
Классный
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
Проверка на соответствие распространенным изменениям конфигурации.
API устройств Espresso поддерживает несколько ориентаций экрана и состояний складывания, которые можно использовать для запуска изменений конфигурации устройства. В следующих примерах показано, как запускать эти состояния устройства и проверять результирующие изменения пользовательского интерфейса с помощью правил тестирования Compose.
Проверка на поворот экрана.
Для проверки поворота экрана можно использовать класс ScreenOrientationRule , чтобы определить ориентацию устройства во время теста.
Вот пример того, как проверить, что происходит с вашим приложением при повороте экрана устройства:
Сначала определите правило проверки Compose и используйте класс
ScreenOrientationRule, чтобы установить устройство в согласованное начальное состояние (например, в портретном режиме):import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertDoesNotExist import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.device.EspressoDevice.onDevice import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule import org.junit.Rule import org.junit.Test class MyConfigurationTest { // 1. Define the Compose test rule @get:Rule val composeTestRule = createComposeRule() // 2. Define the Espresso Device rule for a consistent starting state @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) }Если ваш тест ориентирован на Android 17 (уровень API 37) или выше, для Espresso Device API требуется разрешение
ACCESS_LOCAL_NETWORK. Необходимо убедиться, что это разрешение предоставлено до запуска правилаScreenOrientationRule. ИспользуйтеRuleChainиз JUnit, чтобы сначала запустить правилоGrantPermissionRule:import androidx.test.rule.GrantPermissionRule import org.junit.rules.RuleChain class MyConfigurationTest { val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK) val composeTestRule = createComposeRule() val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @get:Rule val chain = RuleChain .outerRule(grantPermissionRule) .around(composeTestRule) .around(screenOrientationRule) }Создайте тест, который устанавливает альбомную ориентацию устройства во время выполнения теста:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }После поворота экрана используйте
composeTestRule, чтобы проверить, правильно ли ваши компонуемые объекты адаптируются к новому состоянию.@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Проверка на развертывание экрана
Вот пример того, как проверить, что произойдет с вашим приложением на складном устройстве, если экран развернется:
Сначала протестируйте устройство в сложенном состоянии, вызвав
onDevice().setClosedMode(). Убедитесь, что ваши компоненты адаптируются к компактной ширине экрана.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }Для перехода в полностью развернутое состояние вызовите
onDevice().setFlatMode(). Убедитесь, что компоненты адаптируются к расширенному классу размеров.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Укажите, какие устройства необходимы для ваших тестов.
Если вы запускаете тест, который выполняет действия по складыванию на устройстве, которое не является складываемым, тест, скорее всего, завершится неудачей. Чтобы выполнить только те тесты, которые относятся к работающему устройству, используйте аннотацию @RequiresDeviceMode . Программа запуска тестов автоматически пропускает запуск тестов на устройствах, которые не поддерживают тестируемую конфигурацию. Вы можете добавить правило требования устройства к каждому тесту или ко всему классу тестов.
Например, чтобы указать, что тест должен запускаться только на устройствах, поддерживающих разворачивание в плоскую конфигурацию, добавьте в тест следующий код @RequiresDeviceMode :
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}