如何使用Espresso空闲资源

时间:2015-01-26 10:53:26

标签: android android-testing android-espresso

场景是当用户点击“下载”按钮时,开始从互联网下载数据(音乐/图像等)。下载完成后,按钮会将标签文本更改为“打开”。然后用户单击“打开”按钮。我所做的就是:

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的内容,但这对我没有意义,我不知道如何在这种特殊情况下应用它。

1 个答案:

答案 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()中,您必须返回用于记录的资源的名称。

请注意不要像闲置资源那样死锁。空闲资源超时。可以通过消息解释对空闲资源的坏处来中断测试。

我很抱歉无法编写更具体的示例,但这实际上取决于您的应用程序实现。