지역 단위 테스트 만들기

의존성이 없는 테스트를 만들거나, 간단한 의존성만을 갖는 테스트를 만든다면, 로컬의 개발 머신에서 테스트를 실행하는 것이 좋습니다. 이러한 접근법은 효율적입니다. 오버헤드를 방지하고 불피요하게 앱을 로딩하거나, 물리적인 기기 또는 에뮬레이터에 매번 테스트를 할 때마다 앱을 로딩하지 않기 때문입니다. 결과적으로 테스트에 사용되는 시간이 매우 줄어 들게 됩니다. 이 접근 법은 일반적으로 의존성 관계를 보완하기 위해 모히토같은(Mokito) 목킹 프레임 워크를 사용합니다.

테스트 환경 설정하기

안드로이드 스튜디오 프로젝트에서 테스트를 위한 소스 파일은 module-name/src/test/java에 저장해야합니다. 이 디렉토리는 언제나 새 프로젝트를 생성할 때 미리 만들어집니다.

또한 Junit4 프레임워크에서 제공되는 표준 API를 사용하기 위해서 테스팅 의존성 설정을 해줘야합니다. 테스트가 안도르이드에 의존성을 가ㅣ조고 있다면 모히토 라이브러리를 포함해 지역 단위 테스트를 간소화하십시오. 목 객체를 사용하는 방법을 더 알고 싶다면, 안드로이드 의존성 목킹하기 (Mocking Android dependencies)를 참조해 주십시오.

최상위 build.gradel파일에 아래의 라이브러리를 의존성으로 추가해주십시오.:

dependencies{
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.10.19'
}

지역 단위 테스트 클래스 만들기

지역 단위 테스트 클래스는 반드시 JUnit4 테스트 클래스로 작성해야합니다. JUnit은 가장 유명하고 널리쓰이는 자바의 단위 테스트 프레임워크입니다.가장 최신 버전은 JUnit 4이며 테스트를 기존 버전보다 더 깔끔하고 유연한 방식으로 작성할 수 있게 해줍니다. JUnit3를 사용했던 안드로이드의 기존 접근법과 다르게, JUnit 4에서는 junit.framework.TestcCase를 테스트 클래스가 상속하지 않아도 됩니다. 오로지 선생사로 'test'키워드를 메소드 이름 앞에 붙이면 됩니다. 이 키워드 외에도 junit.framewor또는 junit.extensions의 어떤 클래스라도 사용하면 됩니다.

기본적인 JUnit4 테스트 클래스를 만들기 위해서 자바클래스를 만드시고 한 개 이상의 테스트 메소드를 넣으십시오. 테스트 메소드는 @Test 어노테이션으로 시작하며 테스트 하려는 구성요소의 단일 기능성을 평가하는 과정의 코드가 들어갑니다.

아래의 예제는 지역 단위 테스트 클래스를 적용하는 방법입니다. 테스트 메소드 emailValidator_CorrectEmailSimple_ReturnsTrue는 앱 내 적절한 결과를 반환하는 테스트로 isValidEmail()메소드를 확인합니다.

import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class EmailBalidatorTest{

    @Test
    public void emailValidator_CorrectEmailSimple_ReturnsTrue(){
        assertThan(EmailValidator.isValidEmail("[email protected]"),is(true));
    }
    ...
}

반환할 결과값이 예상되는 구성요소는 junit.Assert메소드를 사용해 예상되는 결과값과 실제 구성요소의 상태를 평가하는 판정을 실행할 수 있습니다.

테스트의 가독성을 높이기 위해서 Hamcrest mathcers를 사용해 반환된 결과값을 예상되는 결과값과 비교 할 수 있습니다.(예를 들면 is(), equalTo())

안드로이드 의존성 모킹하기

기본적으로 안드로이드 그래이들 플러그인은 (Android Plug-in for Gradle)수정된 android.jar 라이브러리 버전에 따라

단위 테스트를 실행합니다. 이것은 실제 아무 코드도 가지고 있지 않습니다. 대신에 안드로이드 클래스를 호출한 메소드는 예외를 발생시킵니다. 이것으로 당신은 어떠한 안드로이드 플랫폼의 특정 기능에 의존하지 않고 오로지 당신만의 코드를 테스트 하고 있음을 확신할 수 있습니다. (명시적으로 목킹을 하지 않았을 때입니다)

목킹 프레임워크를 이용해서 당신의 코드의 의존성에 대한 스텁(stub)을 만들 수 있습니다. 이것으로 어떤 예상되는 의존성을 가지고 상호작용하는 구성요소를 쉽게 테스트 할 수 있습니다. 목 객체로 의존성을 대체함으로써, 해당 의존성에 포함된 메소드가 적절히 호출되는지 판단할 때, 당신의 단위 테스트를 안드로이드 시스템으로 분리 할 수 있습니다. 자바를 위한 모히토 목킹 프레임워크는(버전 1.9.5 그리고 그 이상)은 안드로이드 단위테스트와 함께 사용할 수 있습니다. 모히토로 당신의 목 객체를 구성하고 특정 값을 호출에따라 반환할 수 있습니다.

목 객체를 지역 단위 테스트에 추가하기 위해선 아래의 과정을 따라 하십시오.

  1. 모히토 라이브러리 의존성을 build.gradle 파일에 추가하십시오. 그리고 테스트 환경설정을 하십시오. (위의 테스트 환경 설정하기)
  2. 테스트 클래스 선언부 앞에 @RunWit(MockitoJunitRunner.class) 어노테이션을 추가하십시오. 이 어노테이션은 모히토 테스트 러너에게 프래임워크의 사용의 적절성을 판단하게 하고 목 객체의 초기화를 간소화하게 합니다.
  3. 안드로이드 의존성에 대한 목 객체를 생성하기 위해서 @Mock 어노테이션을 필드 선언 앞에 붙이십시오
  4. 의존성에 적절한 스텁을 만들기 위해서 조건과 when()과 thenReturn()메소드를 사용해 특정 조건에 부합할 때 특정 값을 반환하도록 합니다.

아래의 예제는 단위 테스트에 사용할 목 Context 객체를 만드는 과정입니다.

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import android.content.SharedPreferences;

@Runwith(MockitoJUnitRunner.class)
public class UnitTestSample{

    private static final String FAKE_STRING="HELLO WORLD";
    @Mock
    Context mMockContext;
    @Test
    public void readStringFromContext_LocalizedString(){
        //테스트 상황에 반응하게 될 목 Context입니다. 
        when(mMockContext.getString(R.string.hello_world).thenReturn(FAKE_STRING);
        //... 테스트에서 문자열을 반환한다면...
        String result = myObjectUnderTest.getHelloWorldString();
        //... 해당 결과는 예상되는 어떤 것일 겁니다. 
        asssertThat(result, is(FKAE_STRING));
    }

}

모히토 프레임워크 사용법을 더 알고 싶다면 모히토 API문서를 보십시오.그리고 예제 코드의 SharedPreferencesHelperTest 클래스를 참조하십시오.

에러: "Method...not mocked"

만약 목을 만들지 않은 Android Sdk 요소로 부터 API를 호출하면, 해당 메소드에 목이 만들어 지지 않았다는(this method is not mocked)메세지를 받게 될겁니다. 이는 android.jar 파일이 어떤 실제 코드도 가지고 있지 않기 때무입니다.

단위 테스트를 실행합니다. 이것은 실제 아무 코드도 가지고 있지 않습니다. 대신에 안드로이드 클래스를 호출한 메소드는 예외를 발생시킵니다. 이것으로 당신은 어떠한 안드로이드 플랫폼의 특정 기능에 의존하지 않고 오로지 당신만의 코드를 테스트 하고 있음을 확신할 수 있습니다. (명시적으로 목킹을 하지 않았을 때입니다)

만약에 발생한 예외들이 테스트에 문제가 되는 것들이라면, 메소드들이 예외대신에 null이나 0값을 반환하도록 최상위 build.gradle에 환경설정할 수 있습니다.

android{
...
testOptions{
unitTests.returnDefaultValues = true}
}

위의 환경설정을 하는 것에 주의하십시오. 이를 통해서 디버깅을 어렵게 하거나 실패해야하는 테스트를 통과시킬 수 있습니다.

지역 단위 테스트 실행하기

지역 단위 테스트를 실행하기 위해서 다음 과정을 수행하십시오.

  1. 툴바에서 Sync Project를 클릭해 프로젝트가 그래들 동괴화 하도록 하십시오.
  2. 다음의 과정으로 테스트를 수행하십시오.
    1. 하나의 테스트를 실행하는 것은, 프로젝트 윈도우를 열고(Project )우 클릭 후에 Run을 누르면 됩니다.
    2. 클래스의 모든 메소드를 테스트 하는 것은 클래나 메소드를 우클릭해 Run을 누르면 됩니다.
    3. 디렉토리 내 모든 테스트를 수행하려면, 디렉토리를 우클릭해 Run을 누르면 됩니다.

안드로이드 그래들 플러그인은 지역 단위 테스트 코드를 기본 디렉토리 (src/test/java)에 컴파일하고 테스트 앱을 빌드 합니다. 그리고 기본 테스트 러너 클래스로 테스트를 수행합니다. 그후 안드로이드 스튜디오는 결과값을 Run 윈도우에 표시합니다.

results matching ""

    No results matching ""