По мере роста вашего приложения может возникнуть необходимость поместить некоторые компоненты приложения в процесс, отличный от основного процесса. Для тестирования компонентов приложения в этих процессах, отличных от процесса по умолчанию , можно использовать функционал 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:
- Android Framework создаёт и запускает новый процесс, соответствующий навигационной структуре вашего приложения. Каждый процесс
Instrumentation
включает новый экземплярAndroidJUnitRunner
. На этом этапе два процесса Instrumentation не могут взаимодействовать друг с другом. - Каждый экземпляр
AndroidJUnitRunner
регистрирует Espresso в качестве своей тестовой среды. - Два экземпляра
AndroidJUnitRunner
выполняют рукопожатие для установления соединения. Одновременно каждый экземплярAndroidJUnitRunner
соединяет всех зарегистрированных клиентов, таких как Espresso, с их коллегами в других процессах, чтобы эти клиенты могли сформировать прямой канал связи между собой. - Каждый экземпляр
AndroidJUnitRunner
продолжает искать вновь добавленные экземпляры инструментария и клиентов фреймворка тестирования, устанавливая при необходимости дополнительные каналы связи.
Рисунок 1 иллюстрирует результат этого процесса:

Дополнительные ресурсы
Дополнительную информацию по этой теме можно найти в следующих ресурсах.
- Видеозапись сеанса «Разработка через тестирование на Android с использованием библиотеки поддержки тестирования Android» с конференции Google I/O 2017, начало в 36:41.