默认情况下,Compose 测试会与界面同步。当您调用 断言或操作与
ComposeTestRule
相关联,则测试会同步 ,直到界面树空闲为止。
通常,您无需执行任何操作。但是,您应该了解一些极端情况。
同步测试时,您可以使用虚拟时钟将 Compose 应用的时间提前。这意味着 Compose 测试不会实时运行,从而能够尽快通过测试。
但是,如果您不使用同步测试的方法,则不会发生任何重组,并且界面会暂停。
@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 界面同步。在某些情况下,您可能需要停止此同步并自行控制时钟。例如,您可以控制时间,以便在界面仍处于繁忙状态时对动画进行精确截图。如需停用自动同步功能,请将 mainClock
中的 autoAdvance
属性设置为 false
:
composeTestRule
.
mainClock
.
autoAdvance
=
false
一般情况下,您需要自行将时间提前。您可以使用 advanceTimeByFrame()
仅提前一帧,或使用 advanceTimeBy()
提前一段特定时间:
composeTestRule
.
mainClock
.
advanceTimeByFrame
()
composeTestRule
.
mainClock
.
advanceTimeBy
(
milliseconds
)
空闲资源
Compose 可以同步测试和界面,以便以空闲状态完成各项操作和断言,从而根据需要等待或将时钟提前。但是,某些影响界面状态的异步操作可在后台运行,而测试无法得知这些结果。
在测试中创建并注册这些空闲资源,以供系统使用 在确定被测应用处于忙碌状态还是空闲状态时考虑的因素。你不会 除非您需要注册其他空闲资源 例如,如果您运行的后台作业未与 Espresso 或 写邮件。
此 API 与 Espresso 的空闲资源
非常相似,用于指示 被测对象处于空闲或忙碌状态。使用 Compose 测试规则进行注册
IdlingResource
的实现。
composeTestRule
.
registerIdlingResource
(
idlingResource
)
composeTestRule
.
unregisterIdlingResource
(
idlingResource
)
手动同步
在某些情况下,您必须将 Compose 界面与测试的其他部分或您测试的应用同步。
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
)