[안드로이드] 액티비티 테스트 자습서

2023. 2. 19. 19:02모바일프로그래밍/안드로이드

728x90

 

 

[안드로이드] 액티비티 테스트 자습서

#Android에는 응용 프로그램을 테스트하기위한 강력한 도구가 포함되어 있습니다. 이 툴은 #JUnit 으로 ...

blog.naver.com

 

#Android에는 응용 프로그램을 테스트하기위한 강력한 도구가 포함되어 있습니다. 이 툴은 #JUnit 으로 추가 기능 확장과 모의 Android 시스템 객체를 위한 편리한 클래스를 제공하며, 테스트 동안 메인 애플리케이션을 제어 할 수 있도록 계측(instrumentation)을 사용 합니다. 완전한 Android #테스팅 환경은 테스팅 기본 사항 문서(Testing Fundamentals)에서 논의 되었습니다.

 

이 자습서에서는 간단한 Android 애플리케이션을 제시 한 다음 이를 위한 단계별로 테스트 애플리케이션 작성을 안내하면서 그에 대한 Android 테스트 도구들을 보여줍니다. 테스트 애플리케이션은 보여주는 주요 사항들은 다음과 같습니다.

 

  • Android 테스트는 AndroidManifest.xml 파일 내의 항목으로 테스트 중 인 애플리케이션에 연결되는 Android 애플리케이션입니다.
  • Android 컴포넌트들 대신, Android 테스트 응용 프로그램에는 하나 이상의 테스트 케이스들이 포함되어 있습니다. 이들 각각은 별도의 클래스 정의가 됩니다.
  • 안드로이드 테스트 케이스 클래스들은 JUnit #TestCase 클래스에서 상속 받습니다.
  • 액티비티들을 위한 안드로이드 테스트 케이스 클래스는 Junit 클래스를 상속받고 instrumentation 을 통해 테스트 중인 애플리케이션에 연결합니다. 키 스트로크 또는 터치 이벤트를 UI에 직접 보낼 수 있습니다.
  • 테스트 중인 컴포넌트 타입 기반의 안드로이드 테스트 케이스 클래스를 선택 합니다(응용프로그램 액티비티, 컨텐츠 프로바이더, 혹은 서비스)
  • 테스트 응용 프로그램을 만들고, 실행 시키며 결과를 보여주기 위한 Eclipse/ADT 내의 추가 테스트 툴들이 포함되어 있습니다.

 

테스트 응용 프로그램은 다음 테스트들을 수행 하기 위한 방법들을 포함합니다.

 

  • 기본 조건 테스트. 테스트 상의 응응프로그램이 올바르게 초기화 되는 지 테스트 합니다. 이 테스트는 또 응용 프로그램의 onCreate()메서드의 유닛 테스트도 수행 합니다.
  • UI 테스트. 메인 UI 동작이 제대로 동작 되는 지 테스트 합니다. 이 테스트는 액티비티 테스트를 가능하게 하는 instrumentation 기능들을 보여 합니다.
  • 스테이지 관리 테스트. 저장 상태에 대한 응용 프로그램 코드를 테스트 합니다. 이 테스트는 테스트 러너의 instrumentation 기능을 보여 주며 모든 컴포넌트들을 테스트 할 수 있습니다.

 

 

사전(전제) 조건


이 자습서의 코드와 지침들은 다음에 의존적입니다.

 

  • 안드로이드 프로그래밍에 대한 기초 지식. 만약 안드로이드 응용 프로그램을 만들어본 적이 없다면, Building Your First App의 클래스를 만들어 보십시오. 만약 테스트 상의 Spinner 에 대해서 더 알고 싶다면 "Spinner" 샘플 앱에 대한 리뷰를 원할 수도 있을 것입니다.
  • 약간의 안드로이드 테스트 프레임워크과 개념에 대한 친밀성. 만약 안드로이드 테스트를 경험해 보지 못했다면, Testing Fundamentals 가이드를 읽어 보는 것부터 시작 하십시오.
  • 이클립스ADT. 이 자습서는 이클립스 ADT를 사용한 테스트 프로그램의 실행과 환경 설정 하는 법에 대해서 설명 합니다. 만약 이클립스와 ADT 플러그 인을 설치 하지 않았다면, 진행하기 전에 이 툴을 설치하기 위한 Installing the SDK단계를 따라 하십시오. 만약 이클립스로 개발해보지 않는다면, 이 문서의 appendix내에 테스트 응용프로그램의 환경설정과 실행 법을 찾을 수 있습니다.
  • 안드로이드 1.5 플랫폼(API Level 3) 혹은 이상. 이 버전에 소개된 API를 사용하여 이 자습서를 진행 하기 때문에, SDK 내에 안드로이드 1.6 플랫폼(API Level 3) 혹은 그 이상 버전이 설치되어야 합니다.

 

 

만약 당신이 SDK 상에 설치 되어 있는 플랫폼 버전을 확실히 알지 못한다면 Android SDK 와 AVD 매니저를 열어서 Installed Package패널을 확인 하십시오. 만약 SDK로 어떻게 플랫폼을 다운로드 하는 지 모른다면 Exploring the SDK 를 읽어보십시오.

 

 

샘플 코드 설치하기


자습서를 진행하는 동안, 특히 다운로드 가능한 SDK의 샘플 컴포넌트의 한 부분으로 제공 되는 샘플 코드로 작업을 진행 할 것입니다. 샘플 응용프로그램들의 쌍으로 작업 할 것입니다. – 테스트 응용 프로그램과 테스트 상의 응용프로그램.

  • Spinner 는 테스트 진행을 위한 응용 애플리케이션입니다. 이 자습서는 이미 존재하는 응용프로그램에 대한 테스트 작성을 위한 일반적인 조건에 중점을 두기 때문에 메인 응용 프로그램은 직접 만들어야만 합니다.
  • SpinnerTest는 테스트 응용 프로그램입니다.

 

이 자습서에서는 이 응용프로그램을 단계별로 작성 합니다.

 

이 자습서를 빨리 ​​실행하려면 완성 된 SpinnerTest 응용 프로그램을 먼저 설치 한 다음 문서를 따르십시오. 그러나 테스트 응용 프로그램을 만들면 자습서에서 더 많은 정보를 얻을 수 있습니다. 완료된 테스트 응용 프로그램 설치에 대한 지시 사항은 완전한 테스트 응용 프로그램은 Installing the Completed Test Application File 절에 나와 있습니다.

 

샘플 응용프로그램들은 Samples토픽에 좀 더 자세하게 나와 있습니다. 내가 작업하는 플랫폼에 맞는 샘플 버전을 다운로드 하기 위해서 다음 지침을 활용 하십시오.

 

 

 

에뮬레이터 설정


이 자습서에서, 우리는 응용프로그램 실행을 위해서 안드로이드 에뮬레이터를 사용할 것입니다. 에뮬레이터는 이전 단계의 프로젝트들에 설정한 API level 와 같거나 높은 버전의 Android Virtual Device (AVD) 이 필요 합니다. 어떻게 이를 확인하고 맞는 AVD를 생성 할 것인지에 대해 확인을 원하는 다면, 필요시 Creating an AVD를 확인 하십시오.

 

AVD 와 에뮬레이터의 테스트로서, Eclipse/ADT 내의 SpinnerActivity 실행합니다. 응용프로그램이 실행 되면, spinner 텍스트의 오른쪽 큰 아래를 가리키는 화살표를 클릭합니다. 상단에 "Select a planet" 라는 타이틀이 표시되고 spinner 확장 되는 것을 볼 것입니다.

 

 

프로젝트 설정하기


Spinner(테스트 할 응용프로그램) 와 SpinnerTest(테스트 응용프로그램)의 두개의 이클립스 프로젝트 환경설정을 시작하면서 이 자습서를 시작할 준비가 되면, 수정없이 Spinner 애플리케이션을 그대로 사용하게 되므로 기존 소스에서 새로운 Android 프로젝트를 만들어 Eclipse에 로드 할 수 있습니다.

 

이 과정에서 SpinnerTest 응용 프로그램을 포함 할 Spinner와 관련된 새 테스트 프로젝트를 만들 것입니다. SpinnerTest 애플리케이션은 완전히 새로운 것이므로 이 자습서의 코드 예제를 사용하여 테스트 클래스와 테스트를 추가 할 것이다.

 

기존 소스코드에서 새로운 안드로이드 프로젝트의 Spinner 앱을 설치 하기 위해서 다음 단계를 따르십시오.

 

  1. 이클립스에서 File > New > Project > Android > Android Project 를 선택하고다음을 클릭합니다. New Android Project 다이얼로그가 나타납니다.
  2. 텍스트박스에 프로젝트 이름 란에 “SpinnerActivity” 입력 합니다. Properties 영역은 자동으로 채워집니다.
  3. Contents 영역에 "Create project from existing source"로 설정합니다.
  4. 위치 에는 Browse 를 클릭하여 <SDK_path>/samples/android-8/Spinner 로 이동하여 Open을 클릭합니다. 디렉토리 이름인 <SDK_path>/samples/android-8/Spinner 가 텍스트 Location 박스에 나타납니다.
  5. Build Target 영역에서, API 레벨을 3 이상으로 정해 줍니다. 만약 특정 타켓 API 에서 이미 개발 되었다면, API 레벨은 3이상이 될 것이고, 이 타겟 API를 사용하면 됩니다.
  6. Properties 영역에서 Min SDK Version을 "3"으로 입력합니다.
  7. 아래의 값들이 보여야만 합니다.
    1. 프로젝트 이름 : "SpinnerActivity"
    2. 기존 소스로 부터 프로젝트 생성: set Location:"<SDK_path>/samples/android-8/Spinner"
    3. Build Target: "API level of 3 or higher" (Target Name "Android 1.5 or higher")
    4. 패키지 명: (disabled, set to "com.android.example.spinner")
    5. 액티비티 생성 : (disabled, set to ".SpinnerActivity")
    6. Min SDK Version: "3"

 

 

다음 스크린 샷은 다음과 같이 이런 값들로 요약 됩니다.

응용 프로그램 을 SpinnerTest 위한 새로운 테스트 프로젝트를 생성하기 위해서 다음 단계를 수행 합니다:

 

  1. Next를 클릭합니다. New Android Test Project 다이얼로그가 나타납니다.
  2. Create a Test Project를 설정합니다.
  3. 다른 값들은 그대로 둡니다. 결과 값은 다음과 같아야 합니다.
    1. 테스트 프로젝트 생성: 체크하기
    2. 테스트 프로젝트 이름: "SpinnerActivityTest"
    3. 기본 위치: 체크하기 ( 다음 디렉토리 "workspace/SpinnerActivityTest" 안에 있어야 함)
    4. 빌트 타켓: 이전 단계에서 사용 했던 API 레벨 사용
    5. 애플리케이션 이름: "SpinnerActivityTest"
    6. 패키지 명: "com.android.example.spinner.test"
    7. Min SDK Version: "3"

 

 

다음 스크린 샷은 이 값들을 요약한 것입니다.

4. Finish를 클릭합니다. SpinnerActivity 와 SpinnerActivityTest의 엔트리는 Package Explorer.에 나타나야 합니다

 
참고 : 빌드 타겟을 "3"보다 높은 API 레벨로 설정하면 "선택한 SDK 타겟의 API 레벨이 최소 SDK 버전과 일치하지 않습니다"("The API level for the selected SDK target does not match the Min SDK version")라는 경고가 표시됩니다. API 레벨이나 Min SDK 버전을 변경할 필요는 없습니다. 이 메시지는 하나의 특정 API 레벨로 프로젝트를 빌드 중이지만 더 낮은 API 레벨이 필요하다는 것을 말합니다. 선택 사항 인 이전 API 레벨을 설치하지 않기를 선택한 경우 발생할 수 있습니다.

 

Eclipse 창의 맨 아래에 있는 문제 창에 오류가 표시되거나 패키지 탐색기에서 SpinnerActivity 항목 옆에 빨간색 오류 표시가 나타나면 SpinnerActivity 항목을 강조 표시 한 다음 Project > Clean 를 선택하십시오. 이렇게하면 오류가 수정됩니다.

이제 SpinnerActivity 프로젝트에서 테스트 중인 응용 프로그램과 빈 테스트 프로젝트 인 SpinnerActivityTest를 만들었습니다. 두 프로젝트가 다른 디렉토리에 있음을 알 수 있지만 ADT가 있는 Eclipse는 자동으로 이를 처리합니다. 빌드와 실행에 문제가 없어야 합니다.

 

#이클립스와 #ADT 는 테스트 애플리케이션을위한 초기 설정은 이미 되었다는 것을 확인 하십시오. SpinnerActivityTest 프로젝트를 확장하면 이미 Android Manifest 인 AndroidManifest.xml에 존재 하는 것을 알 수 있습니다. 테스트 프로젝트를 추가 하면서 Eclipse ADT가 이를 생성했습니다. 또한 테스트 응용 프로그램은 이미 instrumentation 을 사용하도록 설정되어 있습니다. AndroidManifest.xml을 검사하면 이를 알 수 있습니다. 이 파일을 연 다음 가운데 창 아래에서 AndroidManifest.xml을 클릭하여 XML 내용을 표시합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.example.spinner.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="3" />
    <instrumentation
        android:targetPackage="com.android.example.spinner"
        android:name="android.test.InstrumentationTestRunner" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <uses-library android:name="android.test.runner" />
        ...
    </application>
</manifest>
 

<instrumentation> 엘리먼트를 주목하십시오. android:targetPackage="com.android.example.spinner" 는 테스트중인 애플리케이션이 Android 패키지 com.android.example.spinner에 정의되어 있음을 Android에 알립니다.

Android는 이제 해당 패키지의 AndroidManifest.xml 파일을 사용하여 테스트중 인 애플리케이션을 시작한다는 것을 알고 있습니다. <instrumentation> 엘리먼트는 또 android:name="android.test.InstrumentationTestRunner 속성을 포함하는데, 안드로이드 instrumentation이 테스트 용 애플리케이션을 안드로이드 instrumentation-enabled 테스트 러너와 함께 실행하도록 지시합니다.

 

 

테스트 케이스 클래스들 생성하기


테스트 프로젝트 SpinnerActivityTest와 SpinnerActivityTest라고하는 테스트 응용 프로그램의 기본 구조가 생겼습니다. 기본 구조에는 테스트가 포함 된 클래스 (테스트 케이스 클래스)를 제외하고 테스트 응용 프로그램을 빌드하고 실행하는 데 필요한 모든 파일과 디렉토리가 포함됩니다.

 

다음 단계는 테스트 케이스 클래스를 정의하는 것입니다. 이 자습서에서는 다음을 포함하여 테스트 케이스 클래스를 작성합니다.

 

  • 테스트 설정. 이는 안드로이드 테스트를 실행하기 전에 실행 해야 할 여러가지 태스크들을 보여주는 Junit setUp() 메서드를 사용합니다.
  • 초기 조건 테스트. 이 테스트는 훌륭한 테스트 기술을 보여줍니다. 또한 Android instrumentation을 사용하면 메인 액티비티가 시작되기 전에 테스트 중 인 응용 애플리케이션을 살펴 볼 수 있습니다.

 

테스트는 응용 프로그램의 중요한 객체가 초기화 되었는지 검사합니다. 테스트가 실패하면 응용 프로그램이 올바르지 않은 상태에서 실행 되었기 때문에 응용 프로그램에 대한 다른 테스트가 신뢰할 수 없다는 것을 알게 됩니다.

 
참고 : 초기 조건 테스트의 목적은 setUp () 메서드를 사용하는 것과 똑같지 않습니다. JUnit setUp ()은 각 테스트 메소드가 실행되기 전에 한 번 실행되며 그 목적은 완벽한 테스트 환경을 만드는 것입니다. 초기 조건 테스트는 한 번 실행되며 테스트 목적의 응용프로그램이 테스트 준비가 되었는지 확인하는 것이 목적입니다.

 

  • UI 테스트. 이는 안드로이드 테스팅의 강력한 자동화 특징인 instrumentation을 이용한 메인 응용 프로그램의 UI을 어떻게 제어 할 지을 보여 주는 테스트 입니다.
  • 상태 관리 테스트. 이 테스트는 Android 환경에서 애플리케이션이 상태를 얼마나 잘 유지하는지 테스트하는 몇 가지 기술을 보여줍니다.

 

만족스러운 사용자 경험을 제공하려면 애플리케이션이 전화 통화로 인해 중단되거나 메모리 제약으로 인해 파손 되더라도 현재 상태를 잃어 버려서는 안됩니다. Android 액티비티 생명주기는 상태를 유지하는 방법을 제공하고, SpinnerActivity 애플리케이션은 이를 이용 합니다. 이 테스트에서는 이것들이 제대로 작동하는지 확인하는 방법을 보여줍니다.

 

Android 테스트는 하나 이상의 테스트 클래스 정의가 포함 된 특수 유형의 Android 응용프로그램에 포함되어 있습니다. 이들 각각은 실제 테스트를 수행하는 하나 이상의 테스트 메소드를 포함합니다. 이 자습서에서는 먼저 테스트 케이스 클래스를 추가 한 다음 테스트들을 추가합니다.

 

우선 Android 테스트 케이스 클래스를 선택하여 상속 받으십시오. 기본 테스트 케이스 클래스는 테스트 중 인 Android 구성 요소 및 수행 중 인 테스트 유형에 따라 선택합니다.

 

이 자습서에서 테스트 중 인 응용 프로그램에는 단순 액티비티 이므로, 테스트 케이스 클래스는 액티비티 구성 요소에 대한 것입니다. Android는 여러 가지를 제공하지만 가장 현실적인 환경에서 테스트하는 것은 ActivityInstrumentationTestCase2이므로 베이스 클래스로 사용합니다.

 

모든 액티비티 테스트 케이스 클래스와 마찬가지로 ActivityInstrumentationTestCase2는 테스트 중 인 애플리케이션의 UI와 직접 상호 작용할 수 있는 편리한 메소드를 제공합니다.

 

테스트 케이스 파일 추가하기

 

베이스(부모) 테스트 케이스 클래스로 ActivityInstrumentationTestCase2 를 추가하기 위해서 다음 단계를 따르십시오.

1. SpinnerActivityTest 클래스가 열려 있지 않으면, Package Explorer 내에서 이 테스트 프로젝트를 엽니다.

2. SpinnerActivityTest에서 src/ 폴더를 확장하면, com.android.example.spinner.test를 선택합니다패키지 이름위에 마우스 오른쪽 버튼을 클릭하고 New > Class 를 선택합니다.

New Java Class 마법사가 나타납니다

 

3. 마법사에서, 다음을 입력합니다.

Name: "SpinnerActivityTest". 이 이름은 테스트 클래스의 이름이 됩니다.

Superclass: "android.test.ActivityInstrumentationTestCase2<SpinnerActivity>". 부모클래스는 매개변수화 되고, 당신의 메인 응용프로그램의 클래스 이름과 함께 명시 되어야 합니다.

 

다른 설정을 건드리지 마십시오. Finish 를 클릭합니다.

4. 프로젝트에 새로운 SpinnerActivityTest.java 파일이 생성 됩니다.

5. SpinnerActivity 의 참조를 리졸브하기 위해서 다음 import 구문을 추가 합니다.

import com.android.example.spinner.SpinnerActivity;
 

테스트 케이스 생성자 추가하기

 

테스트 응용 프로그램이 올바르게 인스턴스화되도록 하려면 테스트 러너가 테스트 클래스를 인스턴스 화 할 때 호출 할 생성자를 설정해야합니다. 이 생성자에는 매개 변수가 없으며 유일한 목적은 수퍼 클래스의 기본 생성자에 정보를 전달하는 것입니다. 이 생성자를 설정하려면 클래스에 다음 코드를 입력하십시오.

 public SpinnerActivityTest() {
    super("com.android.example.spinner", SpinnerActivity.class);
  } // end of SpinnerActivityTest constructor definition
 

이는 안드로이드 패키지 이름으로 부모 클래스 생성자(com.android.example.spinner)와 테스트 상의 응용프로그램을 위한 메인 액티비티 클래스 호출(SpinnerActivity.class)합니다.

이제 클래스에 테스트 메서드들을 추가 함으로써, 테스트들을 추가 할 준비가 되었습니다.

 

setup 메서드 추가하기

 

setUp() 메서드는 모든 테스트를 수행하기 전에 호출됩니다. 변수를 초기화하고 이전 테스트에서 정리하는 데 사용합니다. 모든 테스트 메소드 후에 실행되는 JUnit tearDown() 메소드를 사용할 수도 있습니다.

이 자습서에서는 사용하지 않습니다.

 

추가 하려는 메서드는 다음을 수행 합니다.

  • super.setUp(). JUnit 에서 요구되는 setUp()메서드를 위한 부모클래스의 생성자를 호출 합니다
  • setActivityInitialTouchMode(false)메서드를 호출합니다. 이는 기기나 에뮬레이터의 touch mode 기능을 끕니다. 만약 어떤 테스트 메서드가 응용프로그램에 키 이벤트를 보내야 한다면, 어떤 액티비티들을 실행하기 전에 touch mode 모드를 꺼야 합니다. 그렇지 않으면 이 호출은 무시 됩니다.
  • 시스템 오브젝트들의 레퍼런스들을 저장합니다. 테스트 할 액티비티에 대한 참조, 액티비티에 사용되는 Spinner 위젯, 위젯을 지원하는 SpinnerAdapter 및 애플리케이션이 처음 설치되었을 때 설정 한 선택 항목의 문자열 값을 검색하고 저장합니다. 이러한 객체는 상태 관리 테스트에 사용됩니다. 호출 된 메소드는 다음과 같습니다.
    • getActivity(). 테스트 상(SpinnerActivity)의 액티비티에 대한 레퍼런스를 얻습니다. 이 호출로 또한 액티비티가 실행되지 않았으면 실행 시킵니다.
    • findViewById(int). 테스트 상의 응용프로그램의 Spinner 위젯에 대한 레퍼런스를 얻습니다.
    • getAdapter(). 어댑터 를 뒷받침하는 어댑터(배열 혹은 문자열)의 레퍼런스를 얻습니다.

 

생성자 정의 다음에 SpinnerActivityTest 의 정의에 다음 코드를 추가 하십시오.

  @Override
  protected void setUp() throws Exception {
    super.setUp();

    setActivityInitialTouchMode(false);

    mActivity = getActivity();

    mSpinner =
      (Spinner) mActivity.findViewById(
        com.android.example.spinner.R.id.Spinner01
      );

      mPlanetData = mSpinner.getAdapter();

  } // end of setUp() method definition
 

이 멤버변수들을 테스트 케이스 클래스에 추가합니다.

private SpinnerActivity mActivity;
private Spinner mSpinner;
private SpinnerAdapter mPlanetData;
 

import 구문에 다음을 추가합니다.

import android.widget.Spinner;
import android.widget.SpinnerAdapter;
 

이것으로 완전한 setUp() 메서드를 구성 했습니다.

 

초기 조건들 테스트 추가하기

 

초기 조건 테스트는 테스트 상의 응용프로그램이 제대로 초기화 되는 지 검증합니다. 실행 할 수 있는 테스트들의 타입의 예이기 때문에 포괄적이지 않습니다. 이는 다음을 검증합니다.

 

  • 아이템 선택 리스너가 초기화 됩니다. 리스너는 spinner 로부터 값들이 선택 되었을 때 호출 됩니다.
  • adapter 는 spinner의 값을 공급하고 초기화 됩니다.
  • 어댑터는 올바른 엔트리의 숫자를 가집니다.

 

테스트중인 응용 프로그램의 실제 초기화는 setUp ()에서 수행됩니다. setUp ()은 테스트 러너가 전체 테스트를 하기 전에 자동으로 호출합니다. 검증은 JUnit Assert 호출로 수행됩니다. 유용한 명명 규칙의 메소드 이름은 testPreConditions()입니다:

  public void testPreConditions() {
    assertTrue(mSpinner.getOnItemSelectedListener() != null);
    assertTrue(mPlanetData != null);
    assertEquals(mPlanetData.getCount(),ADAPTER_COUNT);
  } // end of testPreConditions() method definition
 

아래 멤버를 추가 합니다.

UI 테스트 추가하기

이제 Spinner 위젯에서 항목을 선택하는 UI 테스트를 생성합니다. 이 테스트는 키 이벤트로 UI 키 이벤트를 보냅니다. 이 테스트는 선택이 예상 한 결과와 일치 함을 확인합니다.

 

이 테스트는 Android 테스트에서 instrumentation사용에 대한 효과를 보여줍니다. instrumentation 기반 테스트 클래스만으로 테스트 중인 애플리케이션에 키 이벤트 (또는 터치 이벤트)를 보낼 수 있습니다. instrumentation을 사용하면 스크린 샷을 찍거나 화면을 기록하거나 수동 조작(human-controlled) ​​테스트를 수행하지 않고도 UI를 테스트 할 수 있습니다.

spinner 를 사용하려면 테스트가 포커스를 요청한 다음 알려진 위치로 설정해야 합니다.

테스트에서는 requestFocus()setSelection()을 사용하여 이 작업을 수행합니다.

이 두 가지 방법 모두 테스트 중인 응용 프로그램의 View와 상호 작용하기 때문에 특별한 방법으로 호출해야 합니다.

테스트중인 응용 프로그램의 View와 상호 작용하는 테스트 응용 프로그램의 코드는 메인 응용 프로그램의 스레드 (UI 스레드라고도 함)에서 실행해야 합니다. 이렇게 하려면 Activity.runOnUiThread() 메서드를 사용합니다. runOnUiThread ()에 코드를 익명의 Runnable 객체로 전달합니다. Runnable 객체에 문장을 설정하려면, 객체의 run() 메소드를 오버라이드 (override)합니다.

테스트 중인 응용 프로그램의 UI에 키 이벤트를 보내려면 sendKeys() 메서드를 사용합니다. 이 메소드는 UI 스레드에서 실행할 필요가 없습니다. Android는 instrumentation을 사용하여 키 이벤트를 테스트 중인 응용프로그램으로 전달하기 때문입니다.

테스트의 마지막 부분은 키 이벤트를 미리 결정된 값으로 전송하여 이루어진 선택을 비교합니다. 이것은 spinner가 의도 한대로 작동하는지 테스트합니다.

 

다음 절은 이 테스트를 위한 코드를 추가 하는 방법입니다.

1. 포커스를 얻고 선택을 설정합니다. 새로운 메서드 public void testSpinnerUI() 를 만듭니다. spinner 에 대한 포커스를 요청하는 코드를 추가하고 기본 또는 초기 위치 인 "Earth"로 위치를 설정합니다. 이 코드는 테스트 중인 응용 프로그램의 UI 스레드에서 실행됩니다.:

  public void testPreConditions() {
    assertTrue(mSpinner.getOnItemSelectedListener() != null);
    assertTrue(mPlanetData != null);
    assertEquals(mPlanetData.getCount(),ADAPTER_COUNT);
  } // end of testPreConditions() method definition
 

아래 멤버를 추가 합니다.

 public static final int ADAPTER_COUNT = 9;
 

 

UI 테스트 추가하기

이제 Spinner 위젯에서 항목을 선택하는 UI 테스트를 생성합니다. 이 테스트는 키 이벤트로 UI 키 이벤트를 보냅니다. 이 테스트는 선택이 예상 한 결과와 일치 함을 확인합니다.

 

이 테스트는 Android 테스트에서 instrumentation사용에 대한 효과를 보여줍니다. instrumentation 기반 테스트 클래스만으로 테스트 중인 애플리케이션에 키 이벤트 (또는 터치 이벤트)를 보낼 수 있습니다. instrumentation을 사용하면 스크린 샷을 찍거나 화면을 기록하거나 수동 조작(human-controlled) ​​테스트를 수행하지 않고도 UI를 테스트 할 수 있습니다.

 

spinner 를 사용하려면 테스트가 포커스를 요청한 다음 알려진 위치로 설정해야 합니다.

테스트에서는 requestFocus() 및 setSelection()을 사용하여 이 작업을 수행합니다.

이 두 가지 방법 모두 테스트 중인 응용 프로그램의 View와 상호 작용하기 때문에 특별한 방법으로 호출해야 합니다.

 

테스트중인 응용 프로그램의 View와 상호 작용하는 테스트 응용 프로그램의 코드는 메인 응용 프로그램의 스레드 (UI 스레드라고도 함)에서 실행해야 합니다. 이렇게 하려면 Activity.runOnUiThread() 메서드를 사용합니다. runOnUiThread ()에 코드를 익명의 Runnable 객체로 전달합니다. Runnable 객체에 문장을 설정하려면, 객체의 run() 메소드를 오버라이드 (override)합니다.

 

테스트 중인 응용 프로그램의 UI에 키 이벤트를 보내려면 sendKeys() 메서드를 사용합니다. 이 메소드는 UI 스레드에서 실행할 필요가 없습니다. Android는 instrumentation을 사용하여 키 이벤트를 테스트 중인 응용프로그램으로 전달하기 때문입니다.

 

테스트의 마지막 부분은 키 이벤트를 미리 결정된 값으로 전송하여 이루어진 선택을 비교합니다. 이것은 spinner가 의도 한대로 작동하는지 테스트합니다.

 

다음 절은 이 테스트를 위한 코드를 추가 하는 방법입니다.

1. 포커스를 얻고 선택을 설정합니다. 새로운 메서드 public void testSpinnerUI() 를 만듭니다. spinner 에 대한 포커스를 요청하는 코드를 추가하고 기본 또는 초기 위치 인 "Earth"로 위치를 설정합니다. 이 코드는 테스트 중인 응용 프로그램의 UI 스레드에서 실행됩니다.:

  public void testSpinnerUI() {

    mActivity.runOnUiThread(
      new Runnable() {
        public void run() {
          mSpinner.requestFocus();
          mSpinner.setSelection(INITIAL_POSITION);
        } // end of run() method definition
      } // end of anonymous Runnable object instantiation
    ); // end of invocation of runOnUiThread
 

테스트 케이스 클래스에 다음 멤버를 추가합니다.

 public static final int INITIAL_POSITION = 0;
 

2. 선택 합니다. spinner 에 키 이벤트를 보내 항목 중 하나를 선택하십시오. 이렇게 하려면 가운데 키패드 버튼을 클릭 (DPAD_CENTER 키 이벤트 보내기) 한 다음 아래쪽 화살표 키패드 버튼을 다섯 번 클릭 (보내기)하여 spinner 를 엽니다. 마지막으로 가운데 키패드 버튼을 다시 클릭하여 원하는 항목을 강조 합니다. 다음 코드를 추가하십시오.

 

    this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
    for (int i = 1; i <= TEST_POSITION; i++) {
      this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    } // end of for loop

    this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
 

테스트케이스 클래스에 다음 멤버를 추가합니다.

public static final int TEST_POSITION = 5;

Spinner의 최종 위치를 "Saturn"으로 설정 합니다(spinner의 백업 어댑터는 0 기반입니다)

 

3. 결과를 확인하십시오. spinner의 현재 상태를 쿼리하고 현재 선택 항목을 예상 값과 비교합니다.

getSelectedItemPosition() 메서드를 호출하여 현재 선택 위치를 찾은 다음getItemAtPosition()을 호출하여 해당 위치에 해당하는 객체를 가져옵니다 (String으로 캐스팅). 이 문자열 값이 "Saturn"의 예상 값과 일치 함을 확인합니다.

    mPos = mSpinner.getSelectedItemPosition();
    mSelection = (String)mSpinner.getItemAtPosition(mPos);
    TextView resultView =
      (TextView) mActivity.findViewById(
        com.android.example.spinner.R.id.SpinnerResult
      );

    String resultText = (String) resultView.getText();

    assertEquals(resultText,mSelection);

  } // end of testSpinnerUI() method definition
 

테스트 케이스 클래스에 다음 멤버를 추가 합니다.

private String mSelection;
private int mPos;
 

테스트 케이스 클래스에 다음 import 구문을 추가 합니다.

  import android.view.KeyEvent;
  import android.widget.TextView;
 

테스트들을 수행 하기 위해서 여기서 일시 중지 합니다. 테스트 응용프로그램을 실행하는 절차는 일반 Android 애플리케이션을 실행하는 절차와 다릅니다. 테스트 애플리케이션을 Android JUnit 애플리케이션으로 실행합니다. 이를 수행하는 방법은 테스트 실행 및 결과보기(Running the Tests and Seeing the Results)를 참조하십시오.

 

결국 SpinnerActivity 응용 프로그램이 시작되고 키 이벤트를 보내서 응용 프로그램을 제어하는 ​​테스트 응용 프로그램이 표시됩니다. 탐색기 창에 새 JUnit보기가 표시되어 테스트 결과가 표시됩니다. JUnit 뷰는 테스트 실행 및 결과 보기(Running the Test and Seeing the Results) 섹션에 설명되어 있습니다.

 

상태 관리 테스트 추가하기

 

이제 SpinnerActivity가 일시 중지되거나 종료 될 때 상태를 유지하는지 확인하는 두 가지 테스트를 작성합니다. 이 경우 상태는 spinner 에서 현재 선택된 것입니다. 사용자가 응용 프로그램을 선택하거나 일시 중지하거나 종료 한 다음 resume 하거나 restart 하면 동일한 선택 항목이 표시됩니다.

 

상태 유지는 응용 프로그램의 중요한 기능입니다. 사용자는 현재 응용프로그램에서 일시적으로 전화 응답으로 전환 한 다음 다시 되돌아 올 수 있습니다. Android는 화면 방향을 변경하기 위해 Activity을 종료하고 다시 시작하거나 사용하지 않은 Activity을 종료하여 저장 공간을 다시 얻어 올 수 있습니다. 각각의 경우 사용자는 UI가 이전 상태로 돌아가도록하는 것이 가장 좋습니다 (응용 프로그램 로직으로 달리 명시된 경우는 제외).

 

SpinnerActivity는 자신의 상태를 다음과 같은 방식으로 관리 합니다:

 

  • Acitivity는 숨겨집니다. spinner 화면 (활동)이 실행 중이지만 다른 화면에 의해 숨겨지면 응용 프로그램이 실행되는 동안 영속성을 가진 형식으로 spinner의 위치와 값을 저장합니다.
  • 응용프로그램이 종료됩니다. 액티비티가 종료되면 스피너의 위치와 값이 영구적인 형식으로 저장됩니다. 액티비티는 다시 시작할 때 위치와 값을 읽고 스피너를 이전 상태로 복원합니다.
  • 액티비티가 다시 나타납니다. 사용자가 스피너 화면으로 돌아 가면 이전 선택 값이 복원됩니다.
  • 응용프로그램이 재 시작 됩니다. 사용자가 응용프로그램을 다시 시작할 때, 이전 선택 값은 재저장 됩니다.
 
참고: 응용프로그램은 다른 방식으로 자신의 상태를 관리 할 수도 있습니다 하지만 이 자습서에서는 다루지 않습니다.

액티비티가 숨겨지면 액티비티가 일시 중지됩니다. 다시 나타나면 다시 시작됩니다. 이것들이 액티비티의 라이프 사이클에서 중요한 포인트라는 것을 인식하고 있다면, 액티비티 클래스는 일시 중지와 재 시작를 위한 두 가지 콜백 메소드 onPause()와 onResume()을 제공합니다. SpinnerActivity는 상태를 저장하고 복원하는 것에 이 코드를 사용합니다.

 

참고: 포커스/일시중지 그리고 응용프로그램 중지 간의 차이점에 대해서 좀 더 알고 싶다면, activity lifecycle를 읽어 보십시오.

 

첫 번째 테스트에서는 전체 응용 프로그램이 종료 된 다음 다시 시작된 후 스피너 선택이 유지되는지 확인합니다. 이 테스트에서는 instrumentation 을 사용하여 스피너 변수를 UI 외부에 설정합니다. 그런 다음 Activity.finish(),를 호출하여 액티비티를 종료하고 instrumentation 메서드 getActivity()를 사용하여 액티비티를 다시 시작합니다. 그런 다음 테스트는 현재 스피터의 상태가 테스트 값과 일치 하는 지 assert를 사용합니다.

 

두 번째 테스트에서는 액티비티가 일시 중지 된 후 다시 시작된 후에 스피너 선택이 유지되는지 확인합니다. 테스트에서는 instrumentation을 사용하여 UI 외부에서 스피너의 변수를 설정 한 다음 onPause() 및 onResume() 메서드를 강제 호출합니다. 그런 다음 테스트는 현재 스피터의 상태가 테스트 값과 일치 하는 지 assert를 사용합니다.

 

이 테스트는 액티비티가 상태를 관리하는 메커니즘에 대해 제한된 상황을 가정 합니다. 테스트에서는 액티비티의 getter 및 setter를 사용하여 스피너를 제어합니다. 첫 번째 테스트에서는 액티비티를 숨기면 onPause()를 호출하고 포어 그라운드으로 다시 가져 오는 것은 onResume()을 호출한다는 것도 알 수 있습니다. 이 외에도 테스트는 활동을 "블랙 박스"로 간주합니다.

 

종료와 재 시작을 통한 상태 관리 테스트를 위한 코드를 추가하는 다음 단계들을 수행 합니다.

1. 테스트 메서드 testStateDestroy()를 추가하고, 스피너 선택을 테스트 값으로 설정 합니다:

  public void testStateDestroy() {
    mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION);
    mActivity.setSpinnerSelection(TEST_STATE_DESTROY_SELECTION);
 

2. 액티비티를 종료하고 재 시작 합니다.:

    mActivity.finish();
    mActivity = this.getActivity();
 

3. 액티비티로부터 현재 스피너 설정들을 얻습니다.:

    int currentPosition = mActivity.getSpinnerPosition();
    String currentSelection = mActivity.getSpinnerSelection();
 

4. 테스트 값들과 현재 설정 값들을 비교 테스트 합니다.:

    assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);
    assertEquals(TEST_STATE_DESTROY_SELECTION, currentSelection);
  } // end of testStateDestroy() method definition
 

테스트 케이스 클래스에 다음 멤버들을 추가 합니다.:

  public static final int TEST_STATE_DESTROY_POSITION = 2;
  public static final String TEST_STATE_DESTROY_SELECTION = "Earth";
 

일시중지와 재시작 관련한 상태 관리 테스트를 위해 다음 코드를 추가 하기 위한 단계를 수행 합니다.

 

1. 테스트 메서드 testStatePause()를 추가합니다.:

    @UiThreadTest
    public void testStatePause() {
 

@UiThreadTest 어노테이션은 UI 스레드에서 실행되도록이 메소드를 빌드하도록 Android에 지시합니다. 이렇게 하면 메소드가 테스트중인 애플리케이션에서 스피너 위젯의 상태를 변경할 수 있습니다. @UiThreadTest를 사용하면 필요한 경우 UI 스레드에서 전체 메서드를 실행할 수 있음을 알 수 있습니다.

 

2. instrumentation 을 설정합니다. 테스트 대상의 어플리케이션을 제어하고있는 instrumentation 오브젝트를 얻습니다. 나중에 onPause () 및 onResume () 메서드를 호출하는 데 사용됩니다.:

 Instrumentation mInstr = this.getInstrumentation();
 

 

3. 테스트 값을 스피너에서 선택 하여 설정 합니다.

mActivity.setSpinnerPosition(TEST_STATE_PAUSE_POSITION);
mActivity.setSpinnerSelection(TEST_STATE_PAUSE_SELECTION);
 

4. 액티비티의 onPause()메서드를 호출하기 위해 instrumentation를 사용합니다.:

mInstr.callActivityOnPause(mActivity);
 

테스트중인 액티비티는 입력 대기 중입니다. callActivityOnPause(android.app.Activity) 호출은 액티비티의 UI를 조작하는 대신 일시 중지 상태로 강제로 호출하여 해당 액티비티의 onPause ()에 대한 호출을 직접 수행합니다.

 

5. 스피너를 서로 다르게 선택 하도록 강제 합니다.:

    mActivity.setSpinnerPosition(0);
    mActivity.setSpinnerSelection("");
 

이렇게하면 액티비티를 다시 시작하면 단순히 회 전자 상태를 그대로두기보다는 스피너의 상태를 복원 할 수 있습니다.

 

6. 액티비티의 onResume()메서드를 호출 하기 위해서 instrumentation를 사용합니다.

mInstr.callActivityOnResume(mActivity);
 

callActivityOnResume(android.app.Activity)호출은 callActivityOnPause 와 비슷한 방식으로 액티비티에 영향을 줍니다. 액티비티의 UI를 조작하지 않고 액티비티의 onResume() 메소드를 호출하여 강제로 다시 시작합니다.

 

7. 스피너의 현재 상태를 얻어 냅니다.:

int currentPosition = mActivity.getSpinnerPosition();
String currentSelection = mActivity.getSpinnerSelection();
 

8. 테스트 값에 대한 현재 스피너 상태를 테스트 합니다.:

assertEquals(TEST_STATE_PAUSE_POSITION,currentPosition);
assertEquals(TEST_STATE_PAUSE_SELECTION,currentSelection);
} // end of testStatePause() method definition
 

테스트 케이스 클래스에 다음 멤버를 추가 합니다.:

public static final int TEST_STATE_PAUSE_POSITION = 4;
public static final String TEST_STATE_PAUSE_SELECTION = "Jupiter";
 

9. 다음 import를 추가 합니다.:

import android.app.Instrumentation;
import android.test.UiThreadTest;
 

테스트 수행 및 결과 보기


SpinnerActivityTest 테스트 케이스를 실행하는 가장 간단한 방법은 Package Explorer 에서 직접 실행 하는 것입니다.

SpinnerActivityTest 테스트를 실행하기 위해서, 다음 단계를 진행 합니다.:

1. Package Explorer 에서 SpinnerActivityTest 프로젝트 최상위에서 오른쪽 마우스 클릭하고, Run As > Android JUnit Test 를 선택합니다.

 

2. 에뮬레이터가 시작 될 것입니다. Unlock 옵션이 표시되면, (AVD에 명시한 API 레벨에 따라 형태는 틀립니다). 홈 스크린을 unlock 합니다.

3. 테스트 응용프로그램이 시작 됩니다. Package Explorer 탭 다음에 새로운 탭에 JUnit 뷰를 볼수 있습니다.

뷰는 두개의 하부 패널을 가집니다. 상위 패널에는 실행 된 테스트들의 요약이 표시되고, 하루 패널에는 강조된 테스트에 대한 실패 추적 상황이 표시 됩니다.

 
대표사진 삭제

사진 설명을 입력하세요.

성공적 테스트가 실행 된 결과의 view 형태는 아래와 같습니다.:

 
대표사진 삭제

사진 설명을 입력하세요.

상위 패널에 테스트의 요약이 표시 됩니다.:

  • 테스트 응용프로그램의 총 경과 시간 Finished after <x> seconds 로 라벨 표시)
  • 실행 개수(Runs) – 총테스트 클래스를 테스트 한 수.
  • 에러 개수(Errors): 테스트를 수행 하는 동안 만나게되는 프로그램 에러들과 예외들의 수.
  • 실패 수(Failures): 테스트 실행 동안 테스트 실패의 수. 테스트는 프로그램이 에러가 아니라도 실패 할 수 있음.
  • 테스트들이 실행되면서 상태진행 바는 왼쪽에서 오른쪽으로 진행.

모든 테스트들이 성공하면, 바는 초록색으로 남고, 테스트가 실해 하면 바는 초록색에서 빨간색으로 변경 됨

  • 테스트 방법 요약. 막대 아래에 테스트 응용 프로그램의 각 클래스에 대한 행이 표시됩니다. 테스트에서 개별 메소드의 결과를 보려면 왼쪽의 화살표를 클릭하여 선을 확장합니다.

 

각 테스트 메소드의 이름이 표시됩니다. 이름 오른쪽에는 테스트에 소요 된 시간이 표시됩니다. 이름을 두 번 클릭하여 테스트 코드를 볼 수 있습니다.

 

아래쪽 창에는 오류 추적이 있습니다. 모든 테스트에 성공하면 이 창은 비어 있습니다. 일부 검사가 실패하면 상단 창에서 실패한 검사를 강조 표시하면 하단 보기에 검사에 대한 스택 추적이 포함됩니다. 이것은 다음 절에서 설명됩니다.

 
참고 : 테스트 응용 프로그램을 실행했지만 아무 것도 보이지 않는 경우 JUnit보기를 찾습니다. 표시되지 않으면 테스트 응용 프로그램을 일반 Android 응용 프로그램으로 실행할 수 있습니다. Android JUnit 애플리케이션으로 실행해야 함을 기억하십시오.

 

몇 몇 테스트들을 실패로 지정하는 법


SpinnerActivityTest 테스트 케이스를 실행하는 가장 간단한 방법은 Package Explorer 에서 직접 실행 하는 것입니다.

SpinnerActivityTest 테스트를 실행하기 위해서, 다음 단계를 진행 합니다.:

1. Package Explorer 에서 SpinnerActivityTest 프로젝트 최상위에서 오른쪽 마우스 클릭하고, Run As > Android JUnit Test 를 선택합니다.

 
대표사진 삭제

사진 설명을 입력하세요.

2. 에뮬레이터가 시작 될 것입니다. Unlock 옵션이 표시되면, (AVD에 명시한 API 레벨에 따라 형태는 틀립니다). 홈 스크린을 unlock 합니다.

3. 테스트 응용프로그램이 시작 됩니다. Package Explorer 탭 다음에 새로운 탭에 JUnit 뷰를 볼수 있습니다.

뷰는 두개의 하부 패널을 가집니다. 상위 패널에는 실행 된 테스트들의 요약이 표시되고, 하루 패널에는 강조된 테스트에 대한 실패 추적 상황이 표시 됩니다.

 
대표사진 삭제

사진 설명을 입력하세요.

성공적 테스트가 실행 된 결과의 view 형태는 아래와 같습니다.:

 
대표사진 삭제

사진 설명을 입력하세요.

상위 패널에 테스트의 요약이 표시 됩니다.:

  • 테스트 응용프로그램의 총 경과 시간 Finished after <x> seconds 로 라벨 표시)
  • 실행 개수(Runs) – 총테스트 클래스를 테스트 한 수.
  • 에러 개수(Errors): 테스트를 수행 하는 동안 만나게되는 프로그램 에러들과 예외들의 수.
  • 실패 수(Failures): 테스트 실행 동안 테스트 실패의 수. 테스트는 프로그램이 에러가 아니라도 실패 할 수 있음.
  • 테스트들이 실행되면서 상태진행 바는 왼쪽에서 오른쪽으로 진행.

모든 테스트들이 성공하면, 바는 초록색으로 남고, 테스트가 실해 하면 바는 초록색에서 빨간색으로 변경 됨

  • 테스트 방법 요약. 막대 아래에 테스트 응용 프로그램의 각 클래스에 대한 행이 표시됩니다. 테스트에서 개별 메소드의 결과를 보려면 왼쪽의 화살표를 클릭하여 선을 확장합니다.

각 테스트 메소드의 이름이 표시됩니다. 이름 오른쪽에는 테스트에 소요 된 시간이 표시됩니다. 이름을 두 번 클릭하여 테스트 코드를 볼 수 있습니다.

 

아래쪽 창에는 오류 추적이 있습니다. 모든 테스트에 성공하면 이 창은 비어 있습니다. 일부 검사가 실패하면 상단 창에서 실패한 검사를 강조 표시하면 하단 보기에 검사에 대한 스택 추적이 포함됩니다. 이것은 다음 절에서 설명됩니다.

 
참고 : 테스트 응용 프로그램을 실행했지만 아무 것도 보이지 않는 경우 JUnit보기를 찾습니다. 표시되지 않으면 테스트 응용 프로그램을 일반 Android 응용 프로그램으로 실행할 수 있습니다. Android JUnit 애플리케이션으로 실행해야 함을 기억하십시오.

 

몇 몇 테스트들을 실패로 지정하는 법


SpinnerActivityTest 테스트 케이스를 실행하는 가장 간단한 방법은 Package Explorer 에서 직접 실행 하는 것입니다.

SpinnerActivityTest 테스트를 실행하기 위해서, 다음 단계를 진행 합니다.:

1. Package Explorer 에서 SpinnerActivityTest 프로젝트 최상위에서 오른쪽 마우스 클릭하고, Run As > Android JUnit Test 를 선택합니다.

 

2. 에뮬레이터가 시작 될 것입니다. Unlock 옵션이 표시되면, (AVD에 명시한 API 레벨에 따라 형태는 틀립니다). 홈 스크린을 unlock 합니다.

3. 테스트 응용프로그램이 시작 됩니다. Package Explorer 탭 다음에 새로운 탭에 JUnit 뷰를 볼수 있습니다.

뷰는 두개의 하부 패널을 가집니다. 상위 패널에는 실행 된 테스트들의 요약이 표시되고, 하루 패널에는 강조된 테스트에 대한 실패 추적 상황이 표시 됩니다.

 
대표사진 삭제

사진 설명을 입력하세요.

성공적 테스트가 실행 된 결과의 view 형태는 아래와 같습니다.:

 
대표사진 삭제

사진 설명을 입력하세요.

상위 패널에 테스트의 요약이 표시 됩니다.:

  • 테스트 응용프로그램의 총 경과 시간 Finished after <x> seconds 로 라벨 표시)
  • 실행 개수(Runs) – 총테스트 클래스를 테스트 한 수.
  • 에러 개수(Errors): 테스트를 수행 하는 동안 만나게되는 프로그램 에러들과 예외들의 수.
  • 실패 수(Failures): 테스트 실행 동안 테스트 실패의 수. 테스트는 프로그램이 에러가 아니라도 실패 할 수 있음.
  • 테스트들이 실행되면서 상태진행 바는 왼쪽에서 오른쪽으로 진행.

모든 테스트들이 성공하면, 바는 초록색으로 남고, 테스트가 실해 하면 바는 초록색에서 빨간색으로 변경 됨

  • 테스트 방법 요약. 막대 아래에 테스트 응용 프로그램의 각 클래스에 대한 행이 표시됩니다. 테스트에서 개별 메소드의 결과를 보려면 왼쪽의 화살표를 클릭하여 선을 확장합니다.

 

각 테스트 메소드의 이름이 표시됩니다. 이름 오른쪽에는 테스트에 소요 된 시간이 표시됩니다. 이름을 두 번 클릭하여 테스트 코드를 볼 수 있습니다.

 

아래쪽 창에는 오류 추적이 있습니다. 모든 테스트에 성공하면 이 창은 비어 있습니다. 일부 검사가 실패하면 상단 창에서 실패한 검사를 강조 표시하면 하단 보기에 검사에 대한 스택 추적이 포함됩니다. 이것은 다음 절에서 설명됩니다.

 

참고 : 테스트 응용 프로그램을 실행했지만 아무 것도 보이지 않는 경우 JUnit보기를 찾습니다. 표시되지 않으면 테스트 응용 프로그램을 일반 Android 응용 프로그램으로 실행할 수 있습니다. Android JUnit 애플리케이션으로 실행해야 함을 기억하십시오.

 

몇 몇 테스트들을 실패로 지정하는 법


테스트는 성공할 때와 마찬가지로 실패 할 때 유용합니다. 이 섹션에서는 테스트가 실패 할 때 ADT로 Eclipse에서 발생하는 상황을 보여줍니다. 테스트 클래스가 실패했는지 빠르게 확인하고 실패한 메소드를 찾은 다음 실패 추적을 사용하여 정확한 문제점을 찾을 수 있습니다.

 

다운로드 한 예제 응용 프로그램 SpinnerActivity는 테스트 응용 프로그램 SpinnerActivityTest의 모든 테스트를 통과합니다. 테스트가 실패하게 하려면 예제 응용 프로그램을 수정해야합니다. 테스트 중인 응용 프로그램에서 setup 코드 행을 변경합니다. 이로 인해 testPreConditions () 및 testTextView () 테스트 메소드가 실패합니다.

 

테스트들을 강제로 실패하게 만드는 것은 다음 단계로 진행 합니다.

 

1. Eclipse ADT 에서 SpinnerActivity프로젝트로 가서 SpinnerActivity.java 파일을 엽니다.

2. SpinnerActivity.java 파일 onCreate() 마지막 부분 상단에서, 다음 줄을 찾습니다.

 
// mySpinner.setOnItemSelectedListener(null);

 

행의 시작 부분에서 슬래시 문자를 제거하여 행의 주석을 해제하십시오. 이 행은 리스너 콜백을 null로 설정합니다.:

mySpinner.setOnItemSelectedListener(null);

 

3. SpinnerActivityTest 의 testPreConditions () 메소드에는 다음 테스트가 포함되어 있습니다. assertTrue(mSpinner.getOnItemSelectedListener() != null);. 이 테스트는 리스너 콜백이 null이 아닌지에 대한 assert 입니다. 테스트중 인 애플리케이션을 수정 했으므로 이제이 assert 문은 실패합니다.

 

4. 이전 절, 테스트 실행 및 결과보기(Running the Tests and Seeing the Results)에서 설명한대로 테스트를 실행합니다.

JUnit 뷰는 테스트 결과로 생성되거나 업데이트됩니다. 그러나 진행률 표시 줄은 빨간색으로 표시되고 실패 횟수는 2이며 작은 "x"아이콘이 testPreConditions 및 TestSpinnerUI 테스트 옆에 있는 목록 아이콘에 나타납니다. 이것은 테스트가 실패했음을 나타냅니다. 디스플레이는 다음과 유사합니다.

 
대표사진 삭제

사진 설명을 입력하세요.

 

이제 어디서 이 실패가 일어났는 지에 대해서 알고 싶어 할 것입니다.

 

이 실패에 대한 검증을 위해서 다음의 단계들을 수행 합니다.:

 

1. testPreconditions 엔트리를 클릭합니다. Failure Trace,라 명명 된 하단 패널내에서, 실패를 일으킨 호출에 대한 스택 추적 값을 확인 합니다. 이 추적 값은 다음 스크린 샷과 유사 합니다.

2. 추적의 첫 번째 행은 오류를 알려줍니다. 이 경우 JUnit assertion이 실패했습니다. 테스트 코드에서 assertion을 보려면 다음 줄 (추적의 첫 번째 줄)을 두 번 클릭하십시오. 가운데 창에는 테스트 응용 프로그램 SpinnerActivityTest 에 대한 코드가 포함 된 새로운 탭 창이 열립니다. 실패한 assertion 은 창 가운데에서 강조 표시됩니다.

 

 
대표사진 삭제

사진 설명을 입력하세요.

메인 응용 프로그램을 수정하여 getOnItemSelectedListener 콜백을 null로 설정 했으므로 assertion 이 실패했습니다.

 

원한다면 testTextView 에서 실패를 볼 수 있습니다. 하지만 testPreConditions 는 테스트중인 응용 프로그램의 초기 설정을 확인하기위한 것입니다. testPreConditions ()가 실패하면 후속 테스트를 신뢰할 수 없습니다. 선택해야 할 좋은 전략은 문제를 수정하고 모든 테스트를 다시 실행하는 것입니다.

 

SpinnerActivity.java 로 되돌아가야 하는 것을 잊지 마십시오 그리고 이전 단계에서 주석 해제 한 줄을 다시 주석 처리 해 줍니다.

 

이제 이 자습서의 내용이 끝났습니다.

 

 

 

다음 단계


이 예제 테스트 응용 프로그램에서는 테스트 프로젝트를 만들고 이를 테스트 할 응용 프로그램에 연결하는 방법, 테스트 케이스 클래스를 선택하고 추가하는 방법, UI 및 상태 관리 테스트를 작성하는 방법 및 테스트를 실행하는 방법을 알아보았습니다. 테스트 중인 애플리케이션 이제 Android 애플리케이션 테스트의 기본 사항에 익숙해 졌으므로 다음 단계를 참조하십시오:

 

안드로이드 상에 테스트에 대해서 더 알고 싶다면

· 아직 테스트를 작성하지 않았다면, 개발 가이드의 테스트 기본 사항 문서(Testing Fundamentals)를 읽으십시오. 이 가이드는 Android에서의 테스트 작동 방식에 대한 개요를 제공합니다. Android 테스트를 처음 시작하는 경우 해당 문서를 읽으면 사용 가능한 도구를 이해하는 데 도움이 되므로 효과적인 테스트를 개발할 수 있습니다.

 

메인 안드로이드 테스트 케이스 클래스들의 리뷰

· ActivityInstrumentationTestCase2

· ActivityUnitTestCase

· ProviderTestCase2

· ServiceTestCase

assert와 유틸리티 클래스들에 대해서 더 배워 봅시다.

· Assert, the JUnit Assert class. 클래스

· MoreAsserts, additional Android assert methods. 추가 안드로이드 메서드들

· ViewAsserts, useful assertion methods for testing Views. 테스트 뷰들을 위한 유용한 메서드들

· TouchUtils, 액티비티의 터치 이벤트를 시뮬레이션 하기 위한 유틸리티 메서드들

Learn about instrumentation and the instrumented test runner

· Instrumentation, the base instrumentation class.

· InstrumentationTestCase, the base instrumentation test case.

· InstrumentationTestRunner, the standard Android test runner.

 

 

 

부록


완전한 테스트 애플리케이션 파일 설치 하기

 

이 자습서의 권장 방법은 지침을 단계별로 따르고 테스트 코드를 작성하는 것입니다. 그러나이 자습서를 빨리 ​​수행하려면 테스트 응용 프로그램의 전체 파일을 테스트 프로젝트에 설치할 수 있습니다.

 

이렇게 하려면 먼저 Eclipse에서 자동화 된 도구를 사용하여 필요한 구조와 파일을 사용하여 테스트 프로젝트를 작성하십시오. 그런 다음 Eclipse를 종료하고 테스트 응용 프로그램의 파일을 SpinnerTest 샘플 프로젝트에서 테스트 프로젝트로 복사합니다. SpinnerTest 샘플 프로젝트는 SDK 샘플 구성 요소의 일부입니다.

 

결과는 Spinner 샘플 응용 프로그램에 대해 실행할 준비가 된 완전한 테스트 응용 프로그램입니다.

 

테스트 응용프로그램을 설치하기 위한 단계는 다음과 같습니다.:

  1. 테스트 상의 응용프로그램을 위한 프로젝트 설정은 Setting Up the Projects섹션에서 설명 하였습니다.
  2. 에뮬레이터에 대한 설정은 Setting Up the Emulator섹션에서 설명 하였습니다.
  3. 테스트 케이스 클래스 추가 관령은 에서 section Adding the test case class file설명 하였습니다.
  4. Eclipse ADT 닫습니다.
  5. <SDK_path>/samples/android-8/SpinnerTest/src/com/android/example/spinner/test/SpinnerActivityTest.java 파일을
  6. <SDK_path>/samples/android-/SpinnerTest/src/com/android/example/spinner/test/SpinnerActivityTest.java 로 옮겨 줍니다.
  7. Eclipse ADT 재 실행 합니다.
  8. Eclipse ADT 를 사용해서 Package Explorer내의 SpinnerActivityTest 를 선택하고 Project > Clean를 선택하여 재 빌드를 합니다.
  9. 완전히 실행 되는 테스트 응용프로그램은 이제 SpinnerActivityTest 프로젝트에 있습니다.

 

자습서를 시작할 준비가 되었으므로 Adding the test case constructor 섹션을 시작하여 그 다음 단계들을 읽어 보면서 진행 합니다.

 

이클립스 개발자가 아닌 사용자을 위한 방법

 

Eclipse로 개발하고 있지 않더라도, 여전히 이 자습서로 진행 할 수 있습니다. Android는 코드 편집기와 명령 줄 도구를 사용하여 테스트 응용 프로그램을 만드는 도구를 제공합니다. 다음 도구를 사용하십시오.:

 

  • adb - 응용 프로그램을 설치 및 설치 제거하고 응용 프로그램을 장치 또는 에뮬레이터에 테스트합니다. 또한이 도구를 사용하여 명령 행에서 테스트 응용 프로그램을 실행합니다.
  • android -프로젝트를 관리하고 프로젝트를 테스트합니다. 이 도구는 또한 AVD 및 Android 플랫폼을 관리합니다.

 

명령 행에서 에뮬레이터를 실행하기 위해서 emulator 툴을 사용하십시오

 

다음은 편집기와 명령 줄을 사용하여 이 자습서를 수행하는 일반적인 단계입니다.:

 

1. 자습서 샘플 코드 설치 (Installing the Tutorial Sample Code) 절에서 설명한대로 샘플 코드를 얻습니다. 그러면 Spinner 및 SpinnerTest 디렉토리가 포함 된 <SDK_path>/samples/android-8 디렉토리를 갖게 될 것입니다.:

 

Spinner는 application under test 이라고 하는 메인 응용 프로그램을 포함합니다. 이 자습서는 이미 존재하는 애플리케이션에 대한 테스트 작성의 일반적인 상황에 초점을 맞추기 때문에 메인 애플리케이션이 제공됩니다.

o SpinnerTest는 테스트 응용 프로그램의 모든 코드를 포함합니다. 이 자습서를 빨리 ​​실행하려면 테스트 코드를 설치 한 다음 텍스트를 따라 가십시오. 그러나 코드를 작성하는 경우 자습서에서 더 많은 정보를 얻을 수 있습니다. 테스트 코드 설치에 대한 지시 사항은 Appendix: Installing the Completed Test Application File 절에 나와 있습니다.

 

2. <SDK_path>/samples/android-8 디렉토리로 이동합니다.

3. android create project 명령을 사용해서 새로운 안드로이드 프로젝트를 생성합니다.

$ android create project -t <APItarget> -k com.android.example.spinner -a SpinnerActivity -n SpinnerActivity -p Spinner
 

<APItarget>의 값은 "3"(API 레벨 3) 이상이어야 합니다. 이미 특정 API 레벨로 개발 중이며 3보다 높은 경우 해당 API 레벨을 사용하십시오.

이 새로운 안드로이드 프로젝트 SpinnerActivity는 기존 Spinner 디렉토리에 있습니다. 기존 소스 및 리소스 파일은 변경되지 않지만 android 도구는 필요한 빌드 파일을 추가합니다.

 

4. android create test-project 명령을 사용해서 새로운 안드로이드 테스트 프로젝트를 생성합니다.:

$ android create test-project -m ../Spinner -n SpinnerActivityTest -p SpinnerActivityTest
 

이렇게하면 SpinnerActivityTest라는 새 디렉토리에 새로운 Android 테스트 프로젝트가 만들어집니다. 이렇게 하면 SpinnerTest에있는 자습서의 솔루션을 그대로 둡니다. 자습서를 읽어가는 동안 솔루션 코드를 입력하는 대신 솔루션 코드를 사용하려면 Appendix: Installing the Completed Test Application File 절을 참조하십시오.

 

Note: android create test-project 명령은 알맞은 <instrumentation> 엘리먼트를 가진 AndroidManifest.xml 파일을 자동으로 생성 할 것입니다.

 

5. 샘플 응용 프로그램을 빌드하십시오. Ant로 빌드하는 경우 SDK에 디버그 서명 키가 있으므로 ant 디버그 명령을 사용하여 디버그 버전을 만드는 것이 가장 쉽습니다. 결과는 Spinner/bin/SpinnerActivity-debug.apk 파일이 됩니다. 이 장치를 장치 또는 에뮬레이터에 설치할 수 있습니다. 아직 장치를 연결하지 않았으면 에뮬레이터를 시작하고 다음 명령을 실행하십시오.

$ adb install Spinner/bin/SpinnerActivity-debug.apk
 

6. 테스트 응용프로그램을 생성하기 위해서 SpinnerActivityTest/src/com/android/example/spinner/test/ 디렉토리 내에 SpinnerActivityTest.java 파일을 생성하십시오.

 

7. 자습서에 따라서, Creating the Test Case Class절로 시작 합니다. 샘플 응용 프로그램을 실행하라는 메시지가 표시되면 장치 또는 에뮬레이터의 실행기 화면으로 이동하여 SpinnerActivity를 선택하십시오. 테스트 응용 프로그램을 실행하라는 메시지가 표시되면 여기로 돌아와 다음 지시 사항을 계속 진행하십시오.

 

8. 테스트 응용 프로그램을 빌드하십시오. Ant로 빌드하는 경우 SDK에 디버그 서명 키가 있으므로 ant 디버그 명령을 사용하여 디버그 버전을 만드는 것이 가장 쉽습니다. 결과는 Android 파일 SpinnerActivityTest/bin/SpinnerActivityTest-debug.apk 가됩니다. 이 장치를 장치 또는 에뮬레이터에 설치할 수 있습니다. 아직 장치를 연결하지 않았으면 에뮬레이터를 시작하고 다음 명령을 실행하십시오.:

$ adb install SpinnerActivityTest/bin/SpinnerActivityTest-debug.apk
 

9. 장치 또는 에뮬레이터에서 메인 응용 프로그램 SpinnerActivityTest와 테스트 응용 프로그램 SpinnerActivityTest가 모두 설치되어 있는지 확인합니다.

 

10. 테스트 애플리케이션을 실행하기 위해서 다음 명령어를 입력합니다.:

$ adb shell am instrument -w com.android.example.spinner.test/android.test.InstrumentationTestRunner
 

성공적으로 테스트 된 결과의 모습은 다음과 같습니다.

com.android.example.spinner.test.SpinnerActivityTest:....
Test results for InstrumentationTestRunner=....
Time: 10.098
OK (4 tests)
 

강제적으로 실패를 일으킬 경우 앞선 절인 Forcing Some Tests to Fail 에 설명 되어 있으며, 결과는 다음과 같습니다.:

com.android.example.spinner.test.SpinnerActivityTest:
Failure in testPreConditions:
junit.framework.AssertionFailedError
  at com.android.example.spinner.test.SpinnerActivityTest.testPreConditions(SpinnerActivityTest.java:104)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:205)
  at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:195)
  at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:175)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
Failure in testSpinnerUI:
junit.framework.ComparisonFailure: expected:<Result> but was:<Saturn>
  at com.android.example.spinner.test.SpinnerActivityTest.testSpinnerUI(SpinnerActivityTest.java:153)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:205)
  at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:195)
  at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:175)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
..
Test results for InstrumentationTestRunner=.F.F..
Time: 9.377
FAILURES!!!
Tests run: 4,  Failures: 2,  Errors: 0
 

 

이상.


 

728x90