명령줄에서 테스트

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

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

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

./gradlew mylibrary:connectedAndroidTest

빌드 변형에서 테스트 실행

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

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

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

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


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

계측 테스트의 다중 모듈 보고서

표 1에서 설명한 것과 같이 Gradle은 테스트하는 각 모듈의 build/ 디렉터리에 계측 테스트 결과를 저장합니다. 그러나 여러 모듈에서 테스트를 실행하면 모든 테스트 결과를 단일 보고서로 결합하는 것이 유용할 수도 있습니다. 여러 모듈에서 테스트를 실행할 때 단일 보고서를 생성하려면 다음 단계를 따르세요.

  1. 프로젝트 수준의 build.gradle 파일에서 buildscript{} 블록 뒤에 다음을 추가합니다.

    Groovy

    apply plugin 'android-reporting'
    

    Kotlin

    apply(plugin = "android-reporting")
    
  2. mergeAndroidReports 작업을 사용하여 test 또는 connectedAndroidTest 작업을 호출합니다. 예:

    ./gradlew connectedAndroidTest mergeAndroidReports
    

    Gradle이 남은 모든 테스트의 실행을 완료하도록 테스트 실패를 건너뛰려면 --continue 옵션을 추가합니다.

    ./gradlew connectedAndroidTest mergeAndroidReports --continue
    

Gradle이 모든 테스트 실행을 완료하면 path_to_your_project/build/ 디렉터리에 결합한 결과를 저장합니다.

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.foo/androidx.test.runner.AndroidJUnitRunner`
    

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

am instrument 플래그

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

표 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/android.support.test.runner.AndroidJUnitRunner

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

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

설명
package <Java_package_name> 테스트 애플리케이션의 패키지 중 하나의 정규화된 Java 패키지 이름입니다. 이 패키지 이름을 사용하는 테스트 사례 클래스는 모두 실행됩니다. 이것은 Android 패키지 이름이 아닙니다. 테스트 패키지에는 단일 Android 패키지 이름이 있지만 그 안에 여러 Java 패키지가 있을 수 있습니다.
class <class_name> 테스트 사례 클래스 중 하나의 정규화된 Java 클래스 이름입니다. 이 테스트 사례 클래스만 실행됩니다.
<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입니다.
  • 계측 테스트 클래스 두 가지는 다음과 같습니다.
    • bar1 테스트 메서드가 포함된 Foo1
    • bar2bar3 테스트 메서드가 포함된 Foo2
  • 테스트 실행기는 AndroidJUnitRunner입니다.

전체 테스트 패키지 실행

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

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

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

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

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

테스트 하위 집합 선택

Foo1 클래스에서 모든 테스트를 실행하고 Foo2에서 bar3 메서드를 실행하려면 다음을 입력하세요.

adb shell am instrument -w \
> -e class com.android.demo.app.tests.Foo1,com.android.demo.app.tests.Foo2#bar3 \
> com.android.demo.app.tests/android.support.test.runner.AndroidJUnitRunner

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