2017-03-31 115 views
3

我刚开始使用Espresso来测试Android应用程序,但我遇到了一些麻烦。我有一个按钮,以通常的方式取代片段的活动:Android Espresso不会等待片段加载

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(),测试失败,即使我从活动代码中删除setCustomAnimations()

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

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

+1

使用IdlingResource –

回答

3

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

关于这个概念还有good tutorials,即使是detailed implementations

实际上,由于动画很少涉及UI的功能测试,因此大多数开发人员都会禁用动画。国际海事组织,这是一个anti-pattern,因为它没有映射到真正的用户体验(大多数人购买手机并使用默认设置)。这是你必须做出的决定。如果您想将动画作为功能需求的一部分,那么有ways,但它需要您重新实现和重写您的测试。

+0

所以做一个fragmentTransaction.replace()总是一个动画,并且总是需要一个IdlingResource? –

+0

是的。我的经验是,fragmentTransaction.commit()对主线程是异步的,并且不会阻止Espresso执行。你尝试过.commitNow()吗?该文档讨论了FragmentTransaction在这里的异步性质:https://developer.android.com/reference/android/app/FragmentTransaction.html –

+0

真棒,感谢您的澄清。 –