47

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

4

4 回答 4

46

对的,这是可能的。在他们在这里演示的示例之一中https://github.com/googlesamples/android-testing/blob/master/ui/espresso/BasicSample/app/src/androidTest/java/com/example/android/testing/ espresso/BasicSample/ChangeTextBehaviorTest.java

@Test
public void changeText_newActivity() {
    // Type text and then press the button.
    onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED),
            closeSoftKeyboard());
    onView(withId(R.id.activityChangeTextBtn)).perform(click());

    // This view is in a different Activity, no need to tell Espresso.
    onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED)));
}

阅读内联评论。

等待新活动加载由 Espresso 隐式处理。

于 2013-12-20T04:25:54.157 回答
10

绝对有可能编写跨多个活动的 Espresso(或任何基于仪器的)测试。您必须从一个 Activity 开始,但可以通过应用程序的 UI 导航到其他 Activity。唯一需要注意的是 - 由于安全限制,测试流程必须保留在您的应用程序进程中。

于 2013-12-10T06:24:26.873 回答
8

我已经像这样测试过:

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

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

于 2013-12-31T05:30:39.440 回答
7

假设您有两个活动: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"))));
    }

}

因此,您唯一需要注意的是,您应该从 ActivityInstrumentationTestCase2< FirstActivity > 扩展测试类,并在构造函数中调用 super( FirstActivity .class)。

上面的例子相当简单。

高级示例(当 startActivityForResult 发生时):

有时编写测试真的很令人困惑,您仍然有两个活动 A 和 B,并且应用程序流程与上面的不同:

  1. 用户对活动 A 什么都不做,但是活动 A 调用 startActivityForResult 来启动活动 B;
  2. 然后用户进行一些输入并点击活动 B(这部分是真正的测试);
  3. 最后活动 B 退出,它调用 setResult 并恢复活动 A(您需要在此处验证结果)。

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

于 2014-09-12T10:41:18.967 回答