如何使用 Espresso 空闲资源

How to use Espresso Idling Resource

场景是当用户点击 "Download" 按钮时,数据(music/an 图片等)开始从互联网下载。下载完成后,按钮会将其标签文本更改为 "Open"。然后用户单击 "Open" 按钮。到目前为止我所做的是:

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

其实idling资源是Espresso最难的地方

如果在您的测试中您必须等待 for/sync 一些异步后台任务,您应该实施它。默认情况下,Espresso 等待当前消息队列中的 UI 个操作处理完毕,并等待默认 AsyncTasks(与默认 AsyncTask 线程池同步)完成,然后再进行下一个测试操作。请查看此 AsyncTasks。但是,如果您启动另一个线程,例如与某些 Web 服务通信,您应该使用 IdlingResource.

您可能需要的任何 Thread.sleep() 都表明您可能需要闲置资源。

现在介绍如何编写空闲资源。代码开发人员可以轻松完成,因为他们现在是如何进行这一点评估的。

应该是这样的:

public class DownloadIdlingResource extends BaseIdlingResource { ... }

应该定义此资源何时空闲.....

测试,想说 Espresso 它需要等待这个空闲资源,应该在测试期间定义 class 初始化这个空闲资源(setUp() 等)或激活它需要的时候。这意味着你有一个东西要等待,但它还没有被激活。 例如,下载的空闲资源可以有一个侦听器,用于在下载开始时将空闲资源设置为非空闲 (setIdle(false)),并在下载完成时将其设置回空闲 (setIdle(true))。如果所有空闲资源都处于空闲状态(无需等待完成),Espresso 将继续所有其他员工。 空闲资源的实现细节在很大程度上取决于应用程序实现。

一般来说,关于闲置资源可以说些什么:

  1. isIdleNow()实现资源空闲时的逻辑

  2. registerIdleTransitionCallback 将在资源注册时由 Espresso 调用,并会给你一个 ResourceCallback.

  3. 当资源从忙碌变为空闲时,实际上您会从后台任务中获得操作已完成的回调(地图数据已下载或下载已取消)您必须callonTransitionToIdle() 已注册 ResourceCallback.

  4. getName() 中,您必须 return 用于日志记录的资源的名称。

请注意不要出现空闲资源等死锁。空闲资源有超时时间。解释闲置资源问题的消息可能会中断测试。

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