使用浓缩咖啡测试多项活动

时间:2013-12-06 15:17:41

标签: android testing android-espresso

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

4 个答案:

答案 0 :(得分:37)

是的,有可能。在其中一个样本中,他们已在此处演示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隐含处理。

答案 1 :(得分:10)

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

答案 2 :(得分:8)

我测试过这个:

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

点击操作显然会启动一项新活动。

答案 3 :(得分:7)

我们假设您有两项活动: HomeActivity SearchResultsActivity 。 对于测试,您希望对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&lt; FirstActivity &gt;扩展测试类,并调用super( FirstActivity .class)你的构造函数。

以上示例相当容易。

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

有时写一个测试真的很混乱,你仍然有两个活动A和B,而且应用程序流程与上面不同:

  1. 用户对活动A不执行任何操作,但活动A调用startActivityForResult启动活动B;
  2. 然后用户对活动B进行一些输入和点击(这部分是真正的测试);
  3. 最后活动B退出,它调用setResult并恢复活动A(你需要在这里验证结果)。
  4. 即使整个测试部分发生在活动B上,您可能只需要验证活动A上的一小部分,但您的测试应该从ActivityInstrumentationTestCase2&lt; ActivityWhoCallsStartActivityForResult &gt;进行扩展。这是活动A,但不是活动B.否则,当测试部分完成后,活动A将无法恢复,您无法验证结果。