계측 테스트 시작하기

이 가이드에서는 Firebase Test Lab을 사용하여 계측 테스트를 준비하고 실행하는 방법을 설명합니다. 이 가이드를 사용하려면 Espresso 또는 UI Automator Android 테스트 프레임워크를 사용하는 개발자나 개발자 팀에서 작성한 계측 테스트가 필요합니다. 계측 테스트는 실제 기기에서 최대 45분, 가상 기기에서 최대 60분 동안 실행될 수 있습니다.

이후 단계에서 앱의 APK와 테스트 APK를 Firebase에 업로드합니다.

(선택사항) 앱에 스크린샷 라이브러리 추가

Firebase Test Lab에는 Espresso 테스트 프레임워크로 작성된 테스트와 같이 계측 테스트를 실행할 때 AndroidX의 ScreenCapture로 만든 스크린샷을 처리하는 데 사용할 수 있는 라이브러리(testlab-instr-lib)가 포함되어 있습니다. 이 섹션에서는 AndroidX 라이브러리로 ScreenCapture 객체를 만들고 testlab-instr-lib를 사용하여 처리하는 방법을 설명합니다.

계측 테스트가 실행된 후 Firebase Console에서 캡처된 스크린샷을 볼 수 있습니다.

샘플 앱 사용해 보기

NotePad 샘플 앱을 다운로드하여 이 기능을 사용해 보세요. 스크린샷 캡처 기능은 이미 NotePad 프로젝트에 통합되어 있습니다.

1단계: 프로젝트에 스크린샷 라이브러리 추가

  1. 테스트 프로젝트의 루트 수준 설정 Gradle 파일(settings.gradle.kts 또는 settings.gradle)에서 모든 repositories 섹션에 Google의 Maven 저장소를 추가합니다.

    pluginManagement {
        repositories {
            // Add the following line:
            google() // Google's Maven repository
            mavenCentral()
            gradlePluginPortal()
        }
    }
    dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            // Add the following line:
            google() // Google's Maven repository
            mavenCentral()
        }
    }
    // ...
    
  2. 모듈(앱 수준) Gradle 파일(일반적으로 <project>/<app-module>/build.gradle.kts 또는 <project>/<app-module>/build.gradle)에서 Test Lab 스크린샷 라이브러리의 종속 항목을 추가합니다.

    dependencies {
      // ...
      // Add Test Lab's instrumentation test screenshot library:
      androidTestImplementation("com.google.firebase:testlab-instr-lib:0.2")
      // ...
    
  3. 테스트의 AndroidManifest.xml 파일에서 FirebaseScreenCaptureProcessor<instrumentation> 요소 내 메타데이터 태그에 등록합니다. 대신 AndroidJUnitRunner에서 인수로 프로세서를 지정할 수도 있습니다(방법은 AndroidJUnitRunner 참조 문서 확인).

    <instrumentation
      // Check that you have the following line (if not, add it):
      android:name="androidx.test.runner.AndroidJUnitRunner" // Specifies AndroidJUnitRunner as the test runner
      android:targetPackage="com.your.package.name">
    
    // Add the following:
    <meta-data
      android:name="screenCaptureProcessors"
      android:value="com.google.firebase.testlab.screenshot.FirebaseScreenCaptureProcessor" />
    </instrumentation>
    ...
    
  4. 앱의 AndroidManifest.xml 파일에서 <manifest> 요소 내에 다음 줄을 추가합니다.

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  5. AndroidManifest.xml 파일에서 <manifest> 태그 내에 다음 줄을 추가하여 앱의 시스템 권한을 지정합니다. Android 10(API 수준 29) 이상에서 테스트하는 경우 WRITE_EXTERNAL_STORAGE 권한을 생략합니다(앱에서 스크린샷을 기기에 읽고 쓰기 위해 이 권한이 필요하지 않음).

    <manifest ... >
        <!-- WRITE_EXTERNAL_STORAGE is not needed on Android 10 (API level 29) or higher. -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        ...
    </manifest>

2단계: 테스트 중 스크린샷 찍기

테스트 중 스크린샷을 만들 시점에 AndroidX 라이브러리에서 Screenshot.capture() 메서드를 호출합니다. 그러면 ScreenCapture 객체가 생성됩니다. ScreenCapture 객체에서 process()를 호출하면 AndroidManifest.xml에 등록된 ScreenCaptureProcessor를 사용하여 처리됩니다. 등록된 프로세서가 없는 경우 BasicScreenCaptureProcessor가 사용됩니다. FirebaseScreenCaptureProcessor를 등록했으므로 스크린샷이 FirebaseScreenCaptureProcessor를 통해 처리되고 Firebase Test Lab으로 테스트를 실행할 때 결과와 함께 확인할 수 있습니다.

ScreenCapture 생성 사용 사례 예시:

  • API Build.VERSION_CODES.JELLY_BEAN_MR2 이상에서 전체 ScreenCapture를 생성합니다.

    Screenshot.capture()
    
  • 모든 API 수준에서 활동의 ScreenCapture를 생성합니다. 이 옵션은 Build.VERSION_CODES.JELLY_BEAN_MR2 이하의 기기에서 사용할 수 있는 유일한 옵션입니다.

    @Rule
      public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class);
    ...
    Screenshot.capture(activityRule.getActivity());
    ...
    

ScreenCapture 처리 사용 사례 예시

  • FirebaseScreenCaptureProcessor를 통해 ScreenCapture를 처리합니다.

    Screenshot.capture().process();
    
  • 지정된 ScreenCaptureProcessor를 통해 ScreenCapture를 처리합니다(따라서 프로세서 등록 건너뛰기 가능).

    Set<ScreenCaptureProcessor> processors = new HashSet<>();
    processors.add(new FirebaseScreenCaptureProcessor());
    Screenshot.capture().process(processors);
    
  • ScreenCapture의 이름과 형식을 설정하고 등록된 프로세서를 사용하여 처리합니다.

    Screenshot.capture().setName("myscreenshot").setFormat(CompressFormat.JPEG).process();
    

3단계: 테스트 빌드 및 실행

  1. 앱을 빌드하고 APK를 테스트합니다(안내는 앱 테스트 참조).

  2. Firebase Console의 Test Lab 대시보드에 APK 파일을 업로드합니다.

  3. 마지막으로 테스트를 실행합니다.

4단계: 테스트 스크린샷 보기

테스트가 완료되면 Firebase Console에서 생성된 스크린샷을 볼 수 있습니다.

  1. 테스트 탭에서 완료된 테스트를 선택한 후 결과 탭을 클릭합니다.

  2. 테스트를 다시 선택한 다음 표시되는 스크린샷 탭을 클릭합니다.

(선택사항) 추가 테스트 기능 사용 설정

Test Lab으로 테스트를 실행하기 전에 테스트에서 다음 기능을 사용 설정할 수 있습니다.

Orchestrator 사용 설정

Android Test Orchestrator는 앱의 각 계측 테스트를 개별적으로 실행하는 도구입니다. Test Lab은 항상 최신 버전의 Orchestrator를 사용합니다.

Test Lab에서 Orchestrator를 사용 설정하려면 계측 테스트 설정에서 추가 옵션 > Orchestrator로 실행을 클릭합니다.

Orchestrator를 사용하면 다음과 같은 이점이 있습니다.

  • 공유 상태가 없습니다. 각 테스트가 자체 계측 인스턴스에서 실행되므로 테스트 간에 공유 상태가 누적되지 않습니다.
  • 비정상 종료가 격리됩니다. 테스트 하나가 비정상 종료되어도 해당 계측만 종료되며 묶음의 다른 테스트는 계속 실행될 수 있습니다.

Orchestrator를 사용하면 각 테스트가 자체 계측 인스턴스를 실행한다는 점에 유의하세요. 즉, 모든 테스트 사례 후에 앱 프로세스가 다시 시작됩니다. 이에 따라 실행 시간이 길어져서 할당량 사용 또는 청구 시간이 영향을 받을 수 있으며 기기의 제한 시간 한도를 초과할 수도 있습니다. 앱의 시작 시간을 줄이면 이러한 오버헤드가 줄어듭니다.

Orchestrator에 대한 추가 옵션을 설정하려면 environmentVariables 필드를 통해 지정합니다. 예를 들어 clearPackageData를 사용하려면 gcloud에서 이 옵션을 사용합니다.

--environment-variables clearPackageData=true

샤딩 사용 설정

테스트 샤딩 시 격리되어 개별적으로 실행되는 하위 그룹(샤드)으로 테스트 집합이 분할됩니다. Test Lab은 여러 기기를 사용해 각 샤드를 자동으로 동시 실행하여 전체 테스트 집합의 완료 시간을 단축합니다.

예를 들어 샤드 N개를 만드는 경우 선택한 각 기기마다 Test Lab이 동일한 기기 N개를 가동하고 각 기기에서 테스트의 하위 집합을 실행합니다. 즉, 샤딩한 테스트 사례에서는 기기마다 테스트가 여러 번 실행됩니다. 하지만 샤딩하지 않은 테스트 사례에서는 기기당 테스트가 1번 실행됩니다. Test Lab 개념을 알아보려면 주요 개념을 참조하세요.

Firebase Console에서 테스트 샤딩을 사용 설정하려면 다음 단계를 따르세요.

  1. 계측 테스트 설정에서 추가 옵션을 클릭합니다.

  2. 샤딩 섹션에서 실행할 샤드 수를 입력합니다.

테스트 샤드 비용 청구

Test Lab은 AndroidJUnitRunner의 기본 제공 샤딩 메커니즘을 활용하여 샤드를 구현합니다. 빈 샤드(테스트 사례가 할당되지 않은 샤드) 가동 시 요금 청구를 방지하려면 만든 샤드 수가 총 테스트 사례 수보다 적어야 합니다. 각 테스트 사례를 실행하는 데 걸리는 시간에 따라 일반적으로 샤드마다 테스트 사례를 2~10개 할당하는 것이 좋습니다.

결제에 대한 자세한 내용은 사용량, 할당량, 결제를 참조하세요.