我有一个托管片段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(___)
之前插入onView(withText(__))
时,测试才会通过。
我相信更好的技术是用Espresso IdlingResource
替换Thread.sleep(),但我不确定如何将它与视图动画线程合并。理想情况下,我想将上述测试用例重写为
@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());
}
答案 0 :(得分:6)
Espresso将在执行操作之前等待主线程变为空闲。 Fragment
和Activity
转换发生在主线程上,因此您不需要实现任何IdlingResource
。这里发生的事情是过渡动画导致Espresso与主线程和测试线程的同步导致了瑕疵。如Espresso setup instructions中所述,您应该在用于测试的设备上禁用系统动画。
通常,Thread.sleep
语句是测试的不良做法,会导致测试不稳定和缓慢。 Espresso的设计正是为了解决Android上的这个问题。在GTAC 2013上查看Valera Zakharov对问题when introducing Espresso的解释。