계측 테스트

먼저 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
        

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

  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. make로 테스트 모듈을 빌드합니다. 예를 들면 다음과 같습니다.

    make FrameworksCoreTests -j
        
  6. 테스트를 실행합니다.

    • 가장 간단한 해결책은 Atest를 다음과 같이 사용하는 것입니다.

      atest FrameworksCoreTests
          
    • 또는 Trade Federation 테스트 하네스를 사용하여 테스트를 더 복잡하게 만들 수도 있습니다.

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

    1. 생성된 apk를 설치합니다.
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
        

    팁: adb shell pm list instrumentation을 사용하여 방금 설치한 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는 기능 테스트 또는 측정 항목 테스트 중 하나일 수 있지만 둘이 합쳐진 테스트는 현재 지원되지 않습니다.