테스트 매핑을 간단하게 소개하고 Android 오픈소스 프로젝트 (AOSP)에서 테스트 구성을 시작했습니다.
테스트 매핑 정보
테스트 매핑은 Gerrit 기반 접근 방식으로, 개발자는 Android 소스 트리에서 사전 제출 및 사후 제출 테스트 규칙을 직접 만들고 테스트할 브랜치와 기기의 결정을 테스트 인프라에 맡길 수 있습니다.
테스트 매핑 정의는 TEST_MAPPING
이라는 JSON 파일로,
모든 소스 디렉터리에 배치할 수 있습니다
Atest는 TEST_MAPPING
파일을 사용하여
확인할 수 있습니다 테스트 매핑을 사용하면 Android 소스 트리 내에서 최소한의 변경으로 사전 제출 검사에 동일한 테스트 세트를 추가할 수 있습니다.
다음 예를 참고하세요.
테스트 매핑은 테스트 실행 및 결과 보고를 위해 Trade Federation(TF) 테스트 하네스를 사용합니다.
테스트 그룹 정의
테스트 매핑은 테스트 그룹을 사용하여 테스트를 그룹화합니다. 테스트 그룹의 이름은 임의의 문자열일 수 있습니다. 예를 들어 presubmit은 변경사항을 확인할 때 실행할 테스트 그룹의 이름일 수 있습니다. postsubmit는 변경사항을 병합한 후 빌드를 확인하는 데 사용되는 테스트일 수 있습니다.
빌드 스크립트 규칙 패키징
Trade Federation 테스트 하네스에서 특정 빌드에 테스트 모듈을 실행하려면 이러한 모듈에는 Soong에 test_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.xml
에RootTargetPreparer
를 사용하여 지정해야 합니다.<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"
}
]
}
속성 설정
예시에서 presubmit
과 postsubmit
는 각각 이름입니다.
테스트 그룹입니다. 자세한 내용은 테스트 그룹 정의를 참고하세요.
테스트 그룹 정보
테스트 모듈 또는 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로 테스트 실행
사전 제출 테스트 규칙을 로컬에서 실행하려면 다음 단계를 따르세요.
TEST_MAPPING
파일이 포함된 디렉터리로 이동합니다.다음 명령어를 실행합니다.
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"
}
]
}