앱이 성장함에 따라 일부 앱 구성요소를 앱의 기본 프로세스가 아닌 프로세스에 배치하는 것이 유용할 수 있습니다. 기본이 아닌 프로세스에서 앱 구성요소를 테스트하려면 Multiprocess Espresso의 기능을 사용하면 됩니다. Android 8.0 (API 수준 26) 이상에서 사용할 수 있는 이 도구를 사용하면 Espresso의 동기화 보장을 유지하면서 앱의 프로세스 경계를 가로지르는 앱의 UI 상호작용을 원활하게 테스트할 수 있습니다.
Multiprocess Espresso를 사용할 때는 다음과 같은 버전 관리 및 범위 고려사항에 유의하세요.
- 앱이 Android 8.0(API 레벨 26) 이상을 타겟팅해야 합니다.
- 이 도구는 앱 패키지 내의 프로세스에 포함하는 앱 구성요소만 테스트할 수 있습니다. 외부 프로세스는 테스트할 수 없습니다.
도구 사용
Multiprocess Espresso를 사용하여 앱 내의 프로세스를 테스트하려면 앱의 build.gradle
파일에 espresso-remote 아티팩트 참조를 추가하세요.
app/build.gradle
Groovy
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
앱의 androidTest
매니페스트에 다음도 추가해야 합니다.
- 프로세스를 정의하는
<instrumentation>
요소 - Multiprocess Espresso를 사용하려 한다고 나타내는
<meta-data>
요소
다음 코드 스니펫은 이러한 요소를 추가하는 방법을 보여줍니다.
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" ... />
도구 아키텍처 이해
앱을 테스트하고 기본 프로세스를 시작할 때 보조 프로세스에서 활동을 시작하는 UI 상호작용(예: 버튼 누르기)을 실행할 수 있습니다. 그런 다음 시스템에서 다음 단계를 완료하여 Espresso를 사용한 크로스 프로세스 테스트를 사용 설정합니다.
- Android 프레임워크는 앱의 탐색 구조를 따르는 새 프로세스를 만들고 시작합니다. 각
Instrumentation
프로세스에는AndroidJUnitRunner
의 새 인스턴스가 포함됩니다. 이 단계에서 두 계측 프로세스는 서로 통신할 수 없습니다. - 각
AndroidJUnitRunner
인스턴스는 Espresso를 테스트 프레임워크로 등록합니다. - 두 개의
AndroidJUnitRunner
인스턴스가 핸드셰이크를 실행하여 서로 간의 연결을 설정합니다. 동시에 각AndroidJUnitRunner
인스턴스는 Espresso와 같은 등록된 모든 클라이언트를 다른 프로세스의 상응하는 각 클라이언트와 연결하여 이러한 클라이언트가 둘 사이의 직접 통신 채널을 형성할 수 있도록 합니다. - 각
AndroidJUnitRunner
인스턴스는 새로 추가된 계측 인스턴스와 테스트 프레임워크 클라이언트를 계속 찾으며 필요에 따라 추가 통신 채널을 설정합니다.
그림 1에서는 이 프로세스의 결과를 보여줍니다.
![](https://developer.android.google.cn/static/images/training/testing/multiprocess_espresso.png?authuser=9&hl=ko)
추가 리소스
이 주제에 관해 자세히 알아보려면 다음 자료를 참조하세요.
- Google I/O 2017의 Test-driven Development on Android with the Android Testing Support Library 세션 동영상(36분 41초부터 시작)