在Espresso Android中使用IdlingResource的正确方法

Lan*_*tka 13 android automated-tests android-espresso

我正在用Espresso编写UI测试.应用程序与服务器紧密配合,因此在很多情况下,我需要等待计算任一值,或者获取并显示数据等.Espresso建议使用IdlingResource.我的IdlingResource类看起来像这样(简单明了的例子).

public class IRViewVisible implements IdlingResource {

private View view;
private ResourceCallback callback;

public IRViewVisible(View view) {
    this.view = view;
}

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

@Override
public boolean isIdleNow() {
    if(view.getVisibility() == View.VISIBLE && callback != null) {
        callback.onTransitionToIdle();
        return true;
    }
    return false;
}

@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
    this.callback = resourceCallback;
}
}
Run Code Online (Sandbox Code Playgroud)

如果我在任何地方都错了,请纠正我(因为有时在我看来我的IdlingResources无法正常工作).我setUp()像这样注册空闲资源:

IRViewVisible ir = new IRViewVisible(View v);
Espresso.registerIdlingResources(ir).
Run Code Online (Sandbox Code Playgroud)

在tearDown()上取消注册.

我找到了这篇文章(有一个名为"注册一个绑定到Activity实例的组件"的部分) - 我没有使用他的模式,但我检查了注册后(在每个方法中)设置为IdlingResource的视图的哈希码,并且它是不一样的观点 - 所有的哈希都是不同的.

另一个问题:一个Test类(它的结果)对另一个Test类没有任何影响,可以吗?

vau*_*oid 4

我猜您的问题源于getName()为 IRViewVisible 的所有实例返回相同的名称。这意味着您一次只能拥有它的一个注册实例 - 任何后续注册都将失败(默默地!)。

您提到在每次测试结束时清除 IdlingResources,但如果您一次注册它的多个实例,则需要确保每个实例都有唯一的名称。如果您在单个 test 中注册 IRViewVisible 的多个实例,您的问题尚不清楚。

至于你的最后一个问题:是的,这是可能的。Android 不会在测试运行之间完全关闭应用程序 - 只是关闭活动。可能导致问题的常见情况:

  • 无法清除持久状态(保存的数据)。
  • 无法清除全局状态 - 例如静态变量/单例
  • 不等待后台线程完成运行。

顺便说一句,值得注意的是,您只能调用onTransitionToIdle()inside isIdleNow()。这是可行的(感谢 @Be_Negative 的提醒!),但它可能会大大减慢你的测试速度,因为 Espresso 只会isIdleNow()每隔几秒轮询一次。onTransitionToIdle()如果视图一变得可见就调用,它应该会大大加快速度。

我自己需要类似于你的 IRViewVisible 的东西,这是我的努力