테스트 지원 라이브러리

Android 테스트 지원 라이브러리는 Android 앱을 테스트하기 위한 광범위한 프레임워크를 제공합니다. 이 라이브러리는 JUnit 4 및 기능적 사용자 인터페이스(UI) 테스트를 포함하여, 앱을 위한 테스트 코드를 빠르게 빌드하고 실행할 수 있게 해주는 API 세트를 제공합니다. Android Studio IDE나 명령줄에서 이런 API를 사용하여 생성한 테스트를 실행할 수 있습니다.

Android 테스트 지원 라이브러리는 Android SDK Manager를 통해 사용할 수 있습니다. 자세한 내용은 테스트 지원 라이브러리 설정을 참조하세요.

이 페이지에는 Android 테스트 지원 라이브러리에 제공되는 도구에 대한 정보, 테스트 환경에서 이런 도구를 사용하는 방법, 라이브러리 릴리스 정보가 나와 있습니다.

테스트 지원 라이브러리의 특징

Android 테스트 지원 라이브러리에는 다음과 같은 테스트 자동화 도구가 포함되어 있습니다.

  • AndroidJUnitRunner: Android용 JUnit 4 호환 테스트 실행기
  • Espresso: 앱 내부에서 기능적 UI 테스트를 실행하기에 적합한 UI 테스트 프레임워크
  • UI Automator: 시스템과 설치되어 있는 앱 전반에 걸쳐 앱 간의 기능적 UI 테스트를 실행하기에 적합한 UI 테스트 프레임워크

AndroidJUnitRunner

AndroidJUnitRunner 클래스는 EspressoUI Automator 테스트 프레임워크를 사용하는 것을 포함하여, Android 기기에서 JUnit 3 또는 JUnit 4 스타일의 테스트 클래스를 실행할 수 있게 해주는 JUnit 테스트 실행기입니다. 이 테스트 실행기는 테스트 패키지와 테스트 대상 앱을 기기에 로드하여 테스트를 실행하고 테스트 결과를 보고하는 역할을 합니다. 이 클래스는 JUnit 3 테스트만 지원하는 InstrumentationTestRunner 클래스를 대체합니다.

이 테스트 실행기의 주요 기능으로는 다음과 같은 것이 있습니다.

Android 2.2(API 레벨 8) 이상이 필요합니다.

JUnit 지원

이 테스트 실행기는 JUnit 3 및 JUnit 4(JUnit 4.10까지) 테스트와 호환됩니다. 하지만 같은 패키지에 JUnit 3 테스트 코드와 JUnit 4 테스트 코드를 섞으면 예기치 않은 결과가 발생할 수 있으므로 섞지 않도록 해야 합니다. 기기나 에뮬레이터에서 실행하기 위해 계측된 JUnit 4 테스트 클래스를 생성할 경우 테스트 클래스 앞에 @RunWith(AndroidJUnit4.class) 주석을 붙여야 합니다.

다음 코드 조각을 통해 CalculatorActivity 클래스에서 add 작업의 올바른 작동에 대한 유효성 검사를 위해 계측된 JUnit 4 테스트를 작성하는 방법을 알 수 있습니다.

import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2;

@RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
        extends ActivityInstrumentationTestCase2<CalculatorActivity> {

    @Before
    public void setUp() throws Exception {
        super.setUp();

        // Injecting the Instrumentation instance is required
        // for your test to run with AndroidJUnitRunner.
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }

    @Test
    public void typeOperandsAndPerformAddOperation() {
        // Call the CalculatorActivity add() method and pass in some operand values, then
        // check that the expected value is returned.
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }
}

계측 정보에 대한 액세스

InstrumentationRegistry 클래스를 사용하여 테스트 실행과 관련된 정보에 액세스할 수 있습니다. 이 클래스에는 테스트로 전달되는 Instrumentation 객체, 대상 앱 Context 객체, 테스트 앱 Context 객체, 명령줄 인수가 포함됩니다. 이 데이터는 UI Automator 프레임워크를 사용하여 테스트를 작성할 때나 Instrumentation 또는 Context 객체에 대한 종속성이 있는 테스트를 작성할 때 유용합니다.

테스트 필터링

JUnit 4.x 테스트에서는 주석을 사용하여 테스트 실행을 구성할 수 있습니다. 이 기능 덕분에 테스트에서 상용구 코드와 조건 코드를 추가할 필요성이 최소화됩니다. JUnit 4에서 지원되는 표준 주석 외에도, 테스트 실행기는 다음을 포함한 Android 고유의 주석도 지원합니다.

  • @RequiresDevice: 에뮬레이터가 아니라, 실제 기기에서만 테스트를 실행해야 한다고 지정합니다.
  • @SdkSupress: 지정된 레벨보다 낮은 Android API 레벨에서는 테스트가 실행되지 않도록 억제합니다. 예를 들어, 18보다 낮은 모든 API 레벨에서 테스트 실행을 억제하려면 주석 @SDKSupress(minSdkVersion=18)을 사용하세요.
  • @SmallTest, @MediumTest, @LargeTest: 테스트를 얼마나 오래 실행해야 할지, 따라서 얼마나 자주 실행할 수 있을지 분류합니다.

테스트 분할

테스트 실행기는 단일 테스트 세트를 여러 부분으로 분할하는 기능을 지원하므로, 같은 Instrumentation 인스턴스에서 같은 분할 부분에 속하는 테스트를 그룹으로 묶어 손쉽게 실행할 수 있습니다. 각각의 분할 부분은 인덱스 번호로 식별됩니다. 테스트를 실행할 때, 별도로 만들 분할 부분의 개수를 지정하려면 -e numShards 옵션을 사용하고, 실행할 분할 부분을 지정하려면 -e shardIndex 옵션을 사용하세요.

예를 들어, 테스트 세트를 10개의 분할 부분으로 분할하고 두 번째 분할 부분에 그룹화된 테스트만 실행하려면 다음 명령을 사용하세요.

adb shell am instrument -w -e numShards 10 -e shardIndex 2

이 테스트 실행기의 자세한 사용 방법은 API 참조를 확인해 보세요.

Espresso

Espresso 테스트 프레임워크는 앱 내부의 사용자 흐름을 테스트하는 UI 테스트를 빌드하기 위한 API 세트를 제공합니다. 이런 API를 사용하면 간결하고 안정적으로 실행되는 자동화된 UI 테스트를 작성할 수 있습니다. Espresso는 화이트 박스 스타일의 자동화된 테스트 작성에 매우 적합한데, 여기서 테스트 코드는 테스트 대상 앱의 구현 코드 세부정보를 활용합니다.

Espresso 테스트 프레임워크의 주요 특징은 다음과 같습니다.

  • 대상 앱에서 뷰 및 어댑터 일치를 위한 유연한 API. 자세한 내용은 뷰 일치를 참조하세요.
  • UI 상호작용 자동화를 위한 광범위한 액션 API 세트. 자세한 정보는 액션 API를 참조하세요.
  • 테스트 신뢰성을 높이기 위한 UI 스레드 동기화. 자세한 내용은 UI 스레드 동기화를 참조하세요.

Android 2.2(API 레벨 8) 이상이 필요합니다.

뷰 일치

Espresso.onView() 메서드를 사용하면 대상 앱에 있는 UI 구성 요소에 액세스하여 상호작용할 수 있습니다. 이 메서드는 Matcher 인수를 받고 뷰 계층 구조를 검색하여 주어진 기준을 충족하는 해당 View 인스턴스를 찾습니다. 다음과 같은 기준을 지정하여 상세 검색할 수 있습니다.

  • 뷰의 클래스 이름
  • 뷰의 콘텐츠 설명
  • 뷰의 R.id
  • 뷰에 표시되는 텍스트

예를 들어, my_button의 ID 값을 가진 버튼을 대상으로 하려면 다음과 같은 매처(matcher)를 지정할 수 있습니다.

onView(withId(R.id.my_button));

검색에 성공하면, onView() 메서드가 참조를 반환하고 이 참조를 통해 대상 뷰에 대한 사용자 액션과 테스트 어설션을 수행할 수 있습니다.

어댑터 일치

AdapterView 레이아웃에서는 런타임에 레이아웃이 하위 뷰로 동적으로 채워집니다. 대상 뷰가 AdapterView에서 서브클래스로 생성된 레이아웃(예: ListView 또는 GridView) 내에 있을 경우, 레이아웃 뷰 중 일부만 현재 뷰 계층 구조에서 로드될 수 있기 때문에 onView() 메서드가 작동하지 않을 수도 있습니다.

그 대신, Espresso.onData() 메서드를 사용하여 대상 뷰 요소에 액세스하세요. Espresso.onData() 메서드가 참조를 반환하고 이 참조를 통해 AdapterView의 요소에 대한 사용자 액션과 테스트 어설션을 수행할 수 있습니다.

액션 API

일반적으로는 앱의 사용자 인터페이스에 대해 사용자 상호작용을 수행하는 방법으로 앱을 테스트합니다. ViewActions API를 사용하면 테스트에서 이런 액션을 손쉽게 자동화할 수 있습니다. 다음과 같은 UI 상호작용을 수행할 수 있습니다.

  • 뷰 클릭
  • 스와이프
  • 키와 버튼 누르기
  • 텍스트 입력
  • 링크 열기

예를 들어, 문자열 값 입력과 버튼 누르기를 시뮬레이션하여 값을 제출하려면 다음과 같이 자동화된 테스트 스크립트를 작성하면 됩니다. ViewInteraction.perform()DataInteraction.perform() 메서드는 한 개 이상의 ViewAction 인수를 취해 제시되는 순서대로 액션을 실행합니다.

// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
    .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());

// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());

UI 스레드 동기화

타이밍 문제 때문에 Android 기기에 대한 테스트가 무작위적으로 실패할 수 있습니다. 이런 테스트 문제를 테스트 취약성이라고 합니다. Espresso 이전에는 테스트에 충분히 긴 절전 모드 또는 제한 시간을 삽입하거나 실패하는 작업을 계속 재시도하기 위한 코드를 추가하여 이 문제를 해결했습니다. 하지만 Espresso 테스트 프레임워크는 Instrumentation과 UI 스레드 간의 동기화를 처리하므로, 이전의 타이밍 해결 방법을 쓸 필요가 없고 테스트 작업과 어설션이 더욱 안정적으로 실행되도록 합니다.

Espresso의 자세한 사용 방법은 API 참조단일 앱의 UI 테스트 교육 자료를 참조하세요.

UI Automator

UI Automator 테스트 프레임워크는 사용자 앱과 시스템 앱에 대한 상호작용을 수행하는 UI 테스트를 빌드하기 위한 API 세트를 제공합니다. UI Automator API를 사용하면 테스트 기기에서 Settings 메뉴 또는 앱 런처 열기와 같은 작업을 수행할 수 있습니다. UI Automator 테스트 프레임워크는 블랙 박스 스타일의 자동화된 테스트를 작성하기에 매우 적합하며, 여기서는 테스트 코드가 대상 앱의 내부적 구현 세부정보에 의존하지 않습니다.

UI Automator 테스트 프레임워크의 주요 특징은 다음과 같습니다.

  • 레이아웃 계층 구조를 검사하기 위한 뷰어. 자세한 내용은 UI Automator 뷰어를 참조하세요.
  • 대상 기기에서 상태 정보를 검색하고 작업을 수행하기 위한 API. 자세한 내용은 기기 상태 액세스를 참조하세요.
  • 앱 간의 UI 테스트를 지원하는 API. 자세한 내용은 UI Automator API를 참조하세요.

Android 4.3(API 레벨 18) 이상이 필요합니다.

UI Automator 뷰어

uiautomatorviewer 도구는 Android 기기에 현재 표시되는 UI 구성 요소를 검사하고 분석하기에 편리한 GUI를 제공합니다. 이 도구를 사용하여 레이아웃 계층 구조를 검사하고 기기의 전경 화면에 표시되는 UI 구성 요소의 속성을 볼 수 있습니다. UI Automator를 사용하면 이 정보를 바탕으로 더욱 세분화된 테스트를 만들 수 있는데, 예컨대 표시되는 특정 속성과 일치하는 UI 선택기를 만드는 방법이 있습니다.

uiautomatorviewer 도구는 <android-sdk>/tools/ 디렉터리에 있습니다.

기기 상태 액세스

UI Automator 테스트 프레임워크는 대상 앱이 실행 중인 기기에 액세스하여 작업을 수행하기 위한 UiDevice 클래스를 제공합니다. 현재 방향 또는 표시 크기와 같은 기기 속성에 액세스하는 메서드를 호출할 수 있습니다. UiDevice 클래스로 다음과 같은 작업을 수행할 수도 있습니다.

  • 기기 회전 변경
  • D 패드 버튼 누르기
  • 뒤로 버튼, Home 버튼 또는 Menu 버튼 누르기
  • 알림 창 열기
  • 현재 창의 스크린샷 생성

예를 들어, Home 버튼 누르기를 시뮬레이션하려면 UiDevice.pressHome() 메서드를 호출합니다.

UI Automator API

UI Automator API를 사용하면 대상으로 삼는 앱의 구현 세부정보를 몰라도 훌륭한 테스트를 작성할 수 있습니다. 다음과 같은 API를 사용하여 여러 앱에 걸쳐 UI 구성 요소를 캡처하고 조작할 수 있습니다.

  • UiCollection: 표시되는 텍스트 또는 콘텐츠 설명 속성별로 하위 요소를 카운트하거나 표적화할 목적으로 컨테이너의 UI 요소를 열거합니다.
  • UiObject: 기기에서 눈에 보이는 UI 요소를 표시합니다.
  • UiScrollable: 스크롤 가능한 UI 컨테이너에 있는 항목을 검색하기 위한 지원 기능을 제공합니다.
  • UiSelector: 기기에 있는 하나 이상의 대상 UI 요소에 대한 쿼리를 나타냅니다.
  • Configurator: UI Automator 테스트를 실행하기 위한 주요 매개변수를 설정할 수 있도록 합니다.

예를 들어, 다음 코드는 기기의 기본 앱 런처를 불러오는 테스트 스크립트의 작성 방법을 보여 줍니다.

// Initialize UiDevice instance
mDevice = UiDevice.getInstance(getInstrumentation());

// Perform a short press on the HOME button
mDevice.pressHome();

// Bring up the default launcher by searching for
// a UI component that matches the content-description for the launcher button
UiObject allAppsButton = mDevice
        .findObject(new UiSelector().description("Apps"));

// Perform a click on the button to bring up the launcher
allAppsButton.clickAndWaitForNewWindow();

UI Automator의 자세한 사용 방법은 API 참조여러 앱의 UI 테스트 교육 자료를 참조하세요.

테스트 지원 라이브러리 설정

Android 테스트 지원 라이브러리 패키지에는 Android Support Repository의 최신 버전이 함께 포함되어 있는데, 이 버전은 Android SDK Manager를 통해 따로 다운로드할 수 있습니다.

SDK Manager를 통해 Android Support Repository를 다운로드하려면:

  1. Android SDK Manager를 시작합니다.
  2. SDK Manager 창에서 Packages 목록의 끝으로 스크롤하고 Extras 폴더를 찾고, 필요한 경우 확장하여 내용물을 봅니다.
  3. Android Support Repository 항목을 선택합니다.
  4. Install packages... 버튼을 클릭합니다.

다운로드한 후에 해당 도구가 Support Repository 파일을 기존 Android SDK 디렉터리에 설치합니다. 라이브러리 파일은 SDK의 하위 디렉터리(<sdk>/extras/android/m2repository 디렉터리)에 있습니다.

Android Testing Support Library 클래스는 android.support.test 패키지 아래에 있습니다.

Gradle 프로젝트에서 Android 테스트 지원 라이브러리를 사용하려면 build.gradle 파일에 다음과 같은 종속성을 추가합니다.

dependencies {
  androidTestCompile 'com.android.support.test:runner:0.4'
  // Set this dependency to use JUnit 4 rules
  androidTestCompile 'com.android.support.test:rules:0.4'
  // Set this dependency to build and run Espresso tests
  androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
  // Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

Gradle 프로젝트에서 AndroidJUnitRunner를 기본 테스트 계측 실행기로 설정하려면 build.gradle 파일에 다음 종속성을 지정합니다.

android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

Android 테스트 지원 라이브러리는 꼭 Android Studio IDE와 함께 사용하도록 권장합니다. Android Studio에는 다음과 같은 테스트 개발을 지원하는 기능이 있습니다.

  • 테스트 코드를 위한 종속성 관리를 지원하는 유연한 Gradle 기반 빌드 시스템
  • 단위 및 계측 테스트 코드를 앱 소스 코드와 함께 포함하기 위한 단일 프로젝트 구조
  • 명령줄이나 그래픽 사용자 인터페이스에서 가상 기기나 실제 기기에서 테스트를 배포하고 실행하기 위한 지원

Android Studio에 대한 자세한 내용과 이를 다운로드하는 방법은 Android Studio 및 SDK 도구 다운로드를 참조하세요.