테스트 매핑

테스트 매핑을 간단하게 소개하고 Android 오픈소스 프로젝트에서 테스트를 쉽게 구성하는 방법을 설명합니다.

테스트 매핑이란 무엇일까요?

테스트 매핑은 Gerrit 기반 접근 방식으로, 개발자는 Android 소스 트리에서 사전 제출 및 사후 제출 테스트 규칙을 직접 만들고 테스트할 브랜치와 기기의 결정을 테스트 인프라에 그대로 둘 수 있습니다. 테스트 매핑 정의는 모든 소스 디렉터리에 배치할 수있는 TEST_MAPPING JSON 파일입니다.

Atest는 TEST_MAPPING 파일을 사용하여 관련 디렉터리에서 사전 제출 테스트를 수행할 수 있습니다. 테스트 매핑을 사용하면 동일한 테스트 세트를 추가한 뒤 Android 소스 트리 내에서 간단히 변경하여 사전 제출 테스트를 할 수 있습니다.

다음 예를 참조하세요.

services.core의 TEST_MAPPING에 사전 제출 테스트 추가

가져오기를 통해 도구/덱스터용 TEST_MAPPING에 사전 제출 테스트 추가

테스트 매핑은 테스트 실행 및 결과 보고를 위해 Trade Federation(TF) 테스트 하네스를 사용합니다.

테스트 그룹 정의

테스트 매핑은 test group을 통해 테스트를 그룹화합니다. 테스트 그룹의 이름에 임의의 문자열을 지정할 수 있습니다. 예를 들어 presubmit은 변경사항을 확인할 때 실행할 테스트 그룹에 사용될 수 있습니다. postsubmit 테스트를 사용하면 변경사항을 병합한 후 빌드를 확인할 수 있습니다.

빌드 스크립트 규칙 패키징

Trade Federation 테스트 하네스에서 특정 빌드에 대해 테스트 매핑의 테스트 모듈을 실행하려면 다음 2개의 모음 중 하나에 대해 Soongtest_suite를 설정하고 Make에 LOCAL_COMPATIBILITY_SUITE를 설정해야합니다.

  • device-tests - 특정 기기 CPU에 대해 빌드됨
  • general-tests - 모든 애플리케이션 바이너리 인터페이스(ABI)에 대해 빌드됨

의심이 드는 경우, gtests를 device-tests로 설정하고 APK 테스트를 general-tests로 설정합니다.

예:

Android.bp: test_suites: ["device-tests"],
    Android.mk: LOCAL_COMPATIBILITY_SUITE := device-tests
    

테스트 매핑 파일 만들기

테스트 범위가 필요한 디렉터리의 경우 아래와 같이 TEST_MAPPING JSON 파일을 추가하면 됩니다. 이러한 규칙은 해당 디렉터리 또는 하위 디렉터리에서 파일이 터치될 때 사전 제출 검사에서 테스트가 실행되도록 합니다.

예제 따르기

다음은 샘플 TEST_MAPPING 파일입니다.

{
      "presubmit": [
        {
          "name": "CtsWindowManagerDeviceTestCases",
          "options": [
            {
              "include-annotation": "android.platform.test.annotations.RequiresDevice"
            }
          ],
          "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
        },
        {
          "name" : "net_test_avrcp",
          "host" : true
        }
      ],
      "postsubmit": [
        {
          "name": "CtsWindowManagerDeviceTestCases"
        }
      ],
      "imports": [
        {
          "path": "frameworks/base/services/core/java/com/android/server/am"
        }
      ]
    }
    

속성 설정

위의 예에서 presubmitpostsubmit은 각 테스트 그룹의 이름입니다. 테스트 그룹에 대한 자세한 내용은 테스트 그룹 정의를 참조하세요.

테스트 모듈이름 또는 Trade Federation 통합 테스트 이름(테스트 XML 파일에 대한 리소스 경로, 예: uiautomator/uiautomator-demo)은 name 속성의 값으로 설정할 수 있습니다. 이름 필드는 클래스 name 또는 테스트 메서드 name을 사용할 수 없습니다. 테스트 실행 범위를 좁히려면 여기에 include-filter와 같은 옵션을 사용할 수 있습니다. (include-filter 샘플 사용법)을 참조하세요.

호스트 설정은 테스트가 기기 없이 호스트에서 실행되는 테스트인지를 나타냅니다. 기본값은 false이며 테스트를 실행하려면 기기가 필요합니다. 지원되는 테스트 유형은 네이티브 테스트의 경우 HostGTest, JUnit 테스트의 경우 HostTest입니다.

file_patterns 속성을 사용하면 TEST_MAPPING 파일이 포함된 디렉터리를 기준으로 소스 코드 파일의 상대 경로와 일치하는 정규 표현식 문자열 목록을 설정할 수 있습니다. 위의 예에서 테스트 CtsWindowManagerDeviceTestCases는 TEST_MAPPING 파일 또는 하위 디렉터리와 동일한 디렉터리에 있는 Window 또는 Activity로 시작하는 자바 파일이 변경될 때만 사전 제출로 실행됩니다. 역슬래시(\)는 JSON 파일에 있으므로 이스케이프 처리되어야 합니다.

imports 속성을 사용하면 콘텐츠를 복사하지 않고 다른 TEST_MAPPING 파일에 테스트를 포함할 수 있습니다. 가져온 경로의 상위 디렉터리에 있는 TEST_MAPPING 파일도 포함됩니다. 테스트 매핑은 중첩 가져오기를 허용합니다. 이는 두 TEST_MAPPING 파일이 서로를 가져올 수 있고 테스트 매핑이 포함된 테스트를 적절하게 병합할 수 있음을 의미합니다.

options 속성에는 추가 TradeFed 명령줄 옵션이 있습니다.

테스트에 사용할 수 있는 옵션의 전체 목록을 보려면 다음을 실행합니다.

    tradefed.sh run commandAndExit [test_module] --help
    

옵션의 작동 방식에 대한 자세한 내용은 TradeFed 옵션 처리를 참조하세요.

Atest로 테스트 실행

사전 제출 테스트 규칙을 로컬에서 실행하려면 다음 단계를 따르세요.

  1. TEST_MAPPING 파일이 있는 디렉터리로 이동합니다.
  2. 명령어를 실행합니다.
    atest
    

현재 디렉터리와 상위 디렉터리의 TEST_MAPPING 파일에 구성된 모든 사전 제출 테스트가 실행됩니다. Atest는 사전 제출(A 및 B)에 대한 두 개의 테스트를 찾아 실행합니다.

현재 작업 디렉터리(CWD) 및 상위 디렉터리의 TEST_MAPPING 파일에서 사전 제출 테스트를 실행하는 가장 간단한 방법입니다. TEST_MAPPING 파일이 inherit_parent를 false로 설정하지 않는 한 Atest는 CWD 및 모든 상위 디렉터리에서 TEST_MAPPING 파일을 찾아 사용합니다.

소스 코드 구성

다음 예는 소스 트리 전체에 TEST_MAPPING 파일을 구성하는 방법을 보여줍니다.

src
    ├── project_1
    │   └── TEST_MAPPING
    ├── project_2
    │   └── TEST_MAPPING
    └── TEST_MAPPING
    

src/TEST_MAPPING 콘텐츠:

{
      "presubmit": [
        {
          "name": "A"
        }
      ]
    }
    

src/project_1/TEST_MAPPING 콘텐츠:

{
      "presubmit": [
        {
          "name": "B"
        }
      ],
      "postsubmit": [
        {
          "name": "C"
        }
      ],
      "other_group": [
        {
          "name": "X"
        }
      ]}
    

src/project_2/TEST_MAPPING 콘텐츠:

{
      "presubmit": [
        {
          "name": "D"
        }
      ],
      "import": [
        {
          "path": "src/project_1"
        }
      ]}
    

대상 디렉터리 지정

해당 디렉터리의 TEST_MAPPING 파일에서 테스트를 실행할 대상 디렉터리를 지정할 수 있습니다. 다음 명령어는 두 개의 테스트(A, B)를 실행합니다.

    atest --test-mapping src/project_1
    

사후 제출 테스트 규칙 실행

또한 이 명령어를 사용하여 src_path(CWD에 기본값)와 상위 디렉터리의 TEST_MAPPING에 정의된 사후 제출 테스트 규칙을 실행할 수 있습니다.

    atest [--test-mapping] [src_path]:postsubmit
    

기기가 필요 없는 테스트만 실행

Atest에 --host 옵션을 사용하면 기기는 필요 없이 호스트에 대해 구성된 테스트만 실행할 수 있습니다. 이 옵션이 없으면 Atest는 기기가 필요한 테스트와 호스트에서 실행되어 기기가 필요 없는 테스트를 모두 실행합니다. 테스트는 두 개의 개별 모음에서 실행됩니다.

    atest [--test-mapping] --host
    

테스트 그룹 식별

Atest 명령어에서 테스트 그룹을 지정할 수 있습니다. 다음 명령어는 하나의 테스트 (C)만 포함된 src/project_1 디렉터리의 파일과 관련된 모든 사후 제출 테스트를 실행합니다.

또는 :all을 사용하여 그룹에 관계없이 모든 테스트를 실행할 수 있습니다. 다음 명령어는 A, B, C, X 등 4개의 테스트를 실행합니다.

    atest --test-mapping src/project_1:all
    

하위 디렉터리 포함

기본적으로 TEST_MAPPING에서 Atest로 테스트를 실행하면 CWD(또는 지정된 디렉터리) 및 상위 디렉터리에 있는 TEST_MAPPING에 구성된 사전 제출 테스트만 실행됩니다. 테스트를 하위 디렉터리의 모든 TEST_MAPPING 파일에서 실행하려면 --include-subdir 옵션을 사용하여 Atest가 강제로 이러한 테스트를 포함하도록 합니다.

    atest --include-subdir
    

--include-subdir 옵션을 지정하지 않으면 Atest는 A 테스트만 실행합니다. --include-subdir 옵션을 사용하면 Atest는 두 개의 테스트(A, B)를 실행합니다.

행 수준 주석 지원

행 수준 //-format 주석을 추가하여 TEST_MAPPING 파일을 만들고 잇따른 설정에 대한 설명을 추가할 수 있습니다. ATEST 및 Trade Federation은 TEST_MAPPING을 주석 없이 유효한 JSON 형식으로 사전 처리합니다. JSON 파일을 깨끗하고 읽기 쉽게 유지하기 위해 행 수준의 //-format 주석만 지원됩니다.

예:

{
      // For presubmit test group.
      "presubmit": [
        {
          // Run test on module A.
          "name": "A"
        }
      ]
    }