gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:28:49 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com