如何在进行网络操作之前​​让Espresso运行UI测试?

时间:2016-03-04 22:15:41

标签: android android-espresso

我正在测试包含多个活动的应用程序的快乐路径。为了简单起见,假设我有三个活动。

  1. 我可以点击第一个活动中的按钮(通过Espresso)
  2. Seconds活动根据传入的第一个活动数据创建Booking对象,并向服务器发送请求。如果服务器返回成功,则显示第三个活动。
  3. 显示第三个活动,让用户现在预订成功。
  4. 我的问题是第二步:

    {
    ...
    // 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:没有视图   层次结构找到匹配:用id:com.my.package:id / title如果   目标视图不是视图层次结构的一部分,您可能需要使用   Espresso.onData从以下之一加载它   AdapterViews:com.google.maps.api.android.lib6.e.n {291fbd0f G.ED..C。   ......一世。 0,0-0,0}

    背后的原因是(我认为至少)Espresso框架等待当前消息队列中的UI事件进行处理,并在进入下一个测试操作并且不使用任何时间同步之前完成默认的AsyncTasks。因此,一旦我的后端发送sucess,当Espresso尝试运行secondActivity_checkInitialViewsState()时,该应用会显示第三个屏幕并显示该错误。

    所以我的问题是,有没有办法让Espresso首先运行这个方法(即使在不同的线程中)。

1 个答案:

答案 0 :(得分:0)

Espresso并不是真正意味着在这样的活动中进行测试,它意味着单独测试一个Activity,否则你最终会得到片状测试。这就是Google为我们创建ActivityTestRule使用的原因。您的“快乐路径”测试应该是三种不同的Espresso测试类:

第一个测试应该测试按下按钮启动第二个Activity,使用espresso-intents:

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

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

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