如何使用 launchActivity 将测试从单个测试套件中的包中的活动恢复的测试与其他测试一起进行

How to keep tests that test recovery of activities from a bundle in single test suite with other tests using launchActivity

我有一个 android 应用程序的测试套件,用于测试多个场景。对于他们中的大多数人来说,使用 AndroidX 测试框架的 launchActivity 是有意义的。

在同一个套件中,我还有测试从捆绑包中恢复活动的测试。这些测试需要在开发人员选项中启用 `"Don't keep activities",因为只有这样才能直接进行设置,以便使用非空的 savedInstanceState 调用 onCreate。

但是,当在开发人员选项中启用 Don't keep activities 时,launchActivity 会失败并出现 IllegalStateException 并显示以下堆栈跟踪:

java.lang.IllegalStateException: "Don't keep activities" developer options must be disabled for ActivityScenario
at androidx.test.internal.util.Checks.checkState(Checks.java:96)
at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:218)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:190)
[...]

我想知道为什么会存在这种限制以及如何处理?因为当 activity 从实例状态恢复时它会阻止测试场景。

即使 UiAutomator 用于这些特定的测试用例测试 activity 从实例状态的恢复,测试也不能在同一个 device/emulator 上真正 运行,因为这个设置是系统设置。

或者,可以在测试前后打开和关闭设置,但这只能在根设备上工作,或者需要使用 UiAutomator 来翻转系统设置开关,这非常慢。

事实证明ActivityScenario's recreate涵盖了这个特定场景:

A current Activity will be destroyed after its data is saved into Bundle with onSaveInstanceState(Bundle), then it creates a new Activity with the saved Bundle. After this method call, it is ensured that the Activity state goes back to the same state as its previous state.