【问题标题】:How to test saving and restoring state of an android activity with Espresso?如何使用 Espresso 测试保存和恢复 android 活动的状态?
【发布时间】:2020-08-18 17:46:18
【问题描述】:

有没有办法以编程方式测试活动的保存和恢复状态代码?我的意思是这样做:

How to test code built to save/restore Lifecycle of an Activity? 但以自动化方式。

我已经测试了activity.recreate() 方法,这几乎是我正在搜索的内容,但实际上它不会像我正在终止进程一样重置我的活动字段。所以即使我没有在我的onCreate 方法中实现恢复,我的测试也可以通过(因为我的字段没有改变......)。

我目前正在玩 Espresso v2,我想知道这是否可以通过玩 InstrumentationRegistry.getInstrumentation() 来实现?

【问题讨论】:

    标签: android android-testing android-espresso


    【解决方案1】:

    解决方案是使用activity.recreate() 方法,但不要忘记在此之后添加一个等待空闲状态的断言。 我第一次尝试的问题是我正在编写的测试是这样的:

    instrumentation.runOnMainSync(new Runnable() {
        @Override
        public void run() {
            activity.recreate();
        }
    });
    assertThat(activityTestRule.getActivity().getXXX()).isNull();
    

    XXX 是一个字段,当没有实现保存/恢复状态处理时,我希望该字段为空。但事实并非如此,因为我的断言不是在等待娱乐任务完成。

    所以在我的情况下,当我简单地添加一个 espresso 断言来完成这项工作时,我的问题就解决了,例如通过验证显示 XXX 字段的 TextView 是否为空。

    最后,感谢 Espresso 提供的 UI 线程同步,我的测试可以断言我的活动保存/恢复状态缺失实现可以这样写:

    instrumentation.runOnMainSync(new Runnable() {
        @Override
        public void run() {
            activity.recreate();
        }
    });
    onView(withText("a string depending on XXX value")).check(doesNotExist());
    

    请注意,建议的轮换解决方案也可以完成这项工作,但当我们只想测试活动生命周期时,它可能比activity.recreate() 慢得多。就我而言,这无关紧要,因为我的活动不是针对横向实施的。

    【讨论】:

      【解决方案2】:

      您可以旋转屏幕并验证状态是否已正确保存和恢复。

      private void rotateScreen() {
        Context context = InstrumentationRegistry.getTargetContext();
        int orientation 
          = context.getResources().getConfiguration().orientation;
      
        Activity activity = activityRule.getActivity();
        activity.setRequestedOrientation(
            (orientation == Configuration.ORIENTATION_PORTRAIT) ?
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : 
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      }
      

      完整示例:http://blog.sqisland.com/2015/10/espresso-save-and-restore-state.html

      【讨论】:

      • 这是一个不错的解决方案,但实际上我有一个仅在纵向模式下运行的应用程序,因此它不能应用于我的测试,因为它不会改变方向...
      【解决方案3】:

      Android 提供的测试工具现在提供了一种编写 UI 测试的方法,可以重新创建一个 Activity 来测试保存和恢复流程。请参阅Test your app's activities Android 开发者文档页面中的Recreate the activity 部分。语法示例(取自该页面)如下:

      @RunWith(AndroidJUnit4::class)
      class MyTestSuite {
          @Test fun testEvent() {
              val scenario = launchActivity<MyActivity>()
              scenario.recreate()
          }
      }
      

      【讨论】:

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