복잡한 테스트 구성

일부 테스트 모듈은 맞춤 설정이 필요할 수 있고 테스트 사례 자체에서 실행될 수 없는 단계를 삭제해야 할 수 있습니다. 일반적인 예는 다음과 같습니다.

  • 다른 APK 설치하기(테스트 APK 외)
  • 기기에 일부 파일 푸시하기
  • 명령어(예: adb shell pm ...) 실행하기

이전에는 일반적으로 구성요소팀에서 이러한 작업을 실행하기 위해 호스트 측 테스트를 작성했으며, 테스트를 실행하기 위해 Trade Federation 하네스에 대한 이해가 필요하고 테스트 모듈의 복잡도가 증가했습니다.

이러한 작업을 지원하기 위해 CTS에서 차용한 테스트 모듈 구성이라는 개념을 도입했으며 단 몇 줄의 구성으로 위의 공통 작업 목록을 실행할 수 있습니다. 유연성을 최대화하려면 ITargetPreparer 또는 ITargetCleaner에서 정의한 자체 타겟 준비자를 구현하고 자체 테스트 모듈 구성에서 사용하도록 구성할 수도 있습니다.

테스트 모듈의 테스트 모듈 구성은 'AndroidTest.xml'이라는 필수 XML 파일로 최상위 모듈 소스 폴더에 추가됩니다. XML은 Trade Federation 테스트 자동화 하네스에서 사용하는 구성 파일 형식을 따릅니다. 현재 테스트 모듈 구성을 통해 처리되는 기본 태그는 'target_preparer' 및 'test' 태그입니다.

타겟 준비자

'target_preparer' 태그는 이름에서 알 수 있듯이 설정 메서드를 제공하는 타겟 준비자(ITargetPreparer 참고)를 정의하며, 이 타겟 준비자는 테스트를 위해 테스트 모듈이 실행되기 전에 호출됩니다. 또한 'target_preparer' 태그에서 참조되는 클래스가 ITargetCleaner도 구현하는 경우, 테스트 모듈이 완료된 후에 ITargetCleaner의 teardown 메서드가 호출됩니다.

기본 일반 모듈 구성을 사용하려면 테스트 모듈의 최상위 폴더에 'AndroidTest.xml'이라는 새 파일을 추가하고 다음 콘텐츠를 채웁니다.

<?xml version="1.0" encoding="utf-8"?>
<!-- [insert standard AOSP copyright here] -->
<configuration description="Test module config for Foo">
<!-- insert options here -->
</configuration>

예를 들어, 위의 'insert' 주석에 다음 옵션 태그를 추가할 수 있습니다.

    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
        <option name="run-command" value="settings put secure accessibility_enabled 1" />
        <option name="teardown-command" value="settings put secure accessibility_enabled 0" />
    </target_preparer>

옵션은 테스트 하네스를 다음과 같이 구성합니다.

  1. 테스트 모듈이 호출되기 전에 기기에서 셸 명령어 'settings put secure accessibility_enabled 1'을 실행합니다.
  2. 테스트 모듈이 완료된 후 셸 명령어 'settings put secure accessibility_enabled 0'을 실행합니다.

이 특정 예에서 접근성은 테스트 모듈 실행 전후에 각각 사용 설정 또는 사용 중지됩니다. 간단한 예 하나만 살펴보았기 때문에, 이제 'option' 태그가 사용되는 방식에 관해 더 자세히 알아볼 필요가 있습니다. 위에 표시된 것처럼 태그는 name과 value라는 두 가지 속성을 가질 수 있습니다. name 속성은 준비자가 제공하는 옵션 중 하나를 참조해야 합니다.

value 필드의 정확한 목적은 준비자가 옵션을 정의한 방식에 따라 다릅니다. 문자열, 숫자, 불리언 또는 파일 경로일 수 있습니다. 다음은 3가지 일반적인 타겟 준비자에 관한 요약입니다.

  • 클래스 이름: PushFilePreparer

    • 짧은 이름: push-file
    • 기능: 테스트 사례 폴더에 있는 임의의 파일을 기기의 정해진 위치에 푸시합니다.
    • 참고사항:
      • 이 준비자는 폴더에서 폴더로 또는 파일에서 파일로 푸시할 수 있습니다. 즉, 파일을 기기의 폴더 아래로 푸시할 수 없습니다. 또한, 폴더 아래에 있는 대상 파일 이름도 지정해야 합니다.
    • 옵션:
      • push-file: push-spec으로 로컬 파일이 푸시되어야 하는 기기 경로를 지정합니다. 반복될 수 있습니다. 여러 파일이 동일한 원격 경로로 푸시되도록 구성된 경우 최근에 지정된 파일이 푸시됩니다.
      • push: (지원 중단됨) '/path/to/srcfile.txt->/path/to/destfile.txt' 또는 '/path/to/srcfile.txt->/path/to/destdir/'로 형식이 지정된 push-spec으로, 반복될 수 있습니다. 이 경로는 테스트 모듈 디렉터리 또는 외부 디렉터리 자체에 대한 상대 경로일 수 있습니다.
      • post-push: 모든 푸시를 시도한 후 기기에서 실행하는 명령어('adb shell <your command>' 사용)입니다. 일반적인 사용 사례는 권한에 chmod를 사용하는 것입니다.
  • 클래스 이름: InstallApkSetup

    • 짧은 이름: install-apk
    • 기능: 임의의 APK 파일을 기기의 대상에 푸시합니다.
    • 옵션:
      • test-file-name: 기기에 설치할 APK의 이름입니다.
      • install-arg: pm 설치 명령어에 전달할 추가 인수로 '-d'와 같은 선행 대시를 포함합니다. 반복될 수 있습니다.
  • 클래스 이름: RunCommandTargetPreparer

    • 짧은 이름: run-command
    • 기능: 테스트 모듈 실행 이전 또는 이후에 임의의 셸 명령어를 실행합니다.
    • 옵션:
      • run-command: adb 셸 명령어를 실행합니다. 반복될 수 있습니다.
      • teardown-command: 해체 단계에서 adb 셸 명령어를 실행합니다. 반복될 수 있습니다.

테스트 클래스

테스트 클래스는 테스트를 실행하는 데 사용할 Trade Federation 클래스입니다.

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="android.test.example.helloworld"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

다음은 세 가지 일반적인 테스트 클래스입니다.

  • 클래스 이름: GTest

    • 짧은 이름: gtest
    • function: 주어진 기기에서 기본 테스트 패키지를 실행하는 테스트입니다.
    • 옵션:
      • native-test-device-path: 네이티브 테스트가 위치한 기기의 경로입니다.
  • 클래스 이름: InstrumentationTest

    • 짧은 이름: instrumentation
    • 함수: 주어진 기기에서 계측 테스트 패키지를 실행하는 테스트입니다.
    • 옵션:
      • 패키지: 실행할 Android 테스트 애플리케이션의 매니페스트 패키지 이름입니다.
      • 클래스: 실행할 테스트 클래스 이름입니다.
      • 메서드: 실행할 테스트 메서드 이름입니다.
  • 클래스 이름: AndroidJUnitTest

    • 기능: android.support.test.runner.AndroidJUnitRunner를 사용하여 주어진 기기에서 계측 테스트 패키지를 실행하는 테스트입니다. 이는 계측 테스트를 실행하는 주된 방법입니다.