계측 테스트

먼저 developer.android.com에서 앱 테스트를 읽어보세요. 플랫폼 테스트에서 계측 테스트가 사용되는 방식에는 몇 가지 차이점이 있습니다.

요약하면 계측 테스트는 am instrument 명령어를 통해 실행되는 특수한 테스트 실행 환경을 제공합니다. 여기에서 타겟 애플리케이션 프로세스가 다시 시작되고 기본 애플리케이션 컨텍스트를 사용하여 초기화되며 계측 스레드는 애플리케이션 프로세스 VM 내에서 시작됩니다. 테스트 코드는 이 계측 스레드에서 실행을 시작하며, 애플리케이션 컨텍스트에 대한 액세스를 제공하는 Instrumentation 인스턴스와 테스트 중인 애플리케이션 프로세스를 조작하는 API가 테스트 코드에 제공됩니다.

주요 개념

  • 계측은 애플리케이션 패키지 매니페스트에서 <manifest> 태그 아래에 중첩되어 있는 <instrumentation> 태그를 사용하여 애플리케이션 패키지에 선언되어야 합니다.
  • 애플리케이션 패키지 매니페스트는 기술적으로 여러 <instrumentation> 태그를 포함할 수 있지만, 일반적으로 사용되는 방식은 아닙니다.
  • <instrumentation>은 다음을 포함해야 합니다.
    • android:name 속성: 테스트 애플리케이션에 포함된 Instrumentation의 서브클래스 이름이어야 하며 일반적으로 사용되고 있는 테스트 실행자입니다(예: android.support.test.runner.AndroidJUnitRunner).
    • android:targetPackage 속성을 정의해야 합니다. 이 값은 테스트 중인 애플리케이션 패키지로 설정해야 합니다.

단계 요약

  1. 다음은 프레임워크 서비스에 대한 밀폐 테스트의 일반적인 대상입니다.

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

    구성요소에 새로운 계측 모듈을 추가하는 경우 다음을 참조하세요.

  2. 위의 위치 중 하나에 테스트를 추가하는 경우 기존 규칙을 따릅니다. 새 테스트 모듈을 설정한다면 위의 위치 중 하나에서 AndroidManifest.xmlAndroid.mk의 설정을 따르세요.

  3. frameworks/base/core/tests/coretests/의 예를 참고하세요. 추가 앱을 설치하는 방법은 다음과 같습니다.

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. 테스트를 @SmallTest, @MediumTest 또는 @LargeTest로 표시해야 합니다.

  5. m으로 테스트 모듈을 빌드합니다. 예를 들면 다음과 같습니다.

    m FrameworksCoreTests
    
  6. 테스트를 실행합니다.

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Tradefed를 사용하지 않는 경우 수동으로 테스트를 설치하고 실행합니다.

    1. 생성된 apk를 설치합니다.
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. 다양한 옵션으로 테스트를 실행합니다.

      1. APK의 모든 테스트

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. 특정 자바 패키지의 모든 테스트

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. 특정 클래스의 모든 테스트

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. 특정 테스트 메서드

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

테스트는 JUnit API를 사용하여 통과 또는 실패에 관한 명시적 어설션을 만들 수 있습니다. 또한, 모든 포착되지 않은 예외도 기능 오작동을 일으킵니다.

성능 측정항목을 전송하려면 테스트 코드는 Instrumentation#sendStatus를 호출하여 키-값 쌍의 목록을 전송할 수 있습니다. 참고사항:

  1. 측정항목은 정수 또는 부동 소수점일 수 있습니다.
  2. 숫자가 아닌 모든 값은 무시됩니다.
  3. 테스트 APK는 기능 테스트 또는 측정항목 테스트 중 하나일 수 있지만, 둘을 혼합한 테스트는 현재 지원되지 않습니다.