安卓Espresso不等待片段加载完成

13

我刚开始使用Espresso来测试Android应用,但是我遇到了一些问题。我有一个带有按钮的Activity,以通常的方式替换片段:

public void onClick(View v) {
    final FragmentTransaction t = getFragmentManager().beginTransaction();
    t.setCustomAnimations(R.animator.fragment_slide_in_up, 0);
    t.replace(R.id.fragment_container,
        LogInFragment.newInstance(), LogInFragment.TAG)
        .addToBackStack(LogInFragment.TAG);
    t.commit();
}

在我的测试中,我点击发送新片段的按钮,然后只需检查新片段是否可见。
onView(withId(R.id.login_btn))
    .perform(click());
Thread.sleep(500);
onView(withId(R.id.email_input))
    .check(matches(isDisplayed()));

如果我从测试中去掉Thread.sleep(),那么即使我从Activity代码中移除了setCustomAnimations(),测试也会失败。
按照说明,我手机上所有的动画都已关闭。我的理解是Espresso知道UI线程状态,并且会等待一切准备就绪。但是,如果我执行onView(withId(R.id.widgetOnNewFragment)),它每次都会崩溃。我需要在显示新片段时每次都添加Thread.sleep(500)
我是否漏掉了什么?我认为我的测试代码不应该添加数十个Thread.sleep()

3
使用 IdlingResource - Honza Musil
1
根据 https://stackoverflow.com/questions/34503616/android-espresso-idlingresources-and-fragment-activity-transitions?rq=1 ,FragmentActivity 转换发生在主线程上,因此我们不需要实现任何 IdlingResource - pvd
1个回答

8
当Espresso框架“等待”某些主UI线程活动时,动画需要使用IdlingResource方法(如Honza所建议的)。
很好的教程介绍这个概念,甚至还有详细实现
实际上,由于动画很少对UI的功能测试产生影响,大多数开发人员禁用了动画。在我看来,这是一种反模式,因为它不能映射到真实用户体验(大多数人购买手机并使用默认设置)。这是你需要自己做出的决定。如果您想将动画包括在您的功能要求中,则有方法,但这需要您重新实现和重写您的测试。

1
那么执行fragmentTransaction.replace()总是会有动画效果,并且总是需要一个IdlingResource吗? - Ken DeLong
是的。我的经验是fragmentTransaction.commit()是异步操作,不会阻塞Espresso的执行。你尝试过.commitNow()吗?文档在这里讨论了FragmentTransaction使用的异步性质:https://developer.android.com/reference/android/app/FragmentTransaction.html - Paul Bruce
1
移除动画是一种反模式,但如果最终测试是由人手工完成的,那就不是问题。我发现添加一层非自动化测试很有用,可以感受到用户与应用程序的交互,并找到一些不容易被自动化测试检测到的故障。 - MiguelSlv
1
在我看来,为了测试目的而修改生产代码也是一种反模式。 - R. Rincón

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接