Activity 테스트
이 문서는 Instrumentation과 다른 테스트 도구를 사용하여 자동화 테스트를 하는 방법을 설명합니다.그것을 읽기 전에 안드로이드 테스트의 기초를 읽어야 한다. 안드로이드 자동화 테스트와 Instrumentation 프레임워크가 무엇인지 소개한다.
Activity 테스트 API 소개
Activity 테스트의 기본 클래스는 InstrumentationTestCase입니다. Activity 테스트에 사용되는 몇 가지 클래스에 Instrumentation 지원을 제공합니다.
Activity 테스트에서 기본 클래스는 다음 세 가지 기능을 제공합니다.
Activity 테스트 클래스는TestCase와 Assert를 계승하여 JUnit 테스트 프레임워크를 실현하였으며, 테스트 과정에서 사용할 수 있습니다.
두 가지 주요 테스트 하위 클래스는ActivityInstrumentationTestCase2와ActivityUnitTestCase입니다. 그러나Activity
launchMode
가 비standard
속성으로 설정되었을 때SingleLaunchActivityTestCase를 사용해야 합니다.ActivityInstrumentationTestCase2
이 클래스는 같은 응용 프로그램의 여러 개의Activity를 테스트할 수 있으며 정상적인 응용 실례 환경과 Context를 가지고 정상적인 시스템 구조(파일, 데이터베이스 등)를 접할 수 있다.Activity에 위장된 Intent를 보내서 프로그램이 받은 각종 Intent를 정확하게 처리했는지 테스트할 수 있습니다.주의: 이 클래스에서는 위선적인 Context와 위선적인 Application을 사용할 수 없기 때문에 시스템 환경에서 테스트를 독립할 수 없습니다.
ActivityUnitTestCase
이 클래스는 단일 Activity를 테스트하는 데 사용됩니다.이것은 독립된 테스트 환경에서 실행할 수 있으며,Activity를 시작하기 전에 Context나 Application을 설정해서 아날로그 환경을 실현할 수 있습니다.시스템, 파일 등에 실제적인 영향을 주지 않고 가상 환경에서 프로그램을 테스트할 수 있다.이 테스트 클래스에서는 테스트 중인 Activity에 Intent를 보낼 수 없지만, Activity를 시작할 때
Activity.startActivity(Intent)
호출해서 받은 파라미터를 볼 수 있습니다.SingleLaunchActivityTestCase
이 클래스는 단일 Activity를 테스트하는 데 매우 편리하게 사용할 수 있다.한 번
setUp()
과 tearDown()
만 호출할 수 있기 때문에 이 실례의 모든 테스트 방법은 테스트 환경을 공유합니다.이 클래스에서는 위조 Object에 가입할 수 없습니다.이 클래스는Activity
launchMode
속성을 테스트할 때standard
가 매우 유용하지 않습니다. 테스트 환경이 변하지 않도록 보장하기 때문에Activity가 여러 번 반복 호출에 대한 정확한 대응을 하는지 테스트할 수 있습니다.Activity의 위조 Object 사용
이 부분은 안드로이드 테스트에서
android.test.mock
패키지에 정의된 일련의 위조 Object를 어떻게 사용하는지 알려 드리는 것입니다.MockApplication은
ActivityUnitTestCase
에서만 사용할 수 있으며, setApplication()
를 통해 지정할 수 있습니다. (startActivity 이전에 호출해야 합니다.)지정하지 않으면 ActivityUnitTestCase에서 위조 Application을 생성합니다.(MockContext는 setActivityContext()
를 통해 지정할 수 있음)Activity 테스트의 판단문
ViewAsserts는 View 컨텐트의 위치, 상태 및 상태를 확인할 수 있는 뷰에 사용할 판단문을 정의합니다.
저희가 뭘 테스트해야 돼요?
findViewById(int)
를 사용하여 View의 상태를 확인합니다.입력이 이상할 때disable를 설정하고 정상적일 때enable를 입력한 다음Button
검사를 통과할 수 있습니다.오류 입력을 설정해서Activity가 적절하게 처리되었는지 확인할 수도 있습니다.assertEquals(button.isEnabled(), true)
테스트에서 위조 Intent를Activity에 보낼 수 있습니다.ActivityInstrumentationTestCase2
를 통해 레이아웃 상황을 자동화할 수 있도록 해야 한다.너는 각양각색의 안드로이드 가상 기기에서 테스트를 실행하거나 직접 목표 기기에서 실행할 수 있다.다양한 화면을 지원하는 애플리케이션을 Support Multiple Screens에서 확인할 수 있습니다.다음에 해야 할 일
Testing from Eclipse with ADT에서는 Eclipse를 어떻게 사용해 안드로이드 자동화 테스트를 하는지, Testring from Other IDEs에서는 다른 개발 도구의 안드로이드 테스트 사용을 다뤘다.
Activity Testing Tutorial을 통해 Activity 자동화 테스트를 어떻게 하는지 점진적으로 배울 수 있습니다. 이 글은 Activity 위주의 응용 프로그램을 테스트하는 방안을 제공합니다.
부록: UI 테스트에서 주의해야 할 사항
다음 부분은 UI 테스트의 tips입니다. 특히 메인 라인의 동작 (터치스크린, 입력, 잠금 스크린 등 이벤트) 을 테스트할 때 이 부분을 자세히 보십시오.
주 라인에서 테스트를 하다
적용된 Activities는 주 스레드에서 실행됩니다.일단 UI 인터페이스가 실례화되면 (간단한 예를 들어:Activity의onCreate 방법이 호출되면 UI가 실례화됩니다) 모든 UI 인터페이스와 상호작용하는 이벤트는 주 라인에서 발생해야 합니다.네가 정상적으로 프로그램을 시작할 때, 반드시 이 규칙에 따라야만 프로그램이 정상적으로 실행될 수 있다.그러나 Instrumentation 기반의 테스트 중 (다른 종류의 테스트는 불가능) 에서는 테스트 프로그램에서 UI를 조작할 수 있습니다.
전체 테스트 함수를 주 라인에서 실행하려면 함수에 주석
ViewAsserts
을 붙일 수 있지만, 이 경우 전체 함수의 모든 문장을 주 라인에서 실행합니다. 이 경우 UI 구성 요소와 상호작용하지 않는 문장은 허용되지 않습니다. (예: @UiThreadTest
테스트 함수 중 일부를 주 라인에서 실행할 수 있도록 합니다. Instrumentation.waitForIdleSync()
방법 ((appActivity.runOnUiThread()
은 테스트에서 가지고 있는Activity 실례) 을 사용해서 주 라인에서 실행하고 싶은 것을 익명 내부 클래스 appActivity
에 넣고 전달합니다.예를 들어, 이 코드는Activity 실력을 테스트하여, Spinner가 초점을 잡고, 터치스크린 이벤트를 보내는 것을 제어한다.주의
Runnable
와 waitForIdleSync
는 주 라인에서 실행할 수 없습니다. private MyActivity mActivity; // MyActivity is the class name of the app under test
private Spinner mSpinner;
...
protected void setUp() throws Exception {
super.setUp();
mInstrumentation = getInstrumentation();
mActivity = getActivity(); // get a references to the app under test
/*
* Get a reference to the main widget of the app under test, a Spinner
*/
mSpinner = (Spinner) mActivity.findViewById(com.android.demo.myactivity.R.id.Spinner01);
...
public void aTest() {
/*
* request focus for the Spinner, so that the test can send key events to it
* This request must be run on the UI thread. To do this, use the runOnUiThread method
* and pass it a Runnable that contains a call to requestFocus on the Spinner.
*/
mActivity.runOnUiThread(new Runnable() {
public void run() {
mSpinner.requestFocus();
}
});
mInstrumentation.waitForIdleSync();
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
물리적 키와 터치 스크린 차단
시뮬레이터나 장치가 테스트 프로그램의 버튼을 받을 수 있도록 장치의 물리적 버튼과 터치스크린 이벤트를 차단해야 합니다.만약 이렇게 하지 않는다면 테스트 프로그램에서 보낸 이런 사건은 작용하지 않을 것이다.
너는
sendKeys
를 호출해서 이 점을 할 수 있다ActivityInstrumentationTestCase2.setActivityTouchMode(false)
사이에서 이 문장을 호출해야만 작용할 수 있다).주 라인에서 실행되는 문장에서 그것을 호출할 수 없기 때문에 getActivity()
주석이 있는 함수에 나타나지 않습니다. 실제적으로 가장 좋은 방법은 @UiThreadTest
방법에서 이 일을 하는 것입니다.장치 잠금 해제 후 테스트
화면 잠금 장치 (또는 다른 암호화 수단) 에서 UI 테스트를 사용할 수 없습니다. 이 경우
setUp()
보내는 이벤트를 받을 수 없기 때문입니다.가장 좋은 해결 방법은 먼저 설비를 잠그고 테스트를 하는 것이다.물론 당신도 onCreate에 아래의 코드를 추가해서 잠금 화면을 현저하게 비활성화할 수 있지만, 응용 프로그램에 권한을 추가해야 합니다.
sendKeys()
mKeyGuardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
mLock = mKeyGuardManager.newKeyguardLock("activity_classname");
mLock.disableKeyguard();
문제 해결
이 섹션에는 UI 테스트에서 발생한 여러 오류가 나열되어 있습니다.
: 질문:
오류 메시지:
WrongThreadException
가 발생하여 테스트가 붕괴되었습니다.가능한 이유:
이 문제는 UI가 아닌 스레드에서 UI와 상호 작용하는 경우 발생합니다.테스트에서 UI 컨트롤이 서로 작용하거나
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
주석을 달지 않거나 @UiThreadTest
방법에서 실행되지 않으면, 주 프로세스가 아닌 프로세스에서 이 명령을 실행하면 오류가 발생합니다.권장 사항:
마스터 프로세스에서 UI와 상호 작용하고 Instrumentation을 지원하는 테스트 클래스를 사용합니다.Testing on UI Thread에서 더 많은 정보를 확인할 수 있습니다.
runOnUiThread()
: 질문:
오류 메시지
java.lang.RuntimeException
로 인한 테스트 충돌입니다.가능한 이유:
이 오류는
java.lang.RuntimeException: This method can not be called from the main application thread
주석의 함수에서 @UiThreadTest
호출되었거나 UI 프로세스에서 실행되지 않는 다른 문장에서 자주 발생합니다.권장 사항:
주해를 없애거나, 없애거나, 테스트 프로그램을 다시 작성해서 해결할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.