2016-03-04 67 views
0

我正在测试包含多项活动的应用程序的快乐路径。为了简单起见,假设我有三项活动。如何在进行网络操作之前​​问Espresso运行UI测试?

  1. 没有在第一个活动一个按钮,我可以点击它(通过咖啡)
  2. 秒活动是基于什么数据的第一项活动,并通过向服务器发送一个请求创建的预订对象。如果服务器返回成功则显示第三个活动。
  3. 显示第三个活动,让用户现在预订成功。

我的问题是在第二个步骤:

{ 
... 
// 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先运行这个方法(即使在不同的线程中)。

回答

0

意式浓缩咖啡并不是真正意义上的跨活动测试,它意味着要单独测试一个活动,否则最终会出现片状测试。这就是Google为我们创造了ActivityTestRule的原因。你的“幸福路”测试应该真正三种不同的咖啡测试类:

第一个测试应该测试按下按钮启动的第二个活动,用浓咖啡意图:

intended(hasComponent(new ComponentName(getTargetContext(), SecondActivity.class)));

第二次测试应该测试你的步骤2.你可以模拟发送到活动的意图数据。同样,您应该检查第三个活动是否已启动。

最后的测试应该测试你的第3步。

+0

感谢您的观点@trevor。我实际上是按照你所建议的方式开始的,但是它有很多困难,包括冗余代码,比如每个活动都有'intended',每个活动都有依赖注入等。所以我决定模拟用户在应用中做什么。通过这种方式,我创建并完全按照用户的操作方式进行对象并在活动中传递此对象,并在每个屏幕中检查预订对象的状态。这有助于我们轻松找到错误,尽管您建议的方式有其自身的优势。 – Hesam