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

标签 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;
}
}

如果我有任何错误,请纠正我(有时在我看来,我的 IdlingResources 无法正常工作)。 我像这样在 setUp() 中注册空闲资源:

IRViewVisible ir = new IRViewVisible(View v);
Espresso.registerIdlingResources(ir).

在 tearDown() 上注销它。

我找到了 this article (有一个名为“注册一个与 Activity 实例绑定(bind)的组件”的部分)——我不使用他的模式,但我检查了注册后设置为 IdlingResource 的 View 的哈希码(在每个方法中),它不是同一个 View ——所有的哈希值都是不同的。

另一个问题:一个测试类(它的结果)不能对另一个测试类产生任何影响,是吗?

最佳答案

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

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

关于您的最后一个问题:是的,这是可能的。 Android 不会在测试运行之间完全关闭应用程序——只是关闭 Activity 。可能导致问题的常见事情:

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

顺便说一句,值得注意的是您只在 isIdleNow() 中调用了 onTransitionToIdle()。这可行(感谢@Be_Negative 的提醒!)但它可能会大大减慢您的测试速度,因为 Espresso 只会每隔几秒轮询一次 isIdleNow()。如果您在 View 可见时立即调用 onTransitionToIdle(),它应该会大大加快处理速度。

我自己需要类似于您的 IRViewVisible 的东西,here's my effort .

关于android - 在 Espresso Android 中使用 IdlingResource 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012607/

相关文章:

java - 如何使用数组将 csv 转换为 json

java - AppCompatImageView 无法转换为 ViewGroup

android - 如何在多个功能模块中访问同一个用例

android - 在 listview 上过滤消失列表项,同时在 edittext 中输入内容

testing - 自动创建测试计划

android - 使 android espresso 测试根据其运行环境运行

javascript - 使用身份验证登录 frisby 请求 header 中的参数

c# - 使用 StreamWriter 作为参数之一对 void 方法进行单元测试

gradle - java.lang.ClassNotFoundException : Didn't find class “xxx.xxx.MainActivityTest.java” on path: DexPathList

android - 用 Espresso 测试多项 Activity