테스트 매핑

테스트 매핑을 간단하게 소개하고 Android 오픈소스 프로젝트 (AOSP)에서 테스트 구성을 시작했습니다.

테스트 매핑 정보

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

AtestTEST_MAPPING 파일을 사용하여 확인할 수 있습니다 테스트 매핑을 사용하면 Android 소스 트리 내에서 최소한의 변경으로 사전 제출 검사에 동일한 테스트 세트를 추가할 수 있습니다.

다음 예를 참고하세요.

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

테스트 그룹 정의

테스트 매핑은 테스트 그룹을 사용하여 테스트를 그룹화합니다. 테스트 그룹의 이름은 임의의 문자열일 수 있습니다. 예를 들어 presubmit은 변경사항을 확인할 때 실행할 테스트 그룹의 이름일 수 있습니다. postsubmit는 변경사항을 병합한 후 빌드를 확인하는 데 사용되는 테스트일 수 있습니다.

빌드 스크립트 규칙 패키징

Trade Federation 테스트 하네스에서 특정 빌드에 테스트 모듈을 실행하려면 이러한 모듈에는 Soongtest_suites를 설정하거나 Make에 LOCAL_COMPATIBILITY_SUITE를 설정하여 다음 두 모음 중 하나에 설정해야 합니다.

  • general-tests는 기기별 테스트에 의존하지 않는 테스트용입니다. 기능 (예: 대부분의 장치가 지원하지 않는 공급업체별 하드웨어 있습니다. 대부분의 테스트는 general-tests 모음에 있어야 합니다. 하나의 ABI, 비트율 또는 하드웨어 기능 (예: HWASan)에만 한정됩니다. 각 ABI에 대해 별도의 test_suites 타겟)을 실행해야 하는 경우에도 할 수 있습니다.
  • device-tests는 기기별 기능에 종속되는 테스트용입니다. 일반적으로 이러한 테스트는 vendor/ 아래에 있습니다. 기기별 특정 기기 고유의 기능만 의미하므로 JUnit 테스트와 GTest 테스트 (일반적으로 general-tests).

예:

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

테스트 모음에서 실행되도록 테스트 구성

테스트 모음 내에서 테스트가 실행되려면 테스트는 다음을 충족해야 합니다.

  • 빌드 제공업체가 없어야 합니다.
  • 작업이 완료된 후 정리해야 합니다(예: 임시 파일 삭제). 테스트 중에 생성된 파일을 찾습니다.
  • 시스템 설정을 기본값 또는 원래 값으로 변경해야 합니다.
  • 기기가 특정 상태에 있다고 가정해서는 안 됩니다(예: 루트 준비). 대부분의 테스트는 실행하는 데 루트 권한이 필요하지 않습니다. 테스트에 루트가 있어야 하는 경우 다음 예와 같이 AndroidTest.xmlRootTargetPreparer를 사용하여 지정해야 합니다.

    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
    

테스트 매핑 파일 만들기

테스트 범위가 필요한 디렉터리의 경우 와 유사한 TEST_MAPPING JSON 파일을 추가합니다. 이러한 규칙은 애플리케이션이 해당 디렉터리나 하위 디렉터리입니다.

다음은 샘플 TEST_MAPPING 파일(JSON 형식이지만 주석이 지원됨)입니다.

{
  "presubmit": [
    // JUnit test with options and file patterns.
    {
      "name": "CtsWindowManagerDeviceTestCases",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.RequiresDevice"
        }
      ],
      "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
    },
    // Device-side GTest with options.
    {
      "name" : "hello_world_test",
      "options": [
        {
          "native-test-flag": "\"servicename1 servicename2\""
        },
        {
          "native-test-timeout": "6000"
        }
      ]
    }
    // Host-side GTest.
    {
      "name" : "net_test_avrcp",
      "host" : true
    }
  ],
  "postsubmit": [
    {
      "name": "CtsDeqpTestCases",
      "options": [
        {
          // Use regex in include-filter which is supported in AndroidJUnitTest
          "include-filter": "dEQP-EGL.functional.color_clears.*"
        }
      ]
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

속성 설정

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

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

테스트의 host 설정은 테스트가 기기 없는 테스트인지를 나타냅니다. 호스트에서 실행 중인지 여부를 확인할 수 있습니다 기본값은 false이며 이는 테스트를 의미합니다. 장치가 실행되어야 합니다. 지원되는 테스트 유형은 다음과 같습니다. HostGTest: GTest 바이너리 및 JUnit용 HostTest 있습니다

file_patterns 속성을 사용하면 정규 표현식 문자열 목록을 설정할 수 있습니다. 를 사용하여 소스 코드 파일의 상대 경로를 일치시킬 수 있습니다( 디렉터리(TEST_MAPPING 파일 포함)를 찾습니다. 에서 테스트 CtsWindowManagerDeviceTestCases는 Java 파일이 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 파일에서 사전 제출 테스트를 실행하는 가장 직접적인 방법입니다. 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 옵션을 사용하여 구성된 테스트만 실행할 수 있습니다. 100% 업타임 체크를 제공합니다 이 옵션이 없으면 Atest는 기기가 필요한 테스트와 기기가 필요 없는 호스트에서 실행되는 테스트를 모두 실행합니다. 테스트는 두 개의 개별 모음에서 실행됩니다.

atest [--test-mapping] --host

테스트 그룹 식별

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

또는 :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)를 실행합니다.

행 수준 주석 지원됨

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

예:

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