IdlingResource入门:espresso-samples用自定义空闲资源精确等待指定时长
IdlingResource入门espresso-samples用自定义空闲资源精确等待指定时长【免费下载链接】espresso-samplesA collection of samples demonstrating different Espresso techniques.项目地址: https://gitcode.com/gh_mirrors/esp/espresso-samplesEspresso 是 Android UI 测试的主流框架而 IdlingResource空闲资源是它同步等待异步操作的核心机制。本文基于开源示例集 espresso-samples 的idling-resource-elapsed-time示例手把手教你用自定义空闲资源精确等待指定时长告别测试中脆弱的Thread.sleep()。为什么需要自定义 IdlingResourceEspresso 执行perform(click())等动作后会持续轮询直到界面空闲才继续下一步。但对于应用内部的耗时任务倒计时、网络请求、后台服务Espresso 感知不到它们的进度测试就会因为时机不对而偶发失败。解决办法实现一个IdlingResource向 Espresso 报告现在是否空闲isIdleNow()返回true表示空闲false表示还在忙Espresso 会暂停操作并轮询registerIdleTransitionCallback()当状态从忙转为闲时主动回调onTransitionToIdle()让 Espresso 立刻恢复执行。⚠️ 注意不要像Thread.sleep()那样阻塞线程isIdleNow()必须快速返回。用 ElapsedTimeIdlingResource 等待指定时长idling-resource-elapsed-time示例的思路非常直观记录一个起始时间戳当经过的时间达到预设的waitingTime时就宣告空闲。核心实现在 ElapsedTimeIdlingResource.ktclass ElapsedTimeIdlingResource(private val waitingTime: Long) : IdlingResource { private val startTime: Long System.currentTimeMillis() private var resourceCallback: IdlingResource.ResourceCallback? null override fun isIdleNow(): Boolean { val idle System.currentTimeMillis() - startTime waitingTime if (idle) resourceCallback?.onTransitionToIdle() return idle } override fun registerIdleTransitionCallback(cb: IdlingResource.ResourceCallback) { resourceCallback cb } }这个示例配套了一个简单的计时界面点 Start 开始计时点 Stop 显示结果——如果等待满一分钟则显示 Yes, you waited for a minute!否则显示 Patience, my friend见 MainActivity.kt。注册空闲资源并同步等待的完整流程测试代码位于 MainActivityTest.kt流程分四步启动计时onView(withId(R.id.toggle_button)).perform(click())点击 Start 按钮防止超时把总策略和空闲资源超时设为等待时长的 2 倍——IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS) IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS)注册等待注册ElapsedTimeIdlingResource(waitingTime)。此后 Espresso 的每一步操作都会先等它变空闲也就实现了精确等待指定时长验证并清理点击 Stop断言结果文案最后务必IdlingRegistry.getInstance().unregister(...)注销避免污染下一个用例。测试用例覆盖两种场景等待 8 秒断言失败文案等待 75 秒断言成功文案直观验证了等待时长是否生效。项目中其他 IdlingResource 示例espresso-samples还有几个同类示例可按需对照学习目录场景idling-resource-okhttp/等待 OkHttp/Retrofit 网络请求空闲idling-registry-okhttp/同上按 debug/release 拆分实现idling-resource-intent-service/等待后台 IntentService 执行完毕idling-resource-dialog-fragment/练习题等待加载对话框消失小结自定义IdlingResource是让 Espresso 精确同步异步逻辑的标准做法isIdleNow()要快速返回用回调通知状态转换注册前先调整IdlingPolicies超时用完后及时注销想精确等待 N 秒照抄 ElapsedTimeIdlingResource.kt 即可不到 30 行代码搞定。【免费下载链接】espresso-samplesA collection of samples demonstrating different Espresso techniques.项目地址: https://gitcode.com/gh_mirrors/esp/espresso-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考