同步處理測試

根據預設,系統會與您的使用者介面同步處理撰寫測試。使用 ComposeTestRule 呼叫斷言或動作時,系統會預先同步處理測試,直到 UI 樹狀結構閒置為止。

一般來說,您不必採取任何行動。但仍有一些邊緣案例需要知道。

測試進行同步處理後,Compose 應用程式就會使用虛擬時鐘適時完成進階。這表示 Compose 測試不會即時執行,因此可以盡可能快速通過。

不過,如果您沒有使用同步處理測試的方法,則不會發生重覆現象,且 UI 會暫停。

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

請注意,這項規定僅適用於 Compose 階層,應用程式的其他部分並不適用。

停用自動同步功能

透過 ComposeTestRule (例如 assertExists()) 呼叫宣告或動作時,您的測試會與 Compose UI 同步處理。在某些情況下,您可能會想要停止同步處理並自行控管時鐘。舉例來說,您可以控制在 UI 忙碌期間,為動畫擷取準確螢幕截圖的時間。如要停用自動同步功能,請將 mainClock 中的 autoAdvance 屬性設為 false

composeTestRule.mainClock.autoAdvance = false

一般而言,您需要自行安排時間。您可以透過 advanceTimeByFrame() 將特定影格前進,也可以使用 advanceTimeBy() 按照特定時間長度快一點:

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

閒置資源

Compose 可以同步處理測試和 UI,讓所有動作和宣告都以閒置狀態完成,然後視需要等待或往前調整時鐘。但是,某些影響 UI 狀態的非同步作業可能會在背景執行,但測試無法得知這些結果。

在測試中建立並註冊這些閒置資源,以便發揮作用 考量到要測試的應用程式是否忙碌或閒置。不要 除非需要註冊額外的閒置資源,否則您必須採取行動 舉例來說,如果您執行的背景工作並未與 Espresso 同步, 。

這個 API 與 Espresso 的 Idling Resources 非常類似,用於表示 受測試的主體處於閒置狀態或忙碌中。使用 Compose 測試規則註冊 IdlingResource 的實作。

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

手動同步處理

在某些情況下,您必須將 Compose UI 與其他測試或您要測試的應用程式同步處理。

waitForIdle() 函式會等待 Compose 處於閒置狀態,但函式 依附於 autoAdvance 屬性:

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

請注意,在這兩種情況下,waitForIdle() 也會等候待處理的提取和版面配置傳遞

此外,您也可以將時鐘加至 advanceTimeUntil() 符合特定條件為止。

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

請注意,指定的條件只能查看受到這個時鐘影響的狀態 (這個狀態僅適用於「撰寫」狀態)。

等待條件

任何需要外部工作的條件,例如資料載入或 Android 的 測量或繪圖 (也就是測量或繪製在 Compose 外) 的做法,則應使用 較一般的概念,例如 waitUntil()

composeTestRule.waitUntil(timeoutMs) { condition }

您也可以使用任何 waitUntil 輔助程式

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

其他資源

  • 在 Android 上測試應用程式:主要的 Android 測試專頁可讓您更深入瞭解測試基礎知識和技巧。
  • 測試基本知識瞭解詳情 介紹測試 Android 應用程式的核心概念。
  • 本機測試您可以在本機上執行部分測試。
  • 檢測設備測試建議您也執行檢測設備測試。也就是直接在裝置上執行的測試。
  • 持續整合 持續整合可讓您將測試整合至部署作業 這種模型通常已開放原始碼 可以透過自訂筆記本或管線微調
  • 測試不同的螢幕大小 由於使用者可能會使用許多裝置,所以您應該針對不同的螢幕進行測試 大小。
  • Espresso:適用於以檢視畫面為基礎的 UI、Espresso 知識仍對 Compose 的某些層面有所幫助 進行測試。