티스토리 뷰

Mobile/Android

Testing in Other IDEs

out of coding 2014. 3. 7. 13:17

이번 내용은 이클립스를 사용하면, 필요없는 내용이다.

이 글을 작성하는 나도 별로 이렇게 까지 알고 싶지는 않다.

안드로이드가 요즘 정말 재미가 없어서 그런가.


일단은 도스 커맨드창에 적응이 되어 있는 사람들이라면, 쉽게 접근할수 있을것이라 생각한다.

그걸 모르면, 그냥 이클립스 깔고 테스트를 진행하길 바란다. 웬만하면 다들 이클립스 쓰겠지만...


Working with Test Projects

일단 안드로이드 툴을 이용하여 테스트 프로젝트를 만들거나, 이미 존재하는 테스트 코드를 안드로이드 테스트 프로젝트로 변환하거나, 이미 존재하는 안드로이드 테스트 프로젝트를 'run-tests' Ant 타겟에 추가할 수 있다. 이러한 작업에 관해서는 앞으로 이어질 섹션에서 보다 자세히 다루게 될 것이다.

Creating a test project

안드로이드 툴을 이용하여 테스트 프로젝트를 만들기 위해서는 다음과 같이 입력하라.


$ android create test-project -m {main_path} -n {project_name} -p {test_path}


각항목들은 필수 요소이므로, 꼭 넣어주도록 한다. 상세 내용은 다음과 같다.


옵션

내용

설명

-m, --main

테스트 어플리케이션 경로를 기준으로한, 테스트 대상 어플리케이션의 상대 경로

예를 들면, 테스트 대상 어플리케이션의 경로가, source/HelloAndroid이고, 테스트 프로젝트를 source/HelloAndroidTest폴더를 생성한다면, --main 값은 /HelloAndroid여야 한다.

-m, --name

테스트 프로젝트 이름

 

-p, --path

테스트 프로젝트 생성 경로

안드로이드 툴은 해당 경로에 테스트 프로젝트 파일과 필요한 디렉토리 구조를 생성한다. 디렉토리가 존재하지 않는 경우 해당 디렉토리를 생성한다.


만일 작업이 성공적으로 수행 되었다면, 안드로이드는 STDOUT으로 생성된 파일과 디렉토리 목록을 출력한다.


작업 결과로 새로운 테스트 프로젝트가 생성된다. 생성된 디렉토리 구조와 빌드 파일 컨텐츠는 일반 안드로이드 어플리케이션과 동일한다. 관련 정보는 Developing In Other IDEs문서에 자세하게 설명되어 있다.


작업 결과 AndroidManifest.xml 파일이 Instrumentation 정보와 함께 생성된다. 테스트를 실행할때, 안드로이드는 이 정보를 기반으로 테스트 대상이 되는 어플리케이션을 컨트롤 할 수 있도록 Instrumentation와 함께 로드한다.


예를 들면, Hello, World 튜터리얼 어플리케이션을 ~/source/HelloAndroid에 생성했다고 가정하자. 이 어플리케이션은 패키지 이름이 com.example.helloandroid이고  HelloAndroid라는 Activity를 갖고 있다. 여러분은 ~/source/HelloAndroidTest 위치에 다음과 같은 테스트 프로젝트를 생성할 수 있다.


$ cd ~/source

$ android create test-project -m ../HelloAndroid -n HelloAndroidTest -p HelloAndroidTest


이 결과 ~/src/HelloAndroidTest 디렉토리가 생성된다. 새 디렉토리에는 AndroidManifest.xml파일이 있으며, 이 파일은 다음과 같은 instrumentation 연관 정보를 담고 있다.


  • <application> : <uses-library>를 담고 있다.
  • <uses-library android:name="android.test.runner"> : 안드로이드 테스트 어플리케이션은 android.test.runner 라이브러리를 사용함을 나타낸다.

  • <instrumentation> : 다음과 같은 속성 값을 포함한다.
    • android:name="android.test.InstrumentationTestRunner" : InstrumentationTestRunner가 테스트를 수행함을 나타낸다.
    • android:targetPackage="com.example.helloandroid" : 테스트 대상 어플리케이션의 패키지 이름
    • android:label = "Tests for .HelloAndroid" : 이 테스트에 관해 사용자가 이해할 수 있는 라벨 정보. 기본적으로 안드로이드 툴이 'Tests for ~'라는 형식으로 지정해 준다.
Updating a test project
여러분은 안드로이드 툴을 이용하여, 테스트 대상 어플리케이션의 경로를 수정할 수 있다. 만일 여러분이 Eclipse를 통해 만들어진 테스트 프로젝트를 수정하고자 한다면, "Create"기능을 사용해야 한다. Creating a test Project 항목을 참고하라.

만일, 테스트 대상 어플리케이션의 패키지 이름을 수정하고 싶다면, 직접 메니페스트 파일에 포함되어 있는 <android:targetPackage> 속성 값을 수정해 주어야 한다.

테스트 프로젝트를 업데이트 하기 위해서는 다음과 같이 입력한다.

$ android update-test-project -m {main_path} -p {test_path}

상세내역은 다음과 같다.


옵션

내용

-m, --main

테스트 어플리케이션 경로를 기준으로한, 테스트 대상 어플리케이션의 상대 경로

-p, --path

테스트 프로젝트 생성 경로


작업이 성공적으로 수행되었다면, 안드로이드는 STDOUT으로 생성된 파일과 디렉토리 목록을 출력한다.




Creating a Test Application


테스트 프로젝트가 생성되었다면, 테스트 어플리케이션을 만들어야 한다. 테스트 어플리케이션은 Activity를 필요로 하지 않는다. (원한다면 만들어도 된다.) 테스트 어플리케이션은 여러 가지 요소(Activity, 확장된 안드로이드 테스트 클래스, JUnit확장 클래스, 기타 등등의 클래스)들로 이루어질 수 있지만, 테스팅 기능들을 가장 잘 활용하기 위하여, 안드로이드 테스트 클래스나 JUnit 클래스를 상속받는 것이 좋다.


InstrumentationTestRunner 혹은 이와 유사항 TestRunner를 이용하여 테스트를 실행하면, 테스트 클래스에 포함된 모든 메서드가 수행된다. TestSuite 클래스를 이용하여 작동 방식을 변경 할 수도 있다.


테스트 어플리케이션을 만들때는 우선 android.test 패키지에 포함되어 있는 안드로이드 테스트 클래스 중에 하나를 이용하라. 이것들은 JUnit의 TestCase 클래스를 확장하여 만들어졌다. 몇 가지 예외적인 경우를 제외하고 일반적으로 안드로이드 테스트 클래스는 Instrumentation 기능을 제공한다.


테스트 케이스 클래스를 상속할 때, 개발자는 일반적으로 setUp()과 tearDown()메서드를 오버라이드 한다.

  • setUp() : 이 메서드는 테스트 클래스의 각 테스트 메서드가 호출되기 전에 호출된다. 테스트를 위한 환경을 설정하는데 사용하라. 예를 들어 setUp() 메서드 내에서 새로운 인텐트 오브젝트를 생성한 후, 해당 인텐트를 이용해 Activity를 시작하도록 할 수 있다. *주의점 : 이 메서드를 오버라이드 할 때, 코드 첫줄에서 super.setUp() 구문을 반드시 호출하라.
  • tearDown() : 이 메서드는 테스트 클래스의 각 테스트 메서드가 호출된 후에 호출된다. 가비지 컬렉션을 수행하고, 다음 테스트를 진행하기 위해 환경을 다시 설정할 때 사용하라. *주의점 : 이 메서드를 오버라이드 할 때, 코드 첫줄에 super.tearDown() 구문을 호출하라.
또 한가지 유용한 관습(Convention)은 테스트 클래스에 testPreConditions() 메서드를 추가하는 것이다. 이 메서드를 테스트 대상이 되는 어플리케이션이 올바르게 초기화 되었는지를 테스트 하는데 사용하라. 만일 이 테스트가 실패한다면, 초기 설정이 잘못된 것이며, 이 후에 발생하는 테스트 결과는 믿을 수 없는 값으로 간주해야 한다.

Activity Testing 튜터리얼은 테스트 클래스와 테스트 메서드를 만들기 위한 보다 상세한 정보를 담고 있다.



Running Tests

Eclipse를 이용하지 않고 개발을 한다면, 커맨드 라인상에서 테스트를 실행해야 한다. Ant혹은 ActivityManager 커맨드 라인 인터페이스를 이용할 수 있다.

물론, Eclise상에서 어플리케이션을 개발하는 경우에도 커맨드 라인툴을 사용할 수 있다. 이를 위해서는 개발자는 create test-project 커맨드를 이용하여, 테스트 프로젝트내에 적절한 파일과 디렉토리 구조를 생성해야 한다.

Quick build and run with Ant
여러분은 Ant를 이용해서 테스트 프로젝트에 포함된 모든 테스트를 수행할 수 있다. 안드로이드 툴을 이용하여 테스트 프로젝트를 생성할 때, 자동으로 만들어지는 run-tests 커맨드를 사용하면 된다.

이 명령은 필요한 경우, 테스트 프로젝트와 테스트 대상 프로젝트를 빌드하고, 어플리케이션을 현재 AVD 혹은 디바이스에 설치한 후, 모든 테스트를 수행한다. 테스트 결과는 STDOUT으로 출력된다.

여러분은 update test-project 커맨드를 이용하여, 기존에 존재하는 테스트 프로젝트가 run-test 매크로를 다시 생성하도록 업데이트 할 수 있다.

Running tests on a device or emulator
ActivityManager 커맨드 라인 툴을 이용하여 테스트를 수행하고자 한다면, 훨씬 다양한 방식으로 테스트를 진행할 수 있다. 개별 테스트를 선택하거나, 어노테이션 정보를 기반으로 특정 테스트를 필터링 할 수도 있고, 테스트 옵션을 구체적으로 지정할 수 있다. 또한 테스트 수행 전 과장이 커맨드 라인을 이용하여 컨트롤됨으로, 쉘 스크립트를 이용하여 다양한 방식으로 테스팅 방식을 커스텀화 할 수 있다.

개발자는 Android Debug Bridge(ADB)를 통해, 안드로이드 디바이스 혹은 에뮬레이터 상에서 ActivityManager툴을 동작시킨다. 그러면, ActivityManager Instrument 옵션을 이용하여 안드로이드 Test Runner (일반적으로 InstrumentationTestRunner)를 통해, 테스트 어플리케이션을 구동할 수 있다. ActivityManager 옵션은 커맨드 라인 플래그로 설정 가능하다.

ActivityManager으로 테스트를 수행하는 단계는 다음과 같다.
  1. 필요한 경우, 메인 어플리케이션과 테스트 어플리케이션을 빌드한다.
  2. 테스트 어플리케이션과 메인 어플리케이션을 대상 디바이스에 인스톨한다.
  3. 커맨드라인에 다음과 같이 입력한다.
$ adb shell am instrument -w {test_package_name}/{runner_class}

테스트 어플리케이션의 패키지 이름은 {test_package_name}, 사용할 안드로이드 TestRunner 클래스 이름은 {runner_class}이다. 패키지 이름은 메니페스트에 설정된 이름을 사용해야 하며, InstrumentationTestRunner가 일반적으로 TestRunner로 사용된다. 테스트 결과는 STDOUT으로 출력된다.

즉, 우선 ADB 쉘이 실행되고, 그 후에 ActivityManager Instrument가 지정된 파라메터를 이용하여 시작된다. 위에 예로 든 커맨드 라인 명령은 테스트 어플리케이션에 포함된 모든 테스트를 수행한다. 여러분은 am instrument에 전달하는 플래그 값을 이용하여 테스트 동작을 제어할 수 있다.



Using the Instrument Command

AM Instrument 커맨드에서 사용되는 기본 형식은 다음과 같다.

$ am instrument [flags] {test_package}/{runner_class}

AM Instrument에 사용되는 주요 파라메터들은 다음과 같다.

Parameter

내용

설명

{test_package}

테스트 어플리케이션의 패키지 이름

테스트 어플리케이션 메니페스트에 선언되어 있는 package 속성 값.

{runner_class}

사용 할 Test Runner 클래스 이름

일반적으로 InstrumentationTestRunner가 사용된다.


AM Instrument에서 사용되는 플래그들은 다음과 같다.

Flag

내용

설명

-w

 

Instrumentation가 종료되기 전까지, AM Instrument가 대기 하도록 한다. 이 옵션이 필수 사항은 아니지만, 만일 이 옵션을 사용하지 않으면, 테스트 결과가 나오기 전에 AM Instrument가 종료되며, 여러분은 테스트 결과를 확인 할 수 없을 것이다.

-r

 

Raw 포멧으로 결과를 출력한다. 테스트 출력 값들이 하나의 테스트 결과로 종합되지 않기를 원할 때 사용된다. (예를 들어 성능을 측정하기 위한 자료를 수집하는 경우), 이 플래그는 ‘-e perf true’ 플래그와 함께 사용되도록 설계되었다.

-e

<test_options>

<Key-Value> 쌍으로 이루어진 테스트 옵션을 지원한다. 전달된 옵션은 Instrumentation onCreate() 시점에 적용된다. –e 플래그는 다양한 테스트 옵션을 적용하기 위해, 중복해서 사용할 수 있다. 테스트 옵션에 관한 내용은 다음 테이블에서 설명된다. 테스트 옵션은 InstrumentationTestRunner 클래스를 사용하는 경우에만 적용된다.


Instrument options
AM Instrument 툴은 InstrumentationTestRunner 에게 -e 플래그를 이용하여 Key-Value 쌍으로 이루어진 테스트 옵션을 전달한다.

(EX) -e <key> <value>

적절한 경우, Key는 콤마(,)로 구분된, 하나 이상의 Value값을 갖을 수 있다. 예를 들어, 다음의 구문은 InstrumentationTestRunner 클래스에 여러 패키지 값을 넘겨준다.

$ adb shell am instrument -w -e package com.android.test.package1,com.android.test.package2 com.android.test/android.test.InstrumentationTestRunner

이어지는 테이블에서는, 테스트 옵션으로 사용 가능한 Key-Value 값들과, 그 효과에 관해 이야기한다. 테이블에 뒤이어 설명된 Usage Notes 내용도 주의깊게 살펴보라.

Key

내용

설명

package

<Java_package_name>

테스트 어플리케이션에 포함되어 있는 온전한 Java 패키지 이름. 해당 패키지에 속성 테스트 케이스 클래스들이 수행된다. 패키지 이름이 안드로이드 패키지 이름이 아닌 점을 주의하라. 하나의 안드로이드 테스트 어플리케이션은 오직 하나의 안드로이드 패키지 이름을 갖지만, 그 안에 여러 자바 패지키를 포함 할 수 있다.

class

<class_name>

온전한 테스트 케이스 클래스 이름. 여기에 명시된 테스트 클래스만 수행된다.

 

<class_name>#method name

온전한 테스트 케이스 클래스 이름과 그 안에 속한 메서드 이름. 해당 메서드 만이 실행된다. 특정 클래스에 속한 메서드임을 나타내기 위하여 해쉬 마크(#)가 사용된다.

func

true

InstrumentationTestCase 클래스를 상속받는 모든 테스트 케이스 클래스를 수행한다.

unit

true

InstrumentationTestCase 혹은PerformanceTestCase 클래스를 상속받지 않은 테스트 케이스 클래스만 수행한다.

size

[small | medium |large]

테스트 메서드에 적힌 사이즈 어노테이션을 기반으로 테스트를 수행한다.@SmallTest@MediumTest@LargeTest. 어노테이션이 사용 가능하다.

perf

true

PerformanceTestCase 를 상속받은 테스트 클래스를 실행한다. 이 옵션을 사용하는 경우, 테스트 출력이 테스트 결과로 포맷되지 않고 Raw 포맷으로 출력되도록 -r 플래그를 사용하라

debug

true

테스트를 디버그 모드에서 수행한다.

log

true

선택된 모든 테스트들 정보를 실행하지 않고, 출력한다. 테스트 옵션과 플래그를 잘 설정했는지 확인하고자 할 때 사용하면 유용하다.

emma

true

 EMMA 코드 커버리지 분석기능을 실행한 후, 그 결과를 디바이스의 /data/coverage.ec 에 기록한다.

Note: 이 옵션은 coverage target 으로 생성되는, 테스트 어플리케이션의 EMMA-instrumenteted 빌드를 필요로 한다.

coverageFile

<filename>

 EMMA 코드 커버리지의 기본 로케이션 정보를 변경한다. 경로 정보는 UNIX 포맷으로 지정해야 한다.


-e Flag Usage Notes
  • AM Instrument는 Key-Value값을 Bundle에 담아, onCreate()를 호출한다.
  • package옵션이 class옵션보다 우선된다. 만일 여러분이, package옵션으로 특정 package를 지정한 후, class 옵션에 해당 package에 속한 특정 class만을 지정하더라도, 해당 package에 속한 모든 테스트가 수행된다.
  • func키와 unit키는 상호 배타적이며, 동시에 사용될 수 없다.

Instrument examples
AM Instrument를 이용하여 테스트를 수행하는 몇 가지 샘플이 있다. 샘플들은 다음과 같은 가장하에 작성되었다.
  • 테스트 어플리케이션은 com.android.demo.app.tests 이다
  • 다음의 세가지 테스트 클래스가 존재한다.
    • UnitTests : testPermission과 testSaveState 메서드를 갖고 있다.
    • FunctionTests : testCamera, testXVGA, testHardKeyboard 메서드를 갖고 있다.
    • IntegrationTests : testActivityProvider 메서드를 갖고 있다.
  • InstrumentataionTestRunner를 사용한다.

Running the Entire Test Application
UnitTests 테스트 클래스만 테스트하기 위해서는 다음과 같이 입력하라.

$ adb shell am instrument -w -e class com.android.demo.app.tests.UnitTests com.android.demo.app.tests/android.test.InstrumentationTestRunner

Selection a Subset of Tests
UnitTests 클래스 전부와 FunctionTest에 속한 testCamera 메서드만을 실행 하고 싶으면 다음과 같이 입력하라.

$ adb shell am instrument -w -e class com.android.demo.tests.UnitTests,com.android.demo.app.tests.FunctionTests #testCamera com.android.demo.app.tests/android.test.InstrumentationTestRunner

보다 다양한 예제는 InstrumentationTestRunner 문서를 참고하라.

'Mobile > Android' 카테고리의 다른 글

[Android Studio] 기본  (0) 2014.03.07
Hello, Testing  (0) 2014.03.07
Data backup  (0) 2014.02.19
[Android]화면 밝기 관련  (0) 2014.02.10
Testing. Eclipse with ADT  (0) 2014.02.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함