Activity 테스트

Activity 테스트
  • 텍스트 링크: Activity Testing
  • 원문: Android Developers
  • 번역팀: 안드로이드 개발 기술 전선
  • 번역자:desmond1121
  • Activity 테스트는 Android Instrumentation 테스트 프레임워크에 의존합니다.다른 구성 요소와 달리Activity는 더욱 복잡한 생명주기가 있는데, 이러한 생명주기 함수는 직접적으로 호출될 수 없고, Instrumentation을 통해 이벤트를 보내서 촉발할 수 밖에 없다.
    이 문서는 Instrumentation과 다른 테스트 도구를 사용하여 자동화 테스트를 하는 방법을 설명합니다.그것을 읽기 전에 안드로이드 테스트의 기초를 읽어야 한다. 안드로이드 자동화 테스트와 Instrumentation 프레임워크가 무엇인지 소개한다.
    Activity 테스트 API 소개
    Activity 테스트의 기본 클래스는 InstrumentationTestCase입니다. Activity 테스트에 사용되는 몇 가지 클래스에 Instrumentation 지원을 제공합니다.
    Activity 테스트에서 기본 클래스는 다음 세 가지 기능을 제공합니다.
  • 생명주기 제어:Activity의onResume,onPause,onDestroy 등 방법을 사용하여Activity의 생명주기를 제어할 수 있습니다.
  • 의존 주입: Instrumentation을 사용하여 위조 Context 또는 위조 Application을 제조할 수 있습니다. 이로써 테스트 환경을 더욱 잘 제어하고 사용자 정의 Intent를 통해Activity를 시작할 수 있습니다.
  • 사용자 인터페이스 상호작용: 인스트루먼트를 사용하여 버튼 정보와 터치스크린 이벤트를 직접 보낼 수 있습니다.

  • Activity 테스트 클래스는TestCase와 Assert를 계승하여 JUnit 테스트 프레임워크를 실현하였으며, 테스트 과정에서 사용할 수 있습니다.
    두 가지 주요 테스트 하위 클래스는ActivityInstrumentationTestCase2와ActivityUnitTestCase입니다. 그러나ActivitylaunchMode가 비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에 가입할 수 없습니다.
    이 클래스는ActivitylaunchMode 속성을 테스트할 때standard가 매우 유용하지 않습니다. 테스트 환경이 변하지 않도록 보장하기 때문에Activity가 여러 번 반복 호출에 대한 정확한 대응을 하는지 테스트할 수 있습니다.
    Activity의 위조 Object 사용
    이 부분은 안드로이드 테스트에서 android.test.mock 패키지에 정의된 일련의 위조 Object를 어떻게 사용하는지 알려 드리는 것입니다.
    MockApplication은 ActivityUnitTestCase 에서만 사용할 수 있으며, setApplication() 를 통해 지정할 수 있습니다. (startActivity 이전에 호출해야 합니다.)지정하지 않으면 ActivityUnitTestCase에서 위조 Application을 생성합니다.(MockContext는 setActivityContext()를 통해 지정할 수 있음)
    Activity 테스트의 판단문
    ViewAsserts는 View 컨텐트의 위치, 상태 및 상태를 확인할 수 있는 뷰에 사용할 판단문을 정의합니다.
    저희가 뭘 테스트해야 돼요?
  • 입력 합법성:Activity가EditText의 각종 입력에 대해 정상적인 반응을 보였는지 테스트할 수 있습니다.Activity에 일련의 정보를 시뮬레이션하여 보내기findViewById(int)를 사용하여 View의 상태를 확인합니다.입력이 이상할 때disable를 설정하고 정상적일 때enable를 입력한 다음Button 검사를 통과할 수 있습니다.오류 입력을 설정해서Activity가 적절하게 처리되었는지 확인할 수도 있습니다.
  • 생명주기 제어: 프로그램의Activity가 생명주기의 각 회전 상황을 정상적으로 처리했는지 테스트할 수 있습니다.합격된Activity는pause나destroy에서 다음 실행에 필요한 상태를 저장해야 합니다.화면 레이아웃 방향이 바뀌면 (예를 들어 세로 화면이 가로 화면으로 바뀌면) Activity의destroy 과정을 일으킬 수 있음을 기억하십시오. 장치 외부 이동이 응용 데이터의 분실을 일으키지 않도록 해야 합니다.
  • Intent 테스트: 모든Activity가 manfest 파일의 속성에 있는 Intent를 정상적으로 처리했는지 테스트할 수 있습니다.assertEquals(button.isEnabled(), true) 테스트에서 위조 Intent를Activity에 보낼 수 있습니다.
  • 실행 시 설정 변경: 장치의 설정 변경 (예를 들어 화면 방향 변경, 언어 변경 등) 을 모의하여 실행 중인Activity의 대응이 정확한지 테스트할 수 있습니다.Handling Runtime Changes에서는 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가 초점을 잡고, 터치스크린 이벤트를 보내는 것을 제어한다.주의 RunnablewaitForIdleSync 는 주 라인에서 실행할 수 없습니다.
      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 프로세스에서 실행되지 않는 다른 문장에서 자주 발생합니다.
    권장 사항:
    주해를 없애거나, 없애거나, 테스트 프로그램을 다시 작성해서 해결할 수 있습니다.

    좋은 웹페이지 즐겨찾기