활동은 앱 내의 모든 사용자 상호작용의 컨테이너 역할을 하므로 기기 수준에서의 앱 활동이 어떻게 동작하는지 다음과 같은 이벤트를 처리합니다.
- 기기의 스마트폰 앱과 같은 다른 앱이 앱의 활동을 중단시킵니다.
- 시스템이 활동을 제거하고 다시 생성합니다.
- 사용자가 다음과 같은 새 창 환경에 활동을 배치합니다. 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
를 호출하는 것이 좋습니다.
나타냅니다. 이렇게 하면 연결된 리소스가 삭제되고
테스트 안정성에 영향을 줍니다 ActivityScenario
는 Closeable
를 구현하므로 다음을 할 수 있습니다.
use
확장 프로그램 또는 Java 프로그래밍에서 try-with-resources
적용
활동이 자동으로 닫히도록 합니다.
또는 ActivityScenarioRule
를 사용하여 자동으로 전화를 걸 수 있습니다.
각 테스트 전 ActivityScenario.launch
및 ActivityScenario.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() } } } }