如何在Espresso测试中重新启动Android应用程序?

3

我正在使用Kotlin编写Espresso进行UI测试自动化。 我正在尝试找到一种合适的方法,在测试期间重新启动应用程序并再次启动它,因此测试场景如下:

  • 启动应用程序,进入登录页面
  • 强制关闭应用程序并再次打开(基本上是重新启动)
  • 检查一些东西等等

我们的UI测试组织方式如下: 有一个测试类,其中我有规则

val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java)
        .putExtra(UI_TEST_INTENT, true)

@get:Rule
val rule = ActivityScenarioRule<MainActivity>(intent)

这个类中有Before/After函数和测试函数。

我想要的是在另一个单独的类中拥有通用的restartApp函数,比如说TestUtils类,并且可以在任何需要的时候调用它。

到目前为止,我还没有找到解决方案。在stackoverflow上有一些类似的问题,但我不确定我理解如何使用我找到的答案,例如:

with(activityRule) {
finishActivity()
launchActivity(null)

由于ActivityTestRule已经过时,建议使用ActivityScenarioRule,因此我尝试了以下内容:

@get:Rule
val rule = ActivityScenarioRule<MainActivity>(intent)

private fun restart() {
    rule.scenario.close()
    rule.scenario.recreate()
}

但是它会出现java.lang.NullPointerException错误

另一个选项是

private fun restart() {
    pressBackUnconditionally()
    Intents.release()
    ActivityScenario.launch<MainActivity>(intent)
}

应用程序重启后工作,但我无法与应用程序交互,因为现在有两个意图在运行,原因未知。

能够得到一个可以使用的答案会很好(我对Espresso还很陌生)。

干杯

2个回答

1
解决方案已找到:

private fun restart() {
    Intents.release()
    rule.scenario.close()
    Intents.init()
    ActivityScenario.launch<MainActivity>(intent)
}

1
感谢分享。 - Alex Krupa
1
activityRule.scenario.recreate()足够了吗?这意味着它会关闭应用程序并重新打开,还是我漏掉了什么? - Tornike Kikalishvili
UI_TEST_INTENT 是什么意思?它的用途是什么?它是否清除单例实例? - Venkataramanan
这似乎没有再次初始化应用程序类...我希望所有的单例以及应用程序类都能够重新创建。有没有什么方法可以实现这个用例? - Venkataramanan

0

看起来作者的答案有一些多余的代码。以下就足够了

activityScenarioRule.scenario.close() 
ActivityScenario.launch(YourActivity::class.java, null)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接