【问题标题】:Testing multiple activities with espresso用浓缩咖啡测试多项活动
【发布时间】:2013-12-06 15:17:41
【问题描述】:

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

【问题讨论】:

    标签: android testing android-espresso


    【解决方案1】:

    是的,这是可能的。在其中一个示例中,他们在这里进行了演示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 隐式处理。

    【讨论】:

    • 现在还可以吗?使用 Espresso 2。我有某种应用程序,当用户按下文件时,它会移动到另一个活动,我需要测试那个 UI。有什么想法吗?
    • @AQU 我已经很久没有和Espresso 合作了。我建议仔细阅读 Espresso 2 的示例。
    • 是的,它现在对我有用。我可以做我想做的所有事情。
    • 好吧,我的测试找不到第二个活动的观点,被碾压了。
    【解决方案2】:

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

    【讨论】:

    • 我如何断言一旦我点击了一个小部件就会打开正确的活动?
    • 像应用程序用户一样 - 断言显示来自该活动的特定视图。
    【解决方案3】:

    我已经像这样测试过:

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

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

    【讨论】:

    • 可能太快了,需要等待活动显示。
    【解决方案4】:

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

    所以你唯一需要关心的是,你应该从 ActivityInstrumentationTestCase2FirstActivity> 扩展测试类,并在你的构造函数。

    上面的例子相当简单。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多