Atest

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

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

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

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

환경 설정

Atest를 실행하려면 아래 섹션에 있는 단계를 따라 환경을 설정하세요.

환경 변수 설정

빌드 스크립트 규칙 패키징에 따라 Soong용 test_suite 또는 Make용 LOCAL_COMPATIBILITY_SUITE를 설정합니다.

1. envsetup.sh 실행

Android 소스 체크아웃의 루트에서 다음을 실행합니다.

    source build/envsetup.sh
    

2. lunch 실행

$ lunch 명령어를 실행하여 지원되는 기기 메뉴를 표시합니다. 기기를 찾아 해당 명령어를 실행합니다.

예를 들어 ARM 기기가 연결되어있는 경우 다음 명령어를 실행합니다.

    lunch aosp_arm64-eng
    

이렇게 하면 Atest를 실행하는 데 필요한 다양한 환경 변수가 설정되고 $PATH에 Atest 명령어가 추가됩니다.

기본 사용법

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

    atest [optional-arguments] test-to-run
    

선택적 인수

Atest 명령어에는 다음 선택적 인수를 사용할 수 있습니다.

옵션 긴 옵션 설명
-b --build 테스트 대상을 빌드합니다.
-i --install 기기에 테스트 아티팩트(APK)를 설치합니다.
-t --test 테스트를 실행합니다.
-s --serial 지정된 기기에서 테스트를 실행합니다. 한 번에 하나의 기기만 테스트할 수 있습니다.
-d --disable-teardown 테스트 해체 및 정리를 사용 중지합니다.
--info 지정된 대상의 관련 정보를 표시하고 종료합니다.
--dry-run --info의 동의어입니다.
-m --rebuild-module-info module-info.json 파일을 강제로 다시 빌드합니다.
-w --wait-for-debugger 디버거가 실행되기 전에 대기합니다. 계측 테스트용으로만 사용합니다.
-v --verbose DEBUG 수준 로깅을 표시합니다.
--generate-baseline 기본 측정항목을 생성하고 기본적으로 반복을 5회 실행합니다.
--generate-new-metrics 새 측정항목을 생성하고 기본적으로 반복을 5회 실행합니다.
--detect-regression 회귀 감지 알고리즘을 실행합니다.
--[CUSTOM_ARGS] 테스트 실행자의 맞춤 설정 args를 지정합니다.
-a --all-abi 사용 가능한 모든 기기 아키텍처에 대한 테스트를 실행합니다.
-h --help 도움말 메시지를 표시하고 종료합니다.
--host 기기 없이 호스트에서 테스트를 완전히 실행합니다.
(참고: --host를 사용하는 기기를 필요로 하는 호스트 테스트를 실행하면 실패합니다.)

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

실행할 테스트

test-to-run을 사용하여 하나 이상의 테스트를 실행할 수 있습니다. 여러 테스트를 실행하려면 테스트 참조를 공백으로 구분합니다. 예:

    atest test-to-run-1 test-to-run-2
    

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

    atest FrameworksServicesTests
    atest example/reboot
    atest FrameworksServicesTests CtsJankDeviceTestCases
    atest FrameworksServicesTests:ScreenDecorWindowTests
    

테스트를 참조하는 방법에 대한 자세한 내용은 테스트 식별을 참조하세요.

테스트 식별

테스트의 모듈 이름, 모듈:클래스, 클래스 이름, TF 통합 테스트, 파일 경로 또는 패키지 이름으로 test-to-run 인수를 지정할 수 있습니다.

모듈 이름

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

예:

    atest FrameworksServicesTests
    atest CtsJankDeviceTestCases
    

모듈:클래스

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

예:

    atest FrameworksServicesTests:ScreenDecorWindowTests
    atest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests
    atest CtsJankDeviceTestCases:CtsDeviceJankUi
    

클래스 이름

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

예:

    atest ScreenDecorWindowTests
    atest CtsDeviceJankUi
    

모듈이 명시되지 않은 경우 Atest가 잠재적인 일치를 위해 전체 소스 트리를 검색하는 데 더 많은 시간이 필요하므로 가능한 한 모듈:클래스 참조를 사용하는 것이 좋습니다.

예(가장 빠른 순서에서 가장 느린 순으로 정렬):

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

TF 통합 테스트

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

reboot.xml 테스트를 실행하려면 다음 명령어를 입력합니다.

    atest example/reboot
    

native-benchmark.xml 테스트를 실행하려면 다음 명령어를 입력합니다.

    atest native-benchmark
    

파일 경로

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

예: 경로를 통해 CtsJankDeviceTestCases 모듈을 실행하는 두 가지 방법

  1. android repo-root에서 모듈을 실행합니다.

        atest cts/tests/jank
        
  2. android repo-root/cts/tests/jank에서 다음 명령어를 실행합니다.

        atest .
        

예: 경로를 통해 CtsJankDeviceTestCases 모듈 내에서 특정 클래스를 실행합니다. android repo-root에서 다음 명령어를 실행합니다.

    atest cts/tests/jank/src/android/jank/cts/ui/CtsDeviceJankUi.java
    

예: 경로를 통해 통합 테스트를 실행합니다. android repo-root에서 다음 명령어를 실행합니다.

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

패키지 이름

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

예:

    atest com.android.server.wm
    atest android.jank.cts
    

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

-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 reference-to-class#method1
    

쉼표로 여러 메서드를 지정할 수 있습니다.

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

예:

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

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

  1. 모듈:클래스 사용

        atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange
        
  2. android repo-root에서

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

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

    atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval ScreenDecorWindowTests#testMultipleDecors
    

여러 클래스 실행

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

예:

  • 같은 모듈에 두 개의 클래스가 있습니다.

        atest FrameworksServicesTests:ScreenDecorWindowTests FrameworksServicesTests:DimmerTests
        
  • 서로 다른 모듈에 두 개의 클래스가 있습니다.

        atest FrameworksServicesTests:ScreenDecorWindowTests CtsJankDeviceTestCases:CtsDeviceJankUi
        

네이티브 테스트 실행

Atest는 네이티브 테스트를 실행할 수 있습니다.

예:

  • 입력 테스트:

        atest -a libinput_tests inputflinger_tests
        

-a를 통해 사용 가능한 모든 기기 아키텍처에 대한 테스트를 실행합니다. 이 예에서는 armeabi-v7a(ARM 32-bit) 및 arm64-v8a(ARM 64-bit)입니다.

측정항목 회귀 감지

회귀 감지를 실행하지 않고 패치 전 또는 패치 후 측정항목을 생성할 수 있습니다. 반복 횟수를 지정할 수 있지만 기본값은 5입니다.

예:

    atest test-to-run --generate-baseline [optional-iteration]
    atest test-to-run --generate-new-metrics [optional-iteration]
    

로컬 회귀 감지는 다음 세 가지 옵션으로 실행할 수 있습니다.

  1. 기준(패치 전) 측정항목을 생성하고 폴더에 배치합니다. Atest는 지정된 반복을 통해 테스트를 실행하고 패치 후 측정항목을 생성한 후 기존 측정항목과 비교합니다.

    예:

        atest test-to-run --detect-regression /path/to/baseline --generate-new-metrics [optional-iteration]
        
  2. Atest는 이전에 생성된 패치 후 측정항목을 포함하는 폴더를 사용하여 테스트를 n회 반복 실행하고 패치 전 측정항목의 새로운 집합을 생성하며 이들을 제공된 측정항목과 비교합니다.

    예:

        atest test-to-run --detect-regression /path/to/new --generate-baseline [optional-iteration]
        
  3. Atest는 패치 전 및 패치 후 측정항목이 모두 포함된 두 개의 폴더를 사용하여 테스트 없이 회귀 감지 알고리즘을 실행합니다.

    예:

        atest --detect-regression /path/to/baseline /path/to/new