活動可做為容器中每個使用者互動的容器,因此 請務必測試應用程式活動在裝置層級的行為模式 事件,例如:
- 其他應用程式 (例如裝置的電話應用程式) 會中斷應用程式活動。
- 系統會刪除並重新建立活動。
- 使用者會將您的活動置於新的視窗環境,例如 子母畫面 (PIP) 或多視窗模式。
尤其是,您必須確保活動在 回應該活動 生命週期。
本指南說明如何評估應用程式的資料維護能力 當應用程式的活動轉換時,完整性和良好的使用者體驗 在生命週期中的不同狀態
推動活動狀態
測試應用程式活動的其中一個重點,就是將應用程式的
特定狀態的活動如要將這個「部分測試項目,請使用
ActivityScenario
例項
部分
AndroidX Test 程式庫。透過這個類別,您可以
將您的活動置於模擬裝置層級事件的狀態。
ActivityScenario
是可用於本機單元測試的跨平台 API
和裝置端整合測試等在實體或虛擬裝置上
ActivityScenario
可提供執行緒安全,同步處理以下項目之間的事件:
測試的檢測執行緒,以及在測試中執行活動的執行緒。
這個 API 特別適合用來評估 測試行為本節介紹 與這個 API 相關的用途
建立活動
如要建立受測試的活動,請加入以下程式碼片段所示的程式碼:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
建立活動後,ActivityScenario
會將活動轉換為
RESUMED
狀態。這個狀態表示活動正在執行,
並不會向使用者顯示在這個狀態下,您可以自由與活動的
使用 Espresso UI 測試的 View
元素。
Google 建議您在測試時,對活動呼叫 close
完成。這麼做會清除相關資源,並改善
測試和穩定性ActivityScenario
會實作 Closeable
,因此您可以
在 Java 程式設計中套用 use
擴充功能或 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()
。這項操作會模擬您的活動處於以下狀態時,
因其他應用程式或應用程式乾擾而中斷
系統動作
以下程式碼片段是 moveToState()
的用法範例:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
判斷目前的活動狀態
如要判斷受測活動目前的狀態,請取得
ActivityScenario
物件中的 state
欄位。與 Google 合作時
檢查受測活動的狀態,看看活動是否會重新導向至
另一個活動或完成本身,如以下程式碼所示
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() } } } }