Android Espresso不会等待片段加载

Ken*_*ong 7 android android-espresso

我刚开始使用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();
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我单击发送新片段的按钮,然后检查新片段是否可见.

onView(withId(R.id.login_btn))
    .perform(click());
Thread.sleep(500);
onView(withId(R.id.email_input))
    .check(matches(isDisplayed()));
Run Code Online (Sandbox Code Playgroud)

如果我Thread.sleep()从测试中删除,测试将失败,即使我setCustomAnimations()从Activity代码中删除了.

根据说明,我的手机上的所有动画都已关闭.我的理解是,Espresso知道UI线程状态,并会等到一切准备就绪.但如果我这样做onView(withId(R.id.widgetOnNewFragment)),每次都会爆炸.我Thread.sleep(500)每次显示一个新片段时都需要添加一个.

我错过了什么吗?我想我不应该在我的测试代码中添加几十个Thread.sleep().

Pau*_*uce 8

虽然 Espresso 框架“等待”某些主 UI 线程活动,但动画需要 IdlingResource 方法(如 Honza 建议的那样)。

有关于这个概念的很好的教程,甚至是详细的实现

实际上,由于动画很少影响 UI 的功能测试,因此大多数开发人员禁用动画。IMO,这是一种反模式,因为它没有映射到真实的用户体验(大多数人购买手机并使用默认设置)。这是您必须自己做出的决定。如果您想将动画作为您的功能需求的一部分,有一些方法,但它需要您重新实现和重写您的测试。