본문 바로가기

Testing

안드로이드 스튜디오에서 단위 테스트 작성 및 실행하기

이번 포스트는 아직까지는 한 번도 다루지 못했던 (사실..저도 제대로 활용을 못 하고 있었던..ㅠㅠ) 단위 테스트(Unit test)와 관련된 포스트입니다. 


최근, 기존에 진행하던 프로젝트를 안드로이드 스튜디오로 개발하기 시작하면서 안드로이드 스튜디오 사용법을 하나씩 깨달아(?) 가고 있는데요, 안드로이드 스튜디오에서 단위 테스트를 작성하는 방법에 대해선 문서화된 것들이 많이 없더군요. 때문에 여러 시행 착오를 거치다가 제대로 된 방법을 알게 되어서 간단히 정리해보려 합니다.


다른 글에서는 테스트 관련 라이브러리(Robolectric, Robotium)을 사용하여 테스트 하는 방법을 다룬 것들이 많은데, 여기에서는 이런 라이브러리들을 사용하지 않고 기본으로 제공하는 프레임워크를 사용하는 방법을 다룹니다.


이 글은 안드로이드 스튜디오 0.5.4 버전을 기준으로 작성되었습니다. 추후 업데이트로 인해 변동되는 부분이 있을 수 있습니다.


프로젝트 생성


테스트를 작성할 예제 프로젝트를 생성합니다. 전 다음과 같은 설정으로 프로젝트를 생성했습니다.


  • 패키지 이름 : com.androidhuman.example.studiotesting
  • 애플리케이션 이름 : StudioTesting


이후 표시되는 마법사에서는 모두 기본값을 선택하여 액티비티가 하나 생성되도록 합니다. (MainActivity 하나가 생성됩니다)


프로젝트가 생성되면, 프로젝트 탐색기 화면에서 애플리케이션 디렉터리의 'src' 하위에 'androidTest'라는 디렉터리가 만들어져 있을 겁니다. (만약 없다면, 새 디렉터리를 생성하면 됩니다)



안드로이드 스튜디오는 기본값으로 'androidTest' 디렉터리를 테스트 코드가 포함된 디렉터리로 인식합니다. 


이전에 작성된 글들을 보면, androidTest가 아닌 instrumentTest라는 폴더 하위에 테스트 코드를 작성하는 예제들이 있는데, 현재는 해당 방법을 시도해 보면 instrumentTest라는 폴더를 소스코드 폴더로 인식하지 않아 테스트 코드 클래스를 추가할 수 없습니다.

-> 플러그인 버전 0.9부터 바뀐 것이라 합니다. croute님 제보 감사드려요!! (http://tools.android.com/tech-docs/new-build-system/migrating_to_09)


테스트 코드를 추가하기 위해, 이 폴더 아래에 'java' 폴더를 새로 생성합니다. 테스트 코드용 디렉터리로 정상 인식하여 'java' 디렉터리의 아이콘이 초록색으로 표시되는 것을 확인할 수 있습니다.



테스트 코드 추가


이제 테스트 코드를 추가할 차례입니다. 테스트 코드를 추가하기 전에, 테스트 코드의 패키지를 생성합니다. 안드로이드 스튜디오에서는 명시적으로 지정하지 않는다면 [패키지 이름]+.test 패키지에 포함된 테스트 코드를 실행합니다. 따라서, 여기에서도 이 규칙에 맞게 'com.androidhuman.test.studiotesting.test' 라는 이름으로 패키지를 생성하겠습니다. 패키지를 추가하려면 'java' 폴더를 오른쪽 클릭한 후, New > Package 를 선택하면 됩니다.



이제, 테스트 코드를 추가해 봅시다. 이 포스트에서는 간단하게 다음의 두 테스트를 작성할 것입니다.

  1. JUnit Test case : 덧셈 결과를 반환하는 클래스의 테스트 코드 작성
  2. Android Test case : 액티비티 내 TextView에 표시되는 문자열을 확인하는 테스트 코드 작성

JUnit Test case 작성


먼저, 덧셈 결과를 반환하는 클래스를 작성합니다. 너무도 간단해서 더 이상의 설명이 필요가 없죠(...)


[Adder.java]

package com.androidhuman.example.studiotesting;

/**
 * Created by kunny on 4/8/14.
 */
public class Adder {
    public int add(int a, int b){
        return a+b;
    }
}

다음, 위 클래스를 테스트하는 테스트 코드를 작성합니다. androidTest/java 폴더 하위에, 위에서 만들었던 'com.androidhuman.example.studiotesting.test' 패키지 하위에 클래스를 생성합니다.


[BasicTest.java]

package com.androidhuman.example.studiotesting.test;

import com.androidhuman.example.studiotesting.Adder;

import junit.framework.TestCase;

/**
 * Created by kunny on 4/7/14.
 */
public class BasicTest extends TestCase{

    public void testSimple(){
        Adder adder = new Adder();
        assertEquals(5, adder.add(2, 3));
    }
}

Android Test case 작성


안드로이드 테스트 케이스를 작성할 차례입니다. 여기에서는 액티비티를 테스트하는 코드를 작성합니다. 프로젝트를 새로 생성하면 기본 액티비티에 'Hello, world!'라는 문구가 표시되는데, 여기에서는 이 문장이 제대로 표시되는지 확인하는 테스트를 작성해 보겠습니다.


마법사를 통해 생성된 코드 중, 다음 파일을 열어 TextView에 다음과 같이 '@android:id/text1'으로 id 를 부여합니다.


[activity_main.xml]

    <TextView
        android:id="@android:id/text1"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


액티비티 테스트 코드의 내용은, 완성된 코드를 보며 하나씩 짚어보겠습니다.


[MainActivityTest.java]

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public MainActivityTest(){
        super(MainActivity.class);
    }

    public void testHelloString(){
        Activity activity = getActivity();
        TextView tvHello = (TextView)activity.findViewById(android.R.id.text1);
        assertEquals(activity.getText(R.string.hello_world), tvHello.getText().toString());
    }

}

위 코드를 한 부분씩 분석해 보겠습니다. 

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>


JUnit Testcase와 달리 ActivityInstrumentationTestCase2<T> 를 상속하고 있습니다. 이는 안드로이드 액티비티를 테스트하기 위한 클래스로, <T>에는 테스트 대상 액티비티를 넣어줍니다. 


public MainActivityTest(){
        super(MainActivity.class);
}

생성자에서는 부모 생성자에 테스트 대상 액티비티를 넘겨 주어 테스트할 액티비티를 지정합니다.

public void testHelloString(){
    Activity activity = getActivity();
    TextView tvHello = (TextView)activity.findViewById(android.R.id.text1);
    assertEquals(activity.getText(R.string.hello_world), tvHello.getText().toString());
}

테스트 본체입니다. getActivity() 를 호출하여 테스트 대상 액티비티(MainActivity)를 호출하고, 액티비티 내에 문자열이 표시되는 TextView의 인스턴스를 받은 후, 여기에 표시되어야 하는 문자열(R.string.hello_world)이 제대로 표시되었는 지 확인하고 있습니다. 


build.gradle 수정


build.gradle 내의 defaultConfig 안에 다음 내용을 추가하면 됩니다.


testPackageName "com.androidhuman.example.studiotesting.test"

testInstrumentationRunner "android.test.InstrumentationTestRunner"


testPackageName을 테스트를 수행할 패키지를 의미하며, 여기에선 기본값으로 지정된 패키지에 테스트 코드를 추가하였으므로 이를 생략해도 됩니다. testInstrumentationRunner는 테스트를 안드로이드 테스트로 실행하도록 지정하는 역할을 합니다.


테스트 실행


테스트 코드를 실행하여 테스트를 수행하는 방법은 크게 두 가지가 있습니다. 

  1. 안드로이드 스튜디오에서 실행
  2. Gradle로 실행
테스트 방법은 달라도, 테스트는 모두 기기 혹은 에뮬레이터에서 실행되므로 기기를 연결하거나 에뮬레이터를 실행해야 테스트를 수행할 수 있습니다.

안드로이드 스튜디오에서 실행

'androidTest' 하위의 'java' 폴더를 오른쪽 클릭 후, Run > All Tests (안드로이드 아이콘이 있는 항목)을 선택하면 됩니다.


잠시 기다리면 테스트를 수행할 기기를 선택하는 화면이 표시되고, 기기를 선택하여 테스트가 수행되면 다음과 같이 테스트 결과가 표시됩니다.




Gradle로 실행

터미널에서 다음 명령어를 실행하면 됩니다. gradle이 설치되어 있는 경우 gradlew가 아닌  gradle 명령을 입력해도 무방합니다.

// Linux, OS X
$ ./gradlew connectedAndroidTest

// Windows
> gradlew connectedAndroidTest

실행 후 테스트 결과는 build/reports/androidTests/connected 폴더에 저장됩니다. 폴더 안의 index.html 파일을 열면 다음과 같이 테스트 보고서를 확인할 수 있습니다.



이 포스트에 사용된 프로젝트는 Github 에서 다운로드 할 수 있습니다.