【问题标题】:delay espresso cannot handle延迟浓缩咖啡无法处理
【发布时间】:2014-01-23 21:42:29
【问题描述】:

对于使用 Google Espresso 测试框架测试软件,我遇到以下问题:

程序启动时,启动画面会启动并初始化整个应用程序。在此之后,我启动了一个请求输入的活动。

在 Espresso 中,应用程序启动并且测试从以下代码开始: onView(withId(R.id.chooseBookTitle)).perform(click());

这会崩溃,因为显示屏仍然显示启动屏幕,并且选择书名仅在之后可见。如何防止 Google-Espresso 在按键出现之前点击它?

(我不想插入等待循环,但要让它保持事件驱动。在更糟糕的情况下,我会回到 Robotium)

【问题讨论】:

  • chooseBookTitle 是由初始屏幕启动的 Activity 的视图吗?如果是这样,Espresso 应该注意计时并等到 UI 线程空闲。你能发布一些代码来澄清一下吗?
  • 使用下面的单行代码来处理任何 Test Espresso 测试用例:SystemClock.sleep(1000); // 1 秒

标签: unit-testing android-espresso


【解决方案1】:

请查看IdlingResource接口:

正如 Stefano Dacchille 所述(参见下面的示例),您必须创建一个等待变为空闲的空闲资源实现:

public class WaitForSomethingResource implements IdlingResource {

ResourceCallback mResourceCallback;

private boolean isIdle;

@Override
public String getName() {
    return WaitForSomethingResource.class.getName();
}

@Override
public void registerIdleTransitionCallback(
        ResourceCallback resourceCallback) {
    mResourceCallback = resourceCallback;
}

@Override
public boolean isIdleNow() {
    return isIdle;
}

/**
 * Register an listener, use an event bus or something 
 * else to get notified about any change you want to track.
 */
public void onProgressChanged() {
    isIdle = true;

    if (isIdle && mResourceCallback != null) {
        mResourceCallback.onTransitionToIdle();
    }
}

}

之后,您必须在测试的 setUp() 或 @before 方法中注册 IdlingResource 实现,方法是:

Espresso.registerIdlingResource(waitForSomethingResource)

示例: http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/

API 文档: http://developer.android.com/reference/android/support/test/espresso/IdlingResource.html#isIdleNow()

【讨论】:

  • 使用下面的单行代码来处理任何 Test Espresso 测试用例:SystemClock.sleep(1000); // 1 秒
【解决方案2】:

据我所知,您应该直接打开包含 R.id.chooseBookTitle 的活动,否则您的视图将永远不会出现在屏幕上,因此您的测试将始终失败,因为 Espresso 找不到指定的视图。

否则,我在做一些测试之前使用 Thread.sleep(...) 让测试等待。在调用 onView(withId(R.id.chooseBookTitle)).perform(click()); 之前尝试一下看看它是否有效。

祝你好运!

【讨论】:

  • 使用下面的单行代码来处理任何 Test Espresso 测试用例:SystemClock.sleep(1000); // 1 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多