Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

계측 테스트 시작하기

이 가이드에서는 Firebase Test Lab을 사용하여 계측 테스트를 준비하고 실행하는 방법을 설명합니다. 이 가이드를 사용하려면 Espresso 또는 UI Automator 2.0 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 파일(build.gradle)에서 모든 저장소 섹션에 Google의 Maven 저장소를 추가합니다.

    buildscript {
    
      repositories {
        // Add the following line:
        google()  // Google's Maven repository
      }
    
      dependencies {
        // ...
    
        // Check that you have the following line (if not, add it):
        classpath 'com.google.gms:google-services:4.3.8'  // Google Services plugin
      }
    }
    
    allprojects {
      // ...
    
      repositories {
        // Add the following line:
        google()  // Google's Maven repository
        // ...
      }
    }
  2. 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle)에서 Test Lab 스크린샷 라이브러리의 종속 항목을 추가합니다.

    dependencies {
      // ...
      // Add Test Lab's instrumentation test screenshot library:
      androidTestCompile `com.google.firebase:testlab-instr-lib:02`
      // ...
    }
  3. 테스트의 AndroidManifest.xml 파일에서 <instrumentation> 요소 내 메타데이터 태그에 FirebaseScreenCaptureProcessor를 등록합니다. 대신 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은 항상 최신 버전의 조정자를 사용합니다.

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

장점 및 단점

  • 장점: 공유 상태 없음. 각 테스트가 자체 계측 인스턴스에서 실행되므로 테스트 간에 공유 상태가 누적되지 않습니다.
  • 장점: 오류 격리. 테스트 중 하나에서 오류가 발생해도 오류가 발생한 테스트의 계측만 종료되고 다른 테스트는 계속 실행됩니다.
  • 단점: 런타임 증가. 각 테스트는 자체 계측 인스턴스를 실행하므로 전체 테스트 처리에 다소 시간이 걸립니다. 확인하지 않는 경우 실행 시간이 길어지면 할당량 사용 또는 청구 시간이 영향을 받고 기기의 타임아웃 시간이 초과될 수 있습니다.

샤딩 사용 설정

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

테스트 샤딩 작동 방식

샤드 N개를 만든다고 가정해보겠습니다. 선택한 각 기기에서 Test Lab은 동일한 기기 N개를 가동하고 각 기기에서 테스트 일부를 실행합니다. 즉, 샤딩하지 않은 테스트 사례에서는 항상 기기마다 테스트가 1번 실행되지만 샤딩한 테스트 사례에서는 기기마다 테스트가 여러 번 실행됩니다. Test Lab의 핵심 개념에 대한 간략한 개요는 핵심 개념을 참조하세요.

Firebase Console에서 테스트 샤딩을 사용 설정할 수 있습니다.

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

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

테스트 샤드 비용 청구

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

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