測試應用程式活動's 活動

活動可做為容器中每個使用者互動的容器,因此 請務必測試應用程式活動在裝置層級的行為模式 事件,例如:

  • 其他應用程式 (例如裝置的電話應用程式) 會中斷應用程式活動。
  • 系統會刪除並重新建立活動。
  • 使用者會將您的活動置於新的視窗環境,例如 子母畫面 (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
    }
}

將活動推動到新狀態

如要將活動驅動至其他狀態 (例如 CREATEDSTARTED),請呼叫 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()
            }
        }
    }
}
敬上