테스트 실행(Atest)

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

Android용 테스트 작성에 대한 일반적인 정보는 Android 플랫폼 테스트 를 참조하십시오.

Atest의 전체 구조에 대한 정보는 Atest 개발자 안내서 를 참조하십시오.

Atest를 통해 TEST_MAPPING 파일에서 테스트를 실행하는 방법에 대한 자세한 내용은 TEST_MAPPING 파일 에서 테스트 실행 을 참조하세요.

Atest에 기능을 추가하려면 Atest Developer Workflow 를 따르십시오.

환경 설정

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

모듈:클래스

모듈 내에서 단일 클래스를 실행하려면 Module:Class 를 사용하십시오. 모듈모듈 이름 에 설명된 것과 동일합니다. Class.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와 같은 많은 테스트는 테스트가 실행된 후 장치를 정리하므로 -t 로 테스트를 다시 실행하려고 하면 --disable-teardown 매개변수가 없으면 실패합니다. 테스트 정리 단계를 건너뛰고 반복적으로 테스트하려면 -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-presubmitall 입니다.

현재 및 상위 디렉터리의 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

테스트 전용 옵션에 대한 자세한 내용 은 모듈에 옵션 전달을 참조하십시오.