我刚刚开始使用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()
,即使我从活动代码中删除setCustomAnimations()
,测试也会失败。
根据说明,我的手机上的所有动画都已关闭。我的理解是,Espresso知道UI线程状态,并会等到一切准备就绪。但如果我做onView(withId(R.id.widgetOnNewFragment))
,它每次都会爆炸。我每次显示新片段时都需要添加Thread.sleep(500)
。
我错过了什么吗?我想我不应该在我的测试代码中添加几十个Thread.sleep()。
答案 0 :(得分:4)
虽然Espresso框架等待'对于某些主要UI线程活动,动画需要IdlingResource方法(如Honza建议的那样)。
这个概念有good tutorials,甚至detailed implementations。
实际上,由于动画很少考虑UI的功能测试,因此大多数开发人员禁用动画。 IMO,这是一个anti-pattern因为它没有映射到真实的用户体验(大多数人购买手机并使用默认设置)。这是你必须做出的决定。如果要将动画作为功能要求的一部分包含在内,则需要ways,但它需要您重新实现并重写测试。