테스트 실행(Atest)

Atest는 사용자가 Android 테스트를 로컬에서 빌드, 설치, 실행할 수 있는 명령줄 도구로 Trade Federation 테스트 하네스 명령줄 옵션에 관한 지식이 없어도 테스트를 매우 빠르게 재실행할 수 있습니다. 이 페이지에서는 Atest를 사용하여 Android 테스트를 실행하는 방법을 설명합니다.

Android용 테스트 작성에 관한 일반적인 정보는 Android 플랫폼 테스트를 참고하세요.

Atest의 전체 구조에 관한 내용은 Atest 개발자 가이드를 참고하세요.

Atest를 통해 TEST_MAPPING 파일의 테스트를 실행하는 방법은 TEST_MAPPING 파일의 테스트 실행을 참고하세요.

Atest에 기능을 추가하려면 Atest 개발자 워크플로를 따르세요.

환경 설정

Atest 환경을 설정하려면 환경 설정, 타겟 선택, 코드 빌드의 안내를 따릅니다.

기본 사용법

Atest 명령어는 다음과 같은 형식을 취합니다.

atest test-to-run [optional-arguments]

인수(선택사항)

다음 표는 가장 흔히 사용되는 인수를 보여줍니다. 전체 목록은 atest --help를 통해 확인할 수 있습니다.

옵션 긴 옵션 설명
-b --build 테스트 타겟을 빌드합니다. (기본)
-i --install 기기에 테스트 아티팩트(APK)를 설치합니다. (기본)
-t --test 테스트를 실행합니다. (기본)
-s --serial 지정된 기기에서 테스트를 실행합니다. 한 번에 하나의 기기만 테스트할 수 있습니다.
-d --disable-teardown 테스트 해체 및 정리를 사용 중지합니다.
--info 지정된 타겟과 관련된 정보를 표시한 후 종료합니다.
--dry-run 실제로 테스트를 빌드, 설치 또는 실행하지 않고 Atest를 사전 점검합니다.
-m --rebuild-module-info module-info.json 파일을 강제로 다시 빌드합니다.
-w --wait-for-debugger 디버거가 완료된 후에 실행합니다.
-v --verbose DEBUG 수준 로깅을 표시합니다.
--iterations 최대 반복 횟수에 도달할 때까지 테스트를 반복 실행합니다. (기본값은 10임)
--rerun-until-failure [COUNT=10] 실패가 발생하거나 최대 반복 횟수에 도달할 때까지 모든 테스트를 재실행합니다. (기본값은 10임)
--retry-any-failure [COUNT=10] 테스트가 통과하거나 최대 반복 횟수에 도달할 때까지 실패한 테스트를 재실행합니다. (기본값은 10임)
--start-avd 자동으로 AVD를 만들고 가상 기기에서 테스트를 실행합니다.
--acloud-create acloud 명령어를 사용하여 AVD를 만듭니다.
--[CUSTOM_ARGS] 테스트 실행자용 맞춤 인수를 지정합니다.
-a --all-abi 사용 가능한 모든 기기 아키텍처를 대상으로 테스트를 실행합니다.
--host 기기 없이 전적으로 호스트에서 테스트를 실행합니다.
참고: --host를 사용하는 기기가 필요한 호스트 테스트를 실행하면 실패합니다.
--history 시간순으로 테스트 결과를 표시합니다.
--latest-result 최신 테스트 결과를 출력합니다.

-b, -i, -t에 관한 자세한 내용은 단계 지정: 빌드, 설치 또는 실행 섹션을 참고하세요.

테스트 지정

테스트를 실행하려면 다음 식별자 중 하나를 사용하여 테스트를 한 개 이상 지정합니다.

  • 모듈 이름
  • 모듈:클래스
  • 클래스 이름
  • Tradefed 통합 테스트
  • 파일 경로
  • 패키지 이름

다음과 같이 공백으로 여러 테스트에 관한 참조를 구분합니다.

atest test-identifier-1 test-identifier-2

모듈 이름

전체 테스트 모듈을 실행하려면 모듈 이름을 사용합니다. 테스트의 Android.mk 또는 Android.bp 파일에서 LOCAL_MODULE 또는 LOCAL_PACKAGE_NAME 변수에 나타나는 이름을 입력합니다.

예를 들면 다음과 같습니다.

atest FrameworksServicesTests
atest CtsVideoTestCases

모듈:클래스

모듈 내에서 단일 클래스를 실행하려면 모듈:클래스를 사용합니다. 모듈모듈 이름에 설명된 것과 동일합니다. 클래스.java 파일의 테스트 클래스 이름이며 정규화된 클래스 이름 또는 기본 이름이 될 수 있습니다.

예를 들면 다음과 같습니다.

atest CtsVideoTestCases:VideoEncoderDecoderTest
atest FrameworksServicesTests:ScreenDecorWindowTests
atest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests

클래스 이름

명시적으로 모듈 이름을 지정하지 않고 단일 클래스를 실행하려면 클래스 이름을 사용합니다.

예를 들면 다음과 같습니다.

atest ScreenDecorWindowTests
atest VideoEncoderDecoderTest

Tradefed 통합 테스트

TradeFed(비모듈)에 직접 통합된 테스트를 실행하려면 tradefed.sh list configs 명령어의 출력에 표시된 이름을 입력합니다. 예:

reboot.xml 테스트 실행 방법은 다음과 같습니다.

atest example/reboot

native-benchmark.xml 테스트 실행 방법은 다음과 같습니다.

atest native-benchmark

파일 경로

Atest는 테스트 파일 또는 디렉터리 경로를 적절하게 입력하여 모듈 기반 테스트와 통합 기반 테스트를 모두 실행할 수 있습니다. 또한 클래스의 Java 파일 경로를 지정하여 단일 클래스도 실행할 수 있습니다. 상대 경로와 절대 경로 모두 지원됩니다.

모듈 실행

다음 예는 파일 경로를 사용하여 CtsVideoTestCases 모듈을 실행하는 두 가지 방법을 보여줍니다.

Android repo-root에서 다음을 실행합니다.

atest cts/tests/video

Android repo-root/cts/tests/video에서 다음을 실행합니다.

    atest .

테스트 클래스 실행

다음 예는 파일 경로를 사용하여 CtsVideoTestCases 모듈 내의 특정 클래스를 실행하는 방법을 보여줍니다.

Android repo-root에서 다음을 실행합니다.

    atest cts/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java

통합 테스트 실행

다음 예는 Android repo-root에서 파일 경로를 사용하여 통합 테스트를 실행하는 방법을 보여줍니다.

    atest tools/tradefederation/contrib/res/config/example/reboot.xml

패키지 이름

Atest는 패키지 이름으로 테스트를 검색하는 기능을 지원합니다.

예:

    atest com.android.server.wm
    atest com.android.uibench.janktests

단계 지정: 빌드, 설치 또는 실행

-b, -i, -t 옵션을 사용하여 실행할 단계를 지정합니다. 옵션을 지정하지 않으면 모든 단계가 실행됩니다.

  • 타겟만 빌드: atest -b test-to-run
  • 테스트만 실행: atest -t test-to-run
  • APK 설치 및 테스트 실행: atest -it test-to-run
  • 빌드 및 실행만 하고 설치는 하지 않음: atest -bt test-to-run

Atest는 테스트가 정리 또는 해체 단계를 강제로 건너뛰도록 할 수 있습니다. CTS를 비롯한 다수의 테스트에서는 테스트 실행 후 기기를 정리하기 때문에 --disable-teardown 매개변수 없이 -t로 테스트를 다시 실행하려고 하면 실패합니다. -t 앞에 -d를 사용하여 테스트 정리 단계를 건너뛰고 테스트를 반복합니다.

atest -d test-to-run
atest -t test-to-run

특정 메서드 실행

Atest는 테스트 클래스 내에서 특정 메서드를 실행할 수 있습니다. 이렇게 하면 전체 모듈을 빌드해야 하지만, 테스트를 실행하는 데 필요한 시간이 줄어듭니다. 특정 메서드를 실행하려면 클래스를 식별하는 데 지원되는 방법(모듈:클래스, 파일 경로 등)을 사용하여 클래스를 식별하고 메서드 이름을 추가합니다.

atest reference-to-class#method1

여러 메서드를 지정하는 경우 쉼표로 메서드를 구분합니다.

atest reference-to-class#method1,method2,method3

예:

atest com.android.server.wm.ScreenDecorWindowTests#testMultipleDecors
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval

다음 두 예는 단일 메서드인 testFlagChange를 실행하는 기본 방법을 보여줍니다. 모듈 또는 Java 파일 위치를 지정하면 Atest에서 테스트를 훨씬 빠르게 찾을 수 있으므로 클래스 이름만 사용하는 것보다 다음의 예를 사용하는 것이 더 좋습니다.

모듈:클래스 사용

atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange

Android repo-root에서 다음을 실행합니다.

atest frameworks/base/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java#testFlagChange

서로 다른 클래스와 모듈에서 여러 메서드를 실행할 수 있습니다.

atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval ScreenDecorWindowTests#testMultipleDecors

여러 클래스 실행

여러 테스트를 실행하는 것과 같은 방식으로 클래스를 공백으로 구분하여 여러 클래스를 실행할 수 있습니다. Atest는 클래스를 효율적으로 빌드하고 실행하므로 모듈의 클래스 하위 집합을 지정하면 전체 모듈을 실행하는 것보다 성능이 향상됩니다.

다음과 같이 동일 모듈에 있는 두 개의 클래스를 실행합니다.

atest FrameworksServicesTests:ScreenDecorWindowTests FrameworksServicesTests:DimmerTests

다음과 같이 서로 다른 모듈에 있는 두 개의 클래스를 실행합니다.

atest FrameworksServicesTests:ScreenDecorWindowTests CtsVideoTestCases:VideoEncoderDecoderTest

GTest 바이너리 실행

Atest는 GTest 바이너리를 실행할 수 있습니다. -a를 사용하여 사용 가능한 모든 기기 아키텍처를 대상으로 이러한 테스트를 실행합니다. 이 예에서는 armeabi-v7a(ARM 32비트) 및 arm64-v8a(ARM 64비트)입니다.

입력 테스트의 예:

atest -a libinput_tests inputflinger_tests

실행할 특정 GTest 바이너리를 선택하려면, 콜론(:)으로 테스트 이름을 지정하고 해시태그(#)로 개별 메서드를 지정합니다.

다음과 같은 테스트 정의를 예로 들어 보겠습니다.

TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents)

다음 명령어를 실행하여 전체 테스트를 지정합니다.

atest inputflinger_tests:InputDispatcherTest

또는 다음을 사용하여 개별 테스트를 실행합니다.

atest inputflinger_tests:InputDispatcherTest#InjectInputEvent_ValidatesKeyEvents

TEST_MAPPING에서 테스트 실행

Atest는 TEST_MAPPING 파일의 테스트를 실행할 수 있습니다.

암시적으로 사전 제출 테스트 실행

현재 및 상위 디렉터리에 있는 TEST_MAPPING 파일에서 사전 제출 테스트를 실행합니다.

atest

/path/to/project 및 이 디렉터리의 상위 디렉터리에 있는 TEST_MAPPING 파일에서 사전 제출 테스트를 실행합니다.

atest --test-mapping /path/to/project

지정된 테스트 그룹 실행

사용 가능한 테스트 그룹은 presubmit(기본값), postsubmit, mainline-presubmit, all입니다.

현재 및 상위 디렉터리에 있는 TEST_MAPPING 파일에서 사후 제출 테스트를 실행합니다.

atest :postsubmit

TEST_MAPPING 파일의 모든 그룹에서 테스트를 실행합니다.

atest :all

/path/to/project 및 이 디렉터리의 상위 디렉터리에 있는 TEST_MAPPING 파일에서 사후 제출 테스트를 실행합니다.

atest --test-mapping /path/to/project:postsubmit

/path/to/project 및 이 디렉터리의 상위 디렉터리에 있는 TEST_MAPPING 파일에서 메인라인 테스트를 실행합니다.

atest --test-mapping /path/to/project:mainline-presubmit

하위 디렉터리의 테스트 실행

기본적으로 Atest는 TEST_MAPPING 파일에서 상위(현재 디렉터리 또는 지정된 디렉터리의 상위 디렉터리)에 있는 테스트만 검색합니다. 하위 디렉터리에 있는 TEST_MAPPING 파일에서도 테스트를 실행하려면 --include-subdirs를 사용하여 Atest에 이러한 테스트도 포함되도록 합니다.

atest --include-subdirs /path/to/project

테스트 반복 실행

--iterations 인수를 전달하여 테스트를 반복 실행합니다. 통과 여부와 상관없이 Atest는 최대 반복 횟수에 도달할 때까지 테스트를 반복합니다.

예를 들면 다음과 같습니다.

기본적으로 Atest는 10회 반복합니다. 반복 횟수는 양의 정수여야 합니다.

atest test-to-run --iterations
atest test-to-run --iterations 5

다음 방법을 사용하면 불안정한 테스트를 더 쉽게 감지할 수 있습니다.

방법 1: 실패가 발생하거나 최대 반복 횟수에 도달할 때까지 모든 테스트를 실행합니다.

  • 실패가 발생하거나 반복이 10회(기본값)에 도달하면 중지합니다.
    atest test-to-run --rerun-until-failure
    
  • 실패가 발생하거나 반복이 100회에 도달하면 중지합니다.
    atest test-to-run --rerun-until-failure 100
    

방법 2: 테스트가 통과하거나 최대 반복 횟수에 도달할 때까지 실패한 테스트만 실행합니다.

  • test-to-run에 여러 테스트 사례가 있고 그중 하나가 실패한다고 가정합니다. 실패한 테스트만 10회(기본값) 실행하거나 테스트가 통과할 때까지 실행합니다.
    atest test-to-run --retry-any-failure
    
  • 테스트가 통과하거나 100회에 도달하면 실패한 테스트 실행을 중지합니다.
    atest test-to-run --retry-any-failure 100
    

AVD에서 테스트 실행

Atest는 새로 만든 AVD에서 테스트를 실행할 수 있습니다. acloud create를 실행하여 AVD를 만들고 아티팩트를 빌드한 다음 아래 예를 사용하여 테스트를 실행합니다.

AVD를 시작하고 테스트를 실행합니다.

acloud create --local-instance --local-image && atest test-to-run

테스트 실행의 일부로 AVD를 시작합니다.

atest test-to-run --acloud-create "--local-instance --local-image"

자세한 내용은 acloud create --help를 실행하여 확인하세요.

옵션을 모듈에 전달

Atest는 옵션을 테스트 모듈에 전달할 수 있습니다. 테스트 실행에 TradeFed 명령줄 옵션을 추가하려면 다음 구조를 사용하고 맞춤 인수가 Tradefed 명령줄 옵션 형식을 준수하는지 확인합니다.

atest test-to-run -- [CUSTOM_ARGS]

테스트 구성 파일에 정의된 타겟 준비자 또는 테스트 실행자에 테스트 모듈 옵션을 전달합니다.

atest test-to-run -- --module-arg module-name:option-name:option-value
atest GtsPermissionTestCases -- --module-arg GtsPermissionTestCases:ignore-business-logic-failure:true

실행자 유형 또는 클래스에 옵션을 전달합니다.

atest test-to-run -- --test-arg test-class:option-name:option-value
atest CtsVideoTestCases -- --test-arg com.android.tradefed.testtype.JarHosttest:collect-tests-only:true

테스트 전용 옵션에 관한 자세한 내용은 옵션을 모듈에 전달을 참고하세요.