Android 用浓缩咖啡测试多种活动

Android 用浓缩咖啡测试多种活动,android,testing,android-espresso,Android,Testing,Android Espresso,是否可以使用android espresso框架跨多个活动编写测试?完全可以编写跨多个活动的espresso(或任何基于仪器的)测试。您必须从一个活动开始,但可以通过应用程序的UI导航到其他活动。唯一的警告-由于安全限制,测试流必须留在应用程序的进程内。是的,这是可能的。在其中一个样本中,他们在这里演示了这一点 阅读内联注释 等待新活动加载是由浓缩咖啡隐式处理的。我已经进行了如下测试: onView(withId(R.id.hello_visitor)).perform(click()); pr

是否可以使用android espresso框架跨多个活动编写测试?

完全可以编写跨多个活动的espresso(或任何基于仪器的)测试。您必须从一个活动开始,但可以通过应用程序的UI导航到其他活动。唯一的警告-由于安全限制,测试流必须留在应用程序的进程内。

是的,这是可能的。在其中一个样本中,他们在这里演示了这一点

阅读内联注释


等待新活动加载是由浓缩咖啡隐式处理的。

我已经进行了如下测试:

onView(withId(R.id.hello_visitor)).perform(click());
pressBack();
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here

显然,单击操作会启动一个新活动。

假设您有两个活动:HomeActivitySearchResultsActivity。 对于测试,您希望对HomeActivity执行一些操作,并验证SearchResultsActivity的结果。然后,测试将编写如下:

public class SearchTest extends ActivityInstrumentationTestCase2<HomeActivity> {

    public SearchTest() {
        super(HomeActivity.class);
    }

    protected void setUp() throws Exception {
        super.setUp();
        getActivity(); // launch HomeActivity
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testSearch() {
        onView(withId(R.id.edit_text_search_input)).perform(typeText("Hello World"));
        onView(withId(R.id.button_search)).perform(click());
        // at this point, another activity SearchResultsActivity is started
        onView(withId(R.id.text_view_search_result)).check(matches(withText(containsString("Hello World"))));
    }

}
公共类SearchTest扩展了ActivityInstrumentationTestCase2{
公共搜索测试(){
超级(家庭活动类);
}
受保护的void setUp()引发异常{
super.setUp();
getActivity();//启动HomeActivity
}
受保护的void tearDown()引发异常{
super.tearDown();
}
公共void testSearch(){
onView(带id(R.id.edit_text_search_input)).perform(typeText(“Hello World”));
onView(带id(R.id.button_search)).perform(click());
//此时,另一个活动SearchResultsActivity启动
onView(带id(R.id.text\u view\u search\u result))。检查(匹配项(带text(containssString(“Hello World”))));
}
}
因此,您唯一需要关心的是,您应该从ActivityInstrumentationTestCase2扩展测试类,并在构造函数中调用super(FirstActivity.class)

上面的例子相当简单

高级示例(发生startActivityForResult时):

有时编写一个测试确实令人困惑,因为您仍然有两个活动a和B,并且应用程序流程与上面的不同:

  • 用户对活动A不执行任何操作,但活动A调用startActivityForResult以启动活动B
  • 然后用户进行一些输入并点击活动B(这部分是真正的测试)
  • 最后,活动B退出,它调用setResult并恢复活动A(您需要在此处验证结果)

  • 即使整个测试部分发生在活动B上,您可能只需要验证活动A上的一小部分,但是您的测试应该从活动A扩展到活动InstrumentationTestCase2,即活动A,而不是活动B。否则,当测试部分完成时,活动A将不会恢复,您没有机会验证您的结果。

    我如何断言,一旦我单击了一个小部件,就打开了正确的活动?就像应用程序用户所做的那样-断言显示了该活动的特定视图。可能太快了,您需要等待活动显示。现在还可能吗?加浓咖啡2。我有一些类似的应用程序,当用户按下文件时,它会移动到另一个活动,我需要测试该UI。有什么想法吗?@aq我已经很久没有喝浓缩咖啡了。我建议大家看看浓缩咖啡2的例子。是的,它现在对我有用。我能做我想做的所有事情。
    public class SearchTest extends ActivityInstrumentationTestCase2<HomeActivity> {
    
        public SearchTest() {
            super(HomeActivity.class);
        }
    
        protected void setUp() throws Exception {
            super.setUp();
            getActivity(); // launch HomeActivity
        }
    
        protected void tearDown() throws Exception {
            super.tearDown();
        }
    
        public void testSearch() {
            onView(withId(R.id.edit_text_search_input)).perform(typeText("Hello World"));
            onView(withId(R.id.button_search)).perform(click());
            // at this point, another activity SearchResultsActivity is started
            onView(withId(R.id.text_view_search_result)).check(matches(withText(containsString("Hello World"))));
        }
    
    }