Multiprocess Espresso

앱이 성장함에 따라 일부 앱 구성요소를 앱의 기본 프로세스가 아닌 프로세스에 배치하는 것이 유용할 수 있습니다. 기본이 아닌 프로세스에서 앱 구성요소를 테스트하려면 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.4.0'
}

Kotlin

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

앱의 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를 사용한 크로스 프로세스 테스트를 사용 설정합니다.

  1. Android 프레임워크는 앱의 탐색 구조를 따르는 새 프로세스를 만들고 시작합니다. 각 Instrumentation 프로세스에는 AndroidJUnitRunner의 새 인스턴스가 포함됩니다. 이 단계에서 두 계측 프로세스는 서로 통신할 수 없습니다.
  2. AndroidJUnitRunner 인스턴스는 Espresso를 테스트 프레임워크로 등록합니다.
  3. 두 개의 AndroidJUnitRunner 인스턴스가 핸드셰이크를 실행하여 서로 간의 연결을 설정합니다. 동시에 각 AndroidJUnitRunner 인스턴스는 Espresso와 같은 등록된 모든 클라이언트를 다른 프로세스의 상응하는 각 클라이언트와 연결하여 이러한 클라이언트가 둘 사이의 직접 통신 채널을 형성할 수 있도록 합니다.
  4. AndroidJUnitRunner 인스턴스는 새로 추가된 계측 인스턴스와 테스트 프레임워크 클라이언트를 계속 찾으며 필요에 따라 추가 통신 채널을 설정합니다.

그림 1에서는 이 프로세스의 결과를 보여줍니다.

그림 1. Multiprocess Espresso를 사용하여 여러 계측 프로세스 간 통신 설정

추가 리소스

이 주제에 관해 자세히 알아보려면 다음 자료를 참조하세요.