我正在测试包含多项活动的应用程序的快乐路径。为了简单起见,假设我有三项活动。如何在进行网络操作之前问Espresso运行UI测试?
- 没有在第一个活动一个按钮,我可以点击它(通过咖啡)
- 秒活动是基于什么数据的第一项活动,并通过向服务器发送一个请求创建的预订对象。如果服务器返回成功则显示第三个活动。
- 显示第三个活动,让用户现在预订成功。
我的问题是在第二个步骤:
{
...
// first activity
onView(withId(R.id.btnBooking)).perform(click());
// second activity
secondActivity_checkInitialViewsState();
// third activity
thirdActivity_checkInitialViewsState();
}
private void secondActivity_checkInitialViewsState()
{
// viewsMustBeVisible
onView(withId(R.id.title)).check(matches(isCompletelyDisplayed())); // <= Error
onView(withId(R.id.sonarView)).check(matches(isCompletelyDisplayed()));
onView(withId(R.id.cancelBooking)).check(matches(isCompletelyDisplayed()));
onView(withId(R.id.listView)).check(matches(isDisplayed()));
// viewsMustBeEnabled
onView(withId(R.id.tvNoServiceFound)).check(matches(not(isCompletelyDisplayed())));
onView(withId(R.id.tvNextSearch)).check(matches(not(isCompletelyDisplayed())));
}
我越来越运行测试后,下面我的日志错误:
android.support.test.espresso.NoMatchingViewException:在 层次结构中找不到匹配的视图:with id:com.my.package:id/title如果 目标视图不是视图层次结构的一部分,则可能需要使用 Espresso.onData从其中一个fol降低 AdapterViews:com.google.maps.api.android.lib6.e.n {291fbd0f G.ED..C。 ......我。 0,0-0,0}
背后的原因是(我认为至少)咖啡框架等待在当前消息队列UI事件处理和默认AsyncTasks完成它移动到下一个前测试操作并且不使用任何时间同步。因此,一旦我的后端发送sucess
,应用程序将显示第三个屏幕,而Espresso尝试运行secondActivity_checkInitialViewsState()
并显示错误。
所以我的问题是,有没有什么办法可以让Espresso先运行这个方法(即使在不同的线程中)。
感谢您的观点@trevor。我实际上是按照你所建议的方式开始的,但是它有很多困难,包括冗余代码,比如每个活动都有'intended',每个活动都有依赖注入等。所以我决定模拟用户在应用中做什么。通过这种方式,我创建并完全按照用户的操作方式进行对象并在活动中传递此对象,并在每个屏幕中检查预订对象的状态。这有助于我们轻松找到错误,尽管您建议的方式有其自身的优势。 – Hesam