앱 활동 테스트

활동은 앱 내의 모든 사용자 상호작용의 컨테이너 역할을 하므로 기기 수준에서의 앱 활동이 어떻게 동작하는지 다음과 같은 이벤트를 처리합니다.

  • 기기의 스마트폰 앱과 같은 다른 앱이 앱의 활동을 중단시킵니다.
  • 시스템이 활동을 제거하고 다시 생성합니다.
  • 사용자가 다음과 같은 새 창 환경에 활동을 배치합니다. PIP (picture-in-picture) 또는 멀티 윈도우를 지원합니다.

특히 API 호출에서 활동이 올바르게 동작하는지 이벤트에 대한 응답으로 수명 주기를 참고하세요.

이 가이드에서는 앱의 데이터 유지 기능을 평가하는 방법을 설명합니다. 앱의 활동 전환으로 무결성 및 우수한 사용자 환경 수명 주기의 여러 상태를 거치게 됩니다

활동 상태 변경

앱 활동 테스트의 한 가지 주요 측면은 앱의 정의할 수 있습니다. 이를 'given'으로 정의하려면 삽입하려면 ActivityScenario의 인스턴스, 일부 AndroidX 테스트 라이브러리 이 클래스를 사용하여 다음 작업을 할 수 있습니다. 활동을 기기 수준 이벤트를 시뮬레이션하는 상태에 배치합니다.

ActivityScenario는 로컬 단위 테스트에서 사용할 수 있는 크로스 플랫폼 API입니다. 온디바이스 통합 테스트를 모두 실행할 수 있습니다 실제 또는 가상 기기에서 ActivityScenario는 스레드 안전을 제공하여 테스트의 계측 스레드와 테스트 중인 활동을 실행하는 스레드가 포함됩니다.

이 API는 특히 다양한 환경에서의 활동이 테스트는 소멸되거나 생성될 때 동작합니다. 이 섹션에서는 Google Cloud 제품에 대한 사용 사례를 보여줍니다

활동 생성

테스트에 사용되는 활동을 생성하려면 다음 스니펫에 나와 있는 코드를 추가합니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

활동을 만든 후 ActivityScenario는 활동을 RESUMED 상태입니다. 이 상태는 활동이 실행 중이고 사용자에게 표시됩니다. 이 상태에서는 액티비티의 Espresso UI 테스트를 사용하는 View 요소

테스트 시 활동에서 close를 호출하는 것이 좋습니다. 나타냅니다. 이렇게 하면 연결된 리소스가 삭제되고 테스트 안정성에 영향을 줍니다 ActivityScenarioCloseable를 구현하므로 다음을 할 수 있습니다. use 확장 프로그램 또는 Java 프로그래밍에서 try-with-resources 적용 활동이 자동으로 닫히도록 합니다.

또는 ActivityScenarioRule를 사용하여 자동으로 전화를 걸 수 있습니다. 각 테스트 전 ActivityScenario.launchActivityScenario.close 해체했습니다. 다음 예에서는 규칙을 정의하고 시나리오의 인스턴스를 살펴보겠습니다

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

새로운 상태로 활동 변경

활동을 CREATED 또는 STARTED와 같은 다른 상태로 전환하려면 다음을 호출합니다. moveToState()입니다. 이 작업은 Activity가 실행되는 상황을 시뮬레이션합니다. 중지 또는 일시중지되는 것을 볼 수 있습니다. 시스템 작업이 있습니다.

moveToState()의 사용 예는 다음 코드 스니펫에 나와 있습니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}
드림

현재 활동 상태 확인

테스트 중인 활동의 현재 상태를 확인하려면 ActivityScenario 객체 내의 state 필드 특히 유용한 를 사용하여 테스트 중인 활동의 상태를 확인합니다. 다른 활동이 실행되거나 자체적으로 종료되는 경우(다음 코드 참고) snippet:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

활동 다시 생성

기기의 리소스가 부족하면 시스템이 활동을 소멸시키고 사용자가 앱으로 돌아올 때 앱에서 해당 활동을 다시 생성하도록 요구합니다. 이러한 조건을 시뮬레이션하려면 recreate()를 호출합니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

ActivityScenario 클래스는 활동의 저장된 인스턴스 상태를 유지하고 @NonConfigurationInstance를 사용하여 주석이 달린 모든 객체 이러한 객체는 를 호출하는 것이 좋습니다.

활동 결과 검색

완료된 활동과 관련된 결과 코드 또는 데이터를 가져오려면 다음을 가져옵니다. 다음과 같이 ActivityScenario 객체 내 result 필드의 값 다음 코드 스니펫입니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

활동에서 작업 트리거

ActivityScenario 내의 모든 메서드는 차단 호출이므로 API에는 계측 스레드에서 실행할 수 있습니다

테스트 중인 활동에서 작업을 트리거하려면 Espresso 뷰 매처를 사용하여 다음과 같은 상호작용을 지원합니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

그러나 액티비티 자체에서 메서드를 호출해야 한다면 그렇게 할 수 있습니다. ActivityAction를 구현하여 안전하게 보호합니다.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}
드림