Jetpack Compose测试中如何等待下一个@Composable函数完成绘制?
Jetpack Compose 测试等待UI渲染的解决方案
- Compose 测试框架的节点查询、断言逻辑本身自带默认4秒的超时等待机制,如果你整个加载流程耗时不超过4秒,其实不需要额外加等待代码,你贴的原有代码直接运行就可以正常校验
OK文本是否展示,框架会自动轮询查找目标节点直到超时。
如果你需要更长的等待时间,或者要明确控制等待逻辑,推荐用下面两种方案,不要用Thread.sleep(会阻塞测试线程,耗时不可控,容易导致测试不稳定):
方案1:使用自带的waitUntil方法(推荐,适配所有场景)
直接通过composeTestRule的waitUntil系列方法自定义等待条件和超时时间,示例代码如下:
composeTestRule .onNodeWithText("Begin") .performClick() // 等待最长10秒,直到OK文本的节点显示在屏幕上 composeTestRule.waitUntil(timeoutMillis = 10000) { composeTestRule.onNodeWithText("OK").isDisplayed() } // 也可以用简化的扩展方法 // composeTestRule.waitUntilExists(hasText("OK"), timeoutMillis = 10000) composeTestRule .onNodeWithText("OK") .assertIsDisplayed()
方案2:协程场景直接推进执行(适合加载逻辑是协程实现的场景)
如果你的Loading阶段的异步逻辑是用Kotlin协程实现的,且测试中使用了测试调度器,你可以直接推进所有协程到空闲状态,不需要按时间等待:
@get:Rule val composeTestRule = createComposeRule() @Test fun testLoadingFlow() = runTest { composeTestRule.setContent { YourAppContent() } composeTestRule .onNodeWithText("Begin") .performClick() // 推进所有待执行的协程任务直到全部完成 advanceUntilIdle() composeTestRule .onNodeWithText("OK") .assertIsDisplayed() }
内容的提问来源于stack exchange,提问作者Pitry
相关产品推荐
相关产品推荐

