场景是当用户点击“下载”按钮时,开始从互联网下载数据(音乐/图像等)。下载完成后,按钮会将标签文本更改为“打开”。然后用户单击“打开”按钮。我所做的就是:
onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click());
try {
Thread.sleep(delayedTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click());
有时测试通过,有时它不会。有时失败的原因是"No views in hierarchy found matching: (with id: something:id/button and with text: is "Open").
我知道在Espresso中使用Thread.sleep也是不好的做法。我读过关于Espresso's Idling Resource的内容,但这对我没有意义,我不知道如何在这种特殊情况下应用它。
答案 0 :(得分:36)
实际上,闲置资源是Espresso的最难点。
如果在测试中你必须等待/同步一些异步后台任务,你应该实现它。默认情况下,Espresso会等待当前消息队列中的UI操作进行处理,并且默认AsyncTasks(与默认的AsyncTask线程池同步)在完成下一个测试操作之前完成。请查看AsyncTasks的内容。但是,如果您启动其他线程,例如与某些Web服务进行通信,则应使用IdlingResource
。
您可能需要的任何Thread.sleep()
是一个信号,您可能需要一个空闲资源。
现在关于如何编写闲置资源。代码开发人员可以轻松完成,因为他们现在正在如何进行评估。
应该是这样的:
public class DownloadIdlingResource extends BaseIdlingResource { ....}
应该定义此资源何时空闲.....
测试,想要说Espresso需要等待这个空闲资源,应该在测试类初始化期间定义这个空闲资源(setUp()
等)或在需要时激活它。这意味着你有一些等待但尚未激活的东西。
例如,下载的空闲资源可以有一个监听器,用于在启动下载时将空闲资源设置为非空闲(setIdle(false)
),并在完成后设置回空闲状态(setIdle(true)
)。如果所有闲置资源都空闲,Espresso将继续其他所有员工(无需等待完成)。
空闲资源的实现细节很大程度上取决于应用程序的实现。
一般来说,闲置资源可以说什么:
1)isIdleNow()
在资源空闲时实现逻辑
2)当资源注册时,Espresso将调用registerIdleTransitionCallback
,并为您提供ResourceCallback
。
3)当资源从忙碌变为空闲时,实际上您从后台任务获得操作已完成的回调(下载地图数据或取消下载),您必须callonTransitionToIdle()
已注册ResourceCallback
。
4)在getName()
中,您必须返回用于记录的资源的名称。
请注意不要像闲置资源那样死锁。空闲资源超时。可以通过消息解释对空闲资源的坏处来中断测试。
我很抱歉无法编写更具体的示例,但这实际上取决于您的应用程序实现。