Android Espresso IdlingResources和Fragment / Activity Transitions

时间:2015-12-29 02:34:22

标签: android android-fragments android-transitions android-espresso

我有一个托管片段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());
}

1 个答案:

答案 0 :(得分:6)

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

通常,Thread.sleep语句是测试的不良做法,会导致测试不稳定和缓慢。 Espresso的设计正是为了解决Android上的这个问题。在GTAC 2013上查看Valera Zakharov对问题when introducing Espresso的解释。