명령줄에서 테스트

이 문서에서는 명령줄에서 직접 테스트를 실행하는 방법을 설명합니다. 여기서는 개발자가 Android 앱을 만들고 앱 테스트를 작성하는 방법을 알고 있다고 가정합니다. 앱 테스트를 빌드하는 방법에 관한 자세한 내용은 Android에서 앱 테스트를 참고하세요.

Gradle 빌드 시스템을 사용하여 앱을 빌드할 때 Android Gradle 플러그인을 사용하면 명령줄을 사용하여 Gradle 프로젝트에서 테스트를 실행할 수 있습니다. 더 세밀하게 조정하려면 Android 디버그 브리지(adb) 셸을 통해 테스트를 실행할 수 있습니다. 이는 지속적 통합 환경에서 테스트를 실행할 때 유용할 수 있습니다.

명령줄에서 Gradle이 관리하는 가상 기기를 사용하여 자동화된 계측 테스트를 실행하는 방법은 Gradle 관리 기기로 테스트 확장을 참고하세요.

Gradle로 테스트 실행

Android Gradle 플러그인을 사용하면 명령줄을 사용하여 Gradle 프로젝트에서 테스트를 실행할 수 있습니다.

아래 표에는 Gradle로 테스트를 실행하는 방법이 요약되어 있습니다.

표 1. Gradle로 테스트를 실행하는 다양한 방법

단위 테스트 유형 실행할 명령어 테스트 결과 위치
로컬 단위 테스트 test 작업을 실행합니다.

./gradlew test
HTML 테스트 결과 파일:
path_to_your_project/module_name/build/reports/tests/ 디렉터리

XML 테스트 결과 파일:
path_to_your_project/module_name/build/test-results/ 디렉터리

계측 단위 테스트 connectedAndroidTest 작업을 실행합니다.

./gradlew connectedAndroidTest
HTML 테스트 결과 파일:
path_to_your_project/module_name/build/reports/androidTests/connected/ 디렉터리

XML 테스트 결과 파일:
path_to_your_project/module_name/build/outputs/androidTest-results/connected/ 디렉터리

Gradle은 작업 이름 약어를 지원합니다. 예를 들어 다음 명령어를 입력하여 connectedAndroidTest 작업을 시작할 수 있습니다.

./gradlew cAT

또한 Gradle 작업인 checkconnectedCheck 작업을 실행할 수도 있습니다. 이 작업에서는 로컬 테스트나 계측 테스트를 각각 실행하지만 다른 Gradle 플러그인이 추가한 별도의 check 작업도 포함합니다.

모듈에서 테스트 실행

test 작업과 connectedAndroidTest 작업은 프로젝트의 각 모듈에서 테스트를 실행합니다. test 또는 connectedAndroidTest 작업 앞에 모듈 이름과 콜론(:)을 붙여 특정 모듈에 대해 테스트를 실행할 수 있습니다. 예를 들어 다음 명령어는 mylibrary 모듈에 대해서만 계측 테스트를 실행합니다.

./gradlew mylibrary:connectedAndroidTest

빌드 변형에서 테스트 실행

test 작업과 connectedAndroidTest 작업은 프로젝트의 각 빌드 변형에 테스트를 실행합니다. 다음 문법을 사용하여 특정 빌드 변형을 타겟팅할 수 있습니다.

  • 로컬 단위 테스트:
    ./gradlew testVariantNameUnitTest
  • 계측 테스트:
    ./gradlew connectedVariantNameAndroidTest

특정 테스트 메서드 또는 클래스 실행

로컬 단위 테스트를 실행할 때 Gradle을 통해 --tests 플래그를 사용하여 특정 테스트를 타겟팅할 수 있습니다. 예를 들어 다음 명령어는 지정된 빌드 변형에 sampleTestMethod 테스트만 실행합니다. --tests 플래그 사용에 관한 자세한 내용은 Gradle의 테스트 필터링 문서를 읽어보세요.


./gradlew testVariantNameUnitTest --tests '*.sampleTestMethod'

adb로 테스트 실행

Android 디버그 브리지(adb)를 사용하여 명령줄에서 테스트를 실행하면 다른 어떤 메서드보다 실행할 테스트를 선택하는 옵션이 많습니다. 개별 테스트 메서드를 선택하거나 맞춤 주석에 따라 테스트를 필터링하거나 테스트 옵션을 지정할 수 있습니다. 테스트 실행이 전적으로 명령줄에서 제어되므로 셸 스크립트를 사용하여 다양한 방식으로 테스트를 맞춤설정할 수 있습니다.

명령줄에서 테스트를 실행하려면 adb shell을 실행하여 기기나 에뮬레이터의 명령줄 셸을 시작합니다. 셸 내에서 am 명령어를 사용하여 활동 관리자와 상호작용하고 instrument 하위 명령어를 사용하여 테스트를 실행할 수 있습니다.

단축키로 adb 셸을 시작하여 am instrument를 호출한 다음 한 입력줄에 모든 명령줄 플래그를 지정할 수 있습니다. 기기나 에뮬레이터에서 셸이 열려 테스트를 실행하고 출력을 생성한 다음 컴퓨터의 명령줄로 돌아옵니다.

am instrument로 테스트를 실행하려면 다음 단계를 따르세요.

  1. 기본 애플리케이션 및 테스트 패키지를 빌드하거나 다시 빌드합니다.
  2. 테스트 패키지 및 기본 애플리케이션 Android 패키지 파일(APK 파일)을 현재 Android 기기나 에뮬레이터에 설치합니다.
  3. 명령줄에 다음을 입력합니다.

    adb shell am instrument -w <test_package_name>/<runner_class>
    

    여기서 <test_package_name>은 테스트 애플리케이션의 Android 패키지 이름이고 <runner_class>는 사용 중인 Android 테스트 실행기 클래스의 이름입니다. Android 패키지 이름은 테스트 패키지의 매니페스트 파일(AndroidManifest.xml)에 있는 매니페스트 요소의 패키지 속성 값입니다.

    Android 테스트 실행기 클래스는 일반적으로 AndroidJUnitRunner입니다.

    adb shell am instrument -w com.android.example/androidx.test.runner.AndroidJUnitRunner
    

테스트 결과는 STDOUT에 표시됩니다.

am instrument 플래그

am instrument 명령어와 함께 사용할 모든 플래그의 목록을 확인하려면 adb shell am help를 실행합니다. 중요한 플래그는 다음 표에 설명되어 있습니다.

표 2. 중요한 am instrument 플래그

플래그 설명
-w (없음) 자체적으로 종료하기 전에 계측이 종료될 때까지 am instrument를 강제로 대기시킵니다. 이렇게 하면 테스트가 완료될 때까지 셸이 계속 열려 있습니다. 테스트 결과를 보려면 이 플래그가 필요합니다.
-r (없음) 원시 형식으로 결과를 출력합니다. 성능 측정을 수집하려는 경우 이 플래그를 사용하여 그 측정이 테스트 결과로 형식화되지 않도록 합니다. 이 플래그는 플래그 -e perf true(am instrument 옵션에 설명되어 있음) 섹션과 함께 사용하도록 설계되었습니다.
-e <test_options> 테스트 옵션을 키-값 쌍으로 제공합니다. am instrument 도구는 onCreate() 메서드를 통해 이를 지정된 계측 클래스로 전달합니다. -e <test_options>의 여러 일치하는 항목을 지정할 수 있습니다. 키와 값은 am instrument 옵션 섹션에 설명되어 있습니다. 이러한 키-값 쌍은 AndroidJUnitRunner 또는 InstrumentationTestRunner 및 서브클래스에서만 사용할 수 있습니다. 다른 클래스와 함께 사용하면 효과가 없습니다.
--no-hidden-api-checks (없음) 숨겨진 API 사용에 대한 제한을 사용 중지합니다. 숨겨진 API의 정의와 앱에 미치는 영향에 관한 자세한 내용은 비 SDK 인터페이스 제한사항을 읽어보세요.

am instrument 옵션

am instrument 도구는 -e 플래그를 다음 문법과 함께 사용하여 키-값 쌍의 형식으로 테스트 옵션을 AndroidJUnitRunner 또는 InstrumentationTestRunner에 전달합니다.

-e <key> <value>

일부 키는 여러 값을 허용합니다. 쉼표로 구분된 목록에 여러 값을 지정합니다. 예를 들어 AndroidJUnitRunner의 이 호출은 package 키에 여러 값을 제공합니다.

adb shell am instrument -w -e package com.android.test.package1,com.android.test.package2 \
> com.android.test/androidx.test.runner.AndroidJUnitRunner

다음 표에는 테스트 실행기와 함께 사용할 수 있는 키-값 쌍이 나열되어 있습니다.

표 3. 테스트 실행기와 함께 사용할 -e 플래그 키-값 쌍

설명
package <Java_package_name> 테스트 애플리케이션의 패키지 중 하나의 정규화된 자바 패키지 이름입니다. 이 패키지 이름을 사용하는 테스트 사례 클래스는 모두 실행됩니다. 이것은 Android 패키지 이름이 아닙니다. 테스트 패키지에는 단일 Android 패키지 이름이 있지만 그 안에 여러 자바 패키지가 있을 수 있습니다.
class <class_name> 테스트 사례 클래스 중 하나의 정규화된 자바 클래스 이름입니다. 이 테스트 사례 클래스만 실행됩니다.
<class_name>#method name 정규화된 테스트 사례 클래스 이름 및 그 메서드 중 하나입니다. 이 메서드만 실행됩니다. 클래스 이름과 메서드 이름 사이의 해시 표시(#)에 주의하세요.
func true InstrumentationTestCase를 확장하는 모든 테스트 클래스를 실행합니다.
unit true InstrumentationTestCase 또는 PerformanceTestCase를 확장하지 않는 모든 테스트 클래스를 실행합니다.
size [small | medium | large] 크기별로 주석이 달린 테스트 메서드를 실행합니다. 주석은 @SmallTest, @MediumTest, @LargeTest입니다.
perf true PerformanceTestCase를 구현하는 모든 테스트 클래스를 실행합니다. 이 옵션을 사용할 경우 am instrument-r 플래그를 지정하여 출력이 원시 형식으로 유지되고 테스트 결과로 다시 형식화되지 않도록 하세요.
debug true 디버그 모드에서 테스트를 실행합니다.
log true 지정된 모든 테스트를 로드하고 기록하지만 실행하지는 않습니다. 테스트 정보가 STDOUT에 표시됩니다. 다른 필터 및 테스트 사양의 조합을 확인할 때 사용합니다.
emma true EMMA 코드 적용 범위 분석을 실행하고 기기의 /data/<app_package>/coverage.ec에 출력을 작성합니다. 파일 위치를 재정의하려면 다음 항목에 설명된 coverageFile 키를 사용하세요.

참고: 이 옵션에는 테스트 애플리케이션의 EMMA 계측 빌드가 필요하며 coverage 타겟으로 이를 생성할 수 있습니다.

coverageFile <filename> 기기에서 EMMA 적용 범위 파일의 기본 위치를 재정의합니다. 이 값을 UNIX 형식의 경로 및 파일 이름으로 지정합니다. 기본 파일 이름은 emma 키 항목에 설명되어 있습니다.

-e 플래그를 사용하는 경우 다음 사항에 유의하세요.

  • am instrument는 키-값 쌍이 포함된 BundleonCreate(Bundle)을 호출합니다.
  • package 키는 class 키보다 우선합니다. 패키지를 지정한 다음 패키지 내에 클래스를 별도로 지정하면 Android가 테스트를 패키지에 모두 실행하고 클래스 키를 무시합니다.
  • func 키와 unit 키는 함께 사용할 수 없습니다.

사용 예

다음 섹션에서는 am instrument를 사용하여 테스트를 실행하는 예를 보여줍니다. 다음 구조를 기반으로 합니다.

  • 테스트 패키지의 Android 패키지 이름은 com.android.demo.app.tests입니다.
  • 계측 테스트 클래스 두 가지는 다음과 같습니다.
    • testMethod1 테스트 메서드가 포함된 TestClass1
    • testMethod2testMethod3 테스트 메서드가 포함된 TestClass2
  • 테스트 실행기는 AndroidJUnitRunner입니다.

전체 테스트 패키지 실행

테스트 패키지에서 모든 테스트 클래스를 실행하려면 다음을 입력하세요.

adb shell am instrument -w com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

테스트 사례 클래스에서 모든 테스트 실행

클래스 TestClass1에서 모든 테스트를 실행하려면 다음을 입력하세요.

adb shell am instrument -w  \
> -e class com.android.demo.app.tests.TestClass1 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

테스트 하위 집합 선택

TestClass1 클래스의 모든 테스트를 실행하고 TestClass2testMethod3 메서드를 실행하려면 다음을 입력하세요.

adb shell am instrument -w \
> -e class com.android.demo.app.tests.TestClass1,com.android.demo.app.tests.TestClass2#testMethod3 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

AndroidJUnitRunner API 참조에서 더 많은 사용 사례를 확인할 수 있습니다.