Проверка изменений конфигурации экрана с помощью API устройства Espresso

Используйте 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, выполните следующие действия:

  1. Чтобы тест мог передавать команды на тестовое устройство, добавьте разрешения INTERNET и ACCESS_NETWORK_STATE в файл манифеста в наборе исходных файлов androidTest :

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  2. Включите экспериментальный флаг enableEmulatorControl в файле gradle.properties :

      android.experimental.androidTest.enableEmulatorControl=true
    
  3. Включите параметр emulatorControl в скрипте сборки на уровне модуля:

    Котлин

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Классный

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. В скрипте сборки на уровне модуля импортируйте библиотеку Espresso Device в свой проект:

    Котлин

    dependencies {
      androidTestImplementation("androidx.test.espresso:espresso-device:1.0.1")
    }

    Классный

    dependencies {
      androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.1'
    }

Проверка на соответствие распространенным изменениям конфигурации.

API устройств Espresso поддерживает несколько ориентаций экрана и состояний складывания, которые можно использовать для имитации изменений конфигурации устройства. В следующих примерах показано, как активировать эти состояния устройства и проверить результирующие изменения пользовательского интерфейса с помощью правил тестирования Compose.

Проверка на поворот экрана.

Вот пример того, как проверить, что происходит с вашим приложением при повороте экрана устройства:

  1. Сначала определите правило проверки Compose и установите для устройства единое начальное состояние (например, портретный режим):

    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)
    }
    
  2. Создайте тест, который устанавливает альбомную ориентацию устройства во время выполнения теста:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. После поворота экрана используйте 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()
    }
    

Проверка на развертывание экрана

Вот пример того, как проверить, что произойдет с вашим приложением на складном устройстве, если экран развернется:

  1. Сначала протестируйте устройство в сложенном состоянии, вызвав onDevice().setClosedMode() . Убедитесь, что ваши компоненты адаптируются к компактной ширине экрана.

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
      composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
      ...
    }
    
  2. Для перехода в полностью развернутое состояние вызовите 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() {
  ...
}