Мультипроцесс Эспрессо

По мере роста вашего приложения может возникнуть необходимость поместить некоторые компоненты приложения в процесс, отличный от основного процесса. Для тестирования компонентов приложения в этих процессах, отличных от процесса по умолчанию , можно использовать функционал Multiprocess Espresso. Этот инструмент, доступный в Android 8.0 (уровень API 26) и выше, позволяет легко тестировать взаимодействие пользовательского интерфейса приложения, выходящее за рамки процесса, сохраняя при этом гарантии синхронизации Espresso.

При использовании Multiprocess Espresso учитывайте следующие аспекты управления версиями и области действия:

  • Ваше приложение должно быть ориентировано на Android 8.0 (уровень API 26) или выше.
  • Инструмент может тестировать только те компоненты приложения, которые вы включаете в процессы внутри пакета вашего приложения. Он не может тестировать внешние процессы.

Используйте инструмент

Чтобы протестировать процесс в вашем приложении с помощью Multiprocess Espresso, добавьте ссылку на артефакт espresso-remote в файл build.gradle вашего приложения:

приложение/build.gradle

Круто

dependencies {
    ...
    androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1'
}

Котлин

dependencies {
    ...
    androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1')
}

Вам также необходимо добавить следующее в манифест androidTest вашего приложения:

  • Элемент <instrumentation> , определяющий процесс.
  • Элемент <meta-data> , указывающий, что вы хотите использовать Multiprocess Espresso.

В следующем фрагменте кода показано, как добавить эти элементы:

src/androidTest/AndroidManifest.xml

<manifest ... package="androidx.test.mytestapp.tests">
  <uses-sdk android:targetSdkVersion="27" android:minSdkVersion="14" />
  <instrumentation
    android:name="androidx.test.runner.AndroidJUnitRunner"
    android:targetPackage="androidx.test.mytestapp"
    android:targetProcesses="*">
    <meta-data
      android:name="remoteMethod"
      android:value="androidx.test.espresso.remote.EspressoRemote#remoteInit" />
  </instrumentation>
</manifest>

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

<instrumentation
    ...
    android:targetProcesses=
            "androidx.test.mytestapp:myFirstAppProcessToTest,
             androidx.test.mytestapp:mySecondAppProcessToTest" ... />

Понять архитектуру инструмента

При тестировании приложения и запуске его процесса по умолчанию вы можете выполнить взаимодействие с пользовательским интерфейсом, например, нажать кнопку, которое запускает действие во вторичном процессе. Затем система выполняет следующие шаги для обеспечения кросс-процессного тестирования с помощью Espresso:

  1. Android Framework создаёт и запускает новый процесс, соответствующий навигационной структуре вашего приложения. Каждый процесс Instrumentation включает новый экземпляр AndroidJUnitRunner . На этом этапе два процесса Instrumentation не могут взаимодействовать друг с другом.
  2. Каждый экземпляр AndroidJUnitRunner регистрирует Espresso в качестве своей тестовой среды.
  3. Два экземпляра AndroidJUnitRunner выполняют рукопожатие для установления соединения. Одновременно каждый экземпляр AndroidJUnitRunner соединяет всех зарегистрированных клиентов, таких как Espresso, с их коллегами в других процессах, чтобы эти клиенты могли сформировать прямой канал связи между собой.
  4. Каждый экземпляр AndroidJUnitRunner продолжает искать вновь добавленные экземпляры инструментария и клиентов фреймворка тестирования, устанавливая при необходимости дополнительные каналы связи.

Рисунок 1 иллюстрирует результат этого процесса:

Рисунок 1. Установление связи между несколькими процессами приборостроения с использованием Multiprocess Espresso

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

Дополнительную информацию по этой теме можно найти в следующих ресурсах.