我有一个托管片段 F1 的活动。单击按钮后,F1 被另一个片段 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());
}
当测试用例运行时逐步调试模式,上述测试通过。但在正常运行模式, 它失败。仅当我插入时Thread.sleep(___)
before onView(withText(__))
测试会通过。
我相信更好的技术是将 Thread.sleep() 替换为Espresso IdlingResource
,但我不确定如何将其与视图动画线程合并。理想情况下,我想将上面的测试用例重写为
@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 将等待主线程空闲后再执行操作。Fragment
and Activity
转换发生在主线程上,因此您不需要实现任何IdlingResource
s。这里发生的情况是,过渡动画导致 Espresso 主线程和测试线程的同步不稳定。正如在浓缩咖啡设置说明 https://google.github.io/android-testing-support-library/docs/espresso/setup/,您应该在用于测试的设备上禁用系统动画。
一般来说,Thread.sleep
语句对于测试来说是不好的做法,并且会导致测试不稳定和缓慢。 Espresso 正是为了解决 Android 上的这个问题而设计的。查看 Valera Zakharov 对问题的解释在介绍浓缩咖啡时 https://www.youtube.com/watch?v=T7ugmCuNxDU在 2013 年 GTAC 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)