Espresso测试有个很强大的地方是它在多个测试操作中是线程安全的。Espresso会等待当前进程的消息队列中的UI事件,并且在任何一个测试操作中会等待其中的AsyncTask结束才会执行下一个测试。这能够解决程序中大部分的线程同步问题。然而实际中,有许多的应用后台的操作都是使用自定义的服务去创建以及管理线程的。这个时候Espresso就无法做到同步了,那么有办法来解决这个问题吗?有的。可以通过IdlingResource来同步你的UI事件。
介绍
IdlingResource 它是一个简单的接口:
它代表了被测应用程序的资源,这个资源在测试执行时可以在后台异步工作。
接口定义了三个方法:
- getName():必须返回代表idling resource的非空字符串;
- isIdleNow():返回当前idlingresource的idle状态。如果返回true,onTransitionToIdle()上注册的ResourceCallback必须必须在之前已经调用;
- registerIdleTransitionCallback:通常此方法用于存储对回调的引用来通知idle状态的变化。
下来直接说下测试过程中遇到的问题以及如何处理的吧。
问题: 点击界面某个按钮后,新出现的页面会存在一个progressDialogFragment进行网络的请求数据,直到网络异常后者请求成功才会消失
其实这个时候如何不做任何处理的话,很明显,Espresso在点击按钮后的其他操作都会失败,它肯定会报错说NoViewsMatching,所以我们需要自定义一个IdlingResource
pub