根據預設,系統會與您的使用者介面同步處理撰寫測試。當您使用 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 或 Compose 同步時。
這個 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 }
請注意,特定條件應檢查可能受此時鐘影響的狀態 (這個狀態僅適用於 Compose 狀態)。
等待條件
任何需要外部作業的條件,例如載入資料或 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:雖然適用於以 View 為基礎的 UI,但 Espresso 知識仍有助於進行 Compose 測試的某些方面。