명령줄에서 테스트

이 문서에서는 명령줄에서 직접 테스트를 생성하고 실행하는 방법을 설명합니다. 개발자가 프로그래밍 환경에서 Android 애플리케이션을 생성하는 방법을 이미 알고 있다고 가정합니다.

테스트 실행

Gradle이나 Android 디버그 브리지(adb) 셸을 사용하여 명령줄에서 테스트를 실행할 수 있습니다.

Gradle용 Android 플러그인을 사용하면 명령줄을 통해 Gradle 프로젝트에서 단위 테스트를 실행할 수 있습니다. 앱의 단위 테스트를 빌드하는 방법에 관한 자세한 내용은 효과적인 단위 테스트 빌드하기를 참조하세요.

Gradle로 단위 테스트 실행

Gradle용 Android 플러그인을 사용하면 명령줄을 통해 Gradle 프로젝트에서 단위 테스트를 실행할 수 있습니다. 앱의 단위 테스트를 빌드하는 방법에 관한 자세한 내용은 효과적인 단위 테스트 빌드하기를 참조하세요.

아래 표에는 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

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

./gradlew mylibrary:connectedAndroidTest

다음 구문을 사용하여 특정 빌드 변형을 타겟팅할 수도 있습니다.

  • 로컬 단위 테스트의 경우
    ./gradlew testVariantNameUnitTest
    
  • 계측 단위 테스트의 경우
    ./gradlew connectedVariantNameAndroidTest
    

참고: 테스트할 타겟 모듈을 지정하지 않으면 Gradle은 모든 모듈을 살펴보고 지정한 구성 이름과 일치하는 각 변형에 테스트를 실행합니다.

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

./gradlew testVariantNameUnitTest --tests *.sampleTestMethod

다중 모듈 보고서

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

  1. 프로젝트 수준의 build.gradle 파일에서 파일의 다른 모든 구성을 완료한 후 다음을 추가합니다.

    Groovy

    apply plugin: 'android-reporting'
    

    Kotlin

    plugins {
        id("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 명령어를 실행합니다. 명령줄 플래그로 am 및 테스트를 제어합니다.

바로가기로 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)에 있는 manifest 요소의 package 속성값입니다. Android 테스트 실행기 클래스는 일반적으로 AndroidJUnitRunner입니다.

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

이 작업은 adb 셸을 시작한 다음 지정된 매개변수로 am instrument를 실행합니다. 이러한 특정 형식의 명령어는 테스트 패키지의 테스트를 모두 실행합니다. am instrument에 전달하는 플래그로 이 동작을 제어할 수 있습니다. 이러한 플래그는 다음 섹션에서 설명합니다.

am instrument 명령어 사용하기

am instrument 명령어의 일반적인 구문은 다음과 같습니다.

am instrument [flags] <test_package>/<runner_class>

am instrument의 기본 입력 매개변수는 다음 표에 설명되어 있습니다.

매개변수 설명
<test_package> 테스트 패키지의 Android 패키지 이름입니다. 테스트 패키지의 매니페스트 파일에 있는 manifest 요소의 package 속성값입니다.
<runner_class> 사용 중인 계측 테스트 실행기의 클래스 이름입니다. 일반적으로 AndroidJUnitRunner입니다.

am instrument의 플래그는 다음 표에 설명되어 있습니다.

플래그 설명
-w (없음) 자체적으로 종료하기 전에 계측이 종료될 때까지 am instrument를 강제로 대기시킵니다. 순 효과는 테스트가 완료될 때까지 셸을 계속 열어두는 것입니다. 이 플래그가 필수는 아니지만 사용하지 않으면 테스트 결과가 표시되지 않습니다.
-r (없음) 원시 형식으로 결과를 출력합니다. 성능 측정을 수집하려는 경우 이 플래그를 사용하여 그 측정이 테스트 결과로 형식화되지 않도록 합니다. 이 플래그는 플래그 -e perf true(계측 옵션 섹션에 설명되어 있음)와 함께 사용하도록 설계되었습니다.
-e <test_options> 테스트 옵션을 키-값 쌍으로 제공합니다. am instrument 도구는 onCreate() 메서드를 통해 이를 지정된 계측 클래스로 전달합니다. -e <test_options>의 여러 일치하는 항목을 지정할 수 있습니다. 키와 값은 계측 옵션 섹션에 설명되어 있습니다. 이러한 키-값 쌍은 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

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

설명
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는 패키지의 모든 테스트를 실행하고 class 키를 무시합니다.
  • 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

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

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

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

am instrument-e 플래그 값을 얻고 class 키워드를 감지하며 UnitTests 클래스의 모든 메서드를 실행합니다.

테스트의 하위 집합 선택

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