테스트 시작하기

안드로이드 테스트는 Junit에 기반해 만들어졌습니다. 지역 단위테스트를 JVM으로 할 수도 있고 안드로이드 기기에서 진행할 수도 있습니다. 이번 페이지는 안드로이드 테스트를 만들기 위한 도구와 기본 개념을 다룹니다.

테스트의 종류

안드로이드 스튜디오를 사용해 자신만의 테스트를 만들 때, 반드시 두 개의 코드 디렉토리들 중 하나에 그 테스트가 들어가야합니다. 각각의 모듈에 대해 안드로이드 스튜디오는 각각의 테스트 종류에 따라 적절한 소스셋을 포함합니다.

지역 단위 테스트

module-name(패키지)/src/test/java/에 위치합니다.

여기에 소속된 테스트들은 JVM에서 실행되며 안드로이드 프레임워크 API에 접근 하지 않습니다.

시작하기 위해선 여기를 참조해 주십시오. (지역 단위테스트 만들기, Building local Unit Test)

계측 테스트 (Instrumented Test)

module-name(패키지)/src/androidTest/java에 위치합니다

안드로이드 기기 또는 에뮬레이터에서 실행되어야 하는 테스트들이 들어갑니다

계기 테스트는 APK에 빌드되어서 기기에서 앱과 함께 실행되는 테스트입니다. 동일한 프로세스에서 test APK와 앱을 모두 실행합니다 그렇기에 앱의 메소드를 호출하거나, 필드값을 수정할 수 있습니다. 그리고 UI테스트를 자동화 할 수도 있습니다.

각각의 계측 테스트를 만드는 방법은 아래의 문서들을 참조해 주십시오.

계측 단위 테스트 만들기 (Building Instrumented Unit Tests): 목 객체로는 충족될 수 없는 복잡한 단위테스트를 만듭니다.

UI 테스트 자동화하기 (Automating User Interface): 사용자와 상호작용하는 UI가 정상동작하는지 확인합니다. 하나의 앱 또는 여러 앱에 걸쳐서 진행될 수 있습니다.

앱 구성요소 테스트하기(Testing App Component Integrations): 사용자가 직접적으로 상호작용하지 않는 구성요소들이 정상 동작하는지 확인합니다. 예를들면 서비스컨텐츠 프로바이더가 그 대상이됩니다.

테스트들을 지역 단위 테스트와 계측 테스트로 구분을 했지만, 이 것은 단순히 JVM에소 동작하는 테스트와 안드로이드 플랫폼(기기 또는 에뮬레이터)에서 동작하는 테스트를 구분하기 위한 것입니다. 완전한 테스트를 만들때 이해하고 가야하는 테스트의 종류 구분은 아래 테이블과 같습니다.

종류 하위 타입 설명
단위 테스트 지역 단위 테스트 지역 JVM에서 실행하는 단위테스트입니다. 이 테스트를 사용해 안드로이드 프레임워크에 의존성이 없거나, 목을 사용할 수 있는 대상에 대해 최소한의 실행시간으로 테스트를 진행할 수 있습니다.
계측 테스트 안드로이드 기기 또는 에뮬레이터에서 실행하는 단위 테스트입니다. 이 테스트는 Context와 같은 테스트 하는 앱의 계측 정보(Instrumentation Information)에 접속합니다. 이 테스트를 통해 목을 사용할 수 없는 안드로이드 의존성을 갖는 대상에 테스트를 진행할 수 있습니다.
통합 테스트 제한적 앱 구성요소 이 테스트는 사용자의 특정 행동, 입력에 적절한 동작을 하는지 확인합니다. 예를들어, 앱이 적절한 UI 반응으로 사용자와 상호작용하는지 확인합니다. Espresso 와 같은 UI 테스트 프레임워크는 사용자의 동작과 복잡한 앱 내부 사용자 상호작용을 프로그래밍적으로 시뮬레이팅 할 수 있는 환경을 제공합니다.
범역 앱 구성요소 이 테스트는 다른 사용자의 앱 또는 시스템 앱과 적절히 상호작용하는지 확인합니다. 예를 들어 안드로이드 환경설정에 앱이 적절하게 반응하는지 확인 할 수 있습니다. UI Animator 와 같은 UI테스트 프레임워크가 범역적인 앱 상호작용을 테스트 시나리오를 만들 수 있도록 해줍니다.

테스트 API

안드로이드에서 앱을 테스트할 때 보편적으로 사용되는 API입니다.

Junit

단위 또는 통합 테스트는 JUnit 4의 test Class로 작성되어야 합니다. 이 프레임 워크는 테스트의 구성, 분해, 어설트 작업(assert operation)을 할 수 있는 편리한 방법을 제공합니다.

기본적인 Junit 4 test Class는 하나 이상의 테스트 메소드를 가지고 있는 자바 클래스입니다. 하나의 테스트 메소드는 @Test라는 어노테이션으로 시작됩니다. 그리고 메소드는 실행할 코드를 가지고 있으며, 테스트하고 싶은 구성요소의 기능 하나를(논리 단위) 테스트합니다.

아래의 코드 예제는 Espresso API를 사용한 Junit 4 예제로, UI 요소 클릭에 예상되는 문자열의 표시여부를 확인하는 통합테스트입니다.

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {

    @Rule
    public ActivityTestRule mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    @Test
    public void sayHello(){
        onView(withText("Say hello!")).perform(click());

        onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));
    }
}

Junit 4 testClass 에서 아래의 어노테이션을 이용해 특정 동작들을 호출, 배정할 수 있습니다.

@Before: 이 어노테이션을 통해 초기화 과정에 해당하는 코드 블럭을 특정할 수 있습니다. 테스트 클래스는 매 테스트를 수행하기 이전에 이 코드 블럭을 호출합니다. 여러개의 @Before 메소드를 만들 수 있지만 그 순서는 확신하 수 없습니다.

@After: 이 어노테이션은 마무리 과정에 해당하는 코드 블럭을 특정할 수 있습니다. 매 테스트 메소드의 끝에 이 메소드를 호출합니다. 여러개의 @After를 정의 할 수 있습니다. 메모리로부터 자원을 회수하기 위해 사용할 수 있습니다.

@Test:테스트 메소드를 특정합니다. 하나의 테스트 클래스는 여러 테스트 메소드를 가질 수 있습니다. 각각의 메소드들은 모드 이 어노테이션을 갖습니다.

@Rule: 이 어노테이션은 재사용을 위해 각각의 테스트 메소드에 동작을 추가하거나, 수정할 수 있도록 해줍니다. 안드로이드 테스트에 있어서, 이 어노테이션은 안드로이드 테스트 서포트 라이브러리가 제공하는 ActivityTestRule ,ServiceTestRule 를 테스트에 함께 사용할 수 있게 해줍니다.

@BeforeClass: 테스트 클래스에서 오로지 한 번만 호출되는 스테틱 메소드를 특정합니다. 이 테스팅 과정은 자원의 소모가 많은 과정을 처리하기에 좋습니다.

@AfteClass: 테스트 클래스에서 오로지 한 번 모든 테스트 뒤에 호출되는 메소드를 특정합니다. @BeforeClass에서 할당된 자원을 반환하기에 적절한 메소드입니다.

@Test(timeout=): 몇 어노테이션에는 요소 값을 전달 할 수 있습니다. 예를 들어 테스트에 시관초과 기준을 특정할 수 있습니다. 만약 주어진 시간 내에 테스트가 완료되지 않으면, 자동으로 실패로 간주합니다. 이를 위해서는 반드시 밀리세컨드 단위의 시간 초과 기준을 정해줘야합니다. 예를들어 @Test(timeout= 5000)처럼 작성합니다.

더 많은 어노테이션들은 Junit annotationsAndroid annotations 문서를 확인해 주십시오.

다음으로, Junit의 Assert 클래스로 객체 상태가 정확한지 확인 할 수 있습니다. 어설트 메소드는 기대 값과 실제 결과값을 비교하고 비교 실패시 오류를 만듭니다. 어설트 클래스들(Assert Classes)은 이러한 메소드들에 대한 더 자세한 사항을 다룹니다.

안드로이드 테스트 서포트 라이브러리

안드로이드 테스트 서포트 라이브러리는 Junit4와 기능적 UI Test를 포함해, 빠르게 테스트 코드를 작성하고 실행 할 수 있게 하는 여러 API를 제공합니다. 이 라이브러리는 테스트를 자동화 하고 싶을 때 유용한 아래의 Instrument 기반 API를 포함하고 있습니다.

AndroidJUnitRunner

Junit4와 함께 사용 가능한 안드로이드 테스트 러너입니다.

Espress

UI 테스트 프레임워크입니다. UI 기능 테스트에 적합합니다.

UI Automator

범역 앱 UI 기능 테스트에 적합한 프레임워크입니다. 시스템 앱 또는 이미 설치된 앱과 함께 테스트 할 수 있습니다.

어설트 클래스

안드로이드 테스트 서포트 라이브러리 API가 JUnit을 확장한 것이기에, 어설트 메소드를 사용해 테스트 결과를 표시할 수 있습니다. 어설트 메소드는 실제 값과 예상되는 값을 비교하고 그 비교가 실패르 하면 AssertionException을 만듭니다. 어설트를 이용해서 더 편하게 로그를 남길 수 있고 더 나은 테스트 성능을 얻을 수 있습니다.

테스트 개발을 더 간단히 하기 위해 Hamcrest Library를 사용하길 권합니다. 이 라이브러리를 통해 더 유연한 테스트를 구성할 수 있습니다.

몽키와 몽키 러너

안드로이드 SDK는 기능 레벨의 앱 테스트를 위해 두 개의 도구를 제공합니다.

몽키

이 커맨드라인 툴은 임의의 키입력, 터치, 제스처에 해당하는 수도 스트림을 기기에 보냅니다. 안드로이드 디버그 브릿지(adb)를 통해 실행하며 이를 이용해 앱을 압박 테스트 할 수 있고 발생하는 모든 종류의 애러를 보고할 수 있습니다. 동일한 난수 시드로 여러번의 이벤트 흐름을 반복 할 수 있습니다.

몽키 러너

이 툴은 파이썬으로 작성된 테스트 프로그램입니다. 이 API는 기기 연결, 패키지 설치와 삭제, 스크린 샷 찍기, 이미지 비교, 그리고 앱 간의 테스트를 진행 할 수 있습니다. 이 API를 사용해 거대하고 폭 넓은 강력하고 복잡한 테스트를 만들 수 잇습니다. monkeyrunner라는 커멘드 라인 툴로 해당 API를 실행할 수 있습니다.

안드로이드 테스트 제작 가이드

아래의 문서들은 다양한 종류의 테스트를 작성하고 실행하는 방법을 다루고 있습니다.

지역 단위 테스트 만들기

어떠한 의존성도 갖고 있지 않거나, 목화 할 수 있는 의존성만을 가지고 있는 대상을 테스트할 때 씁니다.JVM에서 동작합니다.

계측 단위 테스트 만들기

안드로이드 의존성을 갖고 목화 할 수 없는 객체를 테스트 할 때 사용합니다. 기기 또는 에뮬레이터를 사용합니다.

UI테스트 자동화 하기

사용자 인터페이스가 사용자의 입력에 적절하게 동작하는지 확인합니다. 해당 앱만을 사용하거나 다른 앱과의 상호작용을 테스트 할 수 있습니다.

앱 구성요소 테스트

사용자가 직접 상호작용하지 않는 구성요소의 동작을 확인합니다. 서비스나 컨텐츠 프로바이더가 이에 해당합니다.

UI 성능을 측정하는 테스트를 작성합니다. 이를 통해 연속적인 부드러운 사용자 경험을 확인 할 수 있습니다.

results matching ""

    No results matching ""