gpt4 book ai didi

Android Espresso IdlingResources 和 fragment/Activity 转换

转载 作者:太空狗 更新时间:2023-10-29 16:14:15 24 4
gpt4 key购买 nike

我有一个托管 fragment F1 的 Activity 。单击按钮后,F1 将替换为另一个 fragment F2。按下后退按钮时,应用会通过退出过渡动画从 F2 返回到 F1。

我的 Espresso 测试用例大致如下所示:

@Test
public void pressingBackRestorePreviousFragment() {
// we are in F1 and about to switch to F2
onView(withId(R.id.the_button)).perform(click());

// we are now in F2, pressing back should "return" to F1
Espresso.pressBack();

onView(withText("A specific text in F1")).check(matches(isDisplayed());
}

当测试用例以逐步 Debug模式运行时,上述测试通过。但是在正常运行模式下,它失败了。只有当我在 onView(withText(__)) 之前插入 Thread.sleep(___) 时,测试才会通过。

我认为更好的技术是用 Espresso IdlingResource 替换 Thread.sleep(),但我不确定如何将它与 View 动画线程合并。理想情况下,我想将上面的测试用例重写为

@Test
public void pressingBackRestorePreviousFragment() {
// we are in F1 and about to switch to F2
onView(withId(R.id.the_button)).perform(click());

// we are now in F2, pressing back should "return" to F1
Espresso.pressBack();

onView(isRoot()).perform(waitForAnimCompletion());

onView(withText("A specific text in F1")).check(matches(isDisplayed());
}

最佳答案

Espresso 会等待主线程空闲后再执行操作。 FragmentActivity 转换发生在主线程上,因此您不需要实现任何 IdlingResource。这里发生的事情是,过渡动画导致 Espresso 主线程和测试线程的同步不稳定。如 Espresso setup instructions 中所述,您应该在用于测试的设备上禁用系统动画。

一般来说,Thread.sleep 语句是不好的测试实践,会导致不稳定和缓慢的测试。 Espresso 正是为解决 Android 上的这个问题而设计的。查看 Valera Zakharov 对问题的解释 when introducing Espresso在 GTAC 2013 上。

关于Android Espresso IdlingResources 和 fragment/Activity 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503616/

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