You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Espresso测试中应用恢复而非重启及多测试场景重置需求

解决Espresso测试每次从头启动的问题

遇到这种情况太常见了——默认情况下Espresso为了提高测试效率,会尽量保留应用的运行状态,但如果咱们需要每次测试都从干净的初始状态开始,这几个方法绝对管用:

1. 旧版Espresso:用ActivityTestRule手动控制启动

如果你还在使用ActivityTestRule,可以初始化时关闭自动启动,然后在每个测试前清空应用数据再手动启动Activity:

@Rule
val activityRule = ActivityTestRule(MainActivity::class.java, false, false)

@Before
fun setUp() {
    // 彻底清除应用的缓存、存储数据
    InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(
        "pm clear ${InstrumentationRegistry.getTargetContext().packageName}"
    ).close()
    // 手动启动主Activity,确保从头开始
    activityRule.launchActivity(null)
}

2. 新版AndroidX:用ActivityScenarioRule重置场景

对于推荐使用的ActivityScenarioRule,可以在测试前置方法里先清除数据,再重建Activity场景:

@get:Rule
var scenarioRule = ActivityScenarioRule(MainActivity::class.java)

@Before
fun setUp() {
    // 清除应用数据
    InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(
        "pm clear ${InstrumentationRegistry.getTargetContext().packageName}"
    ).close()
    // 重建Activity场景,刷新初始状态
    scenarioRule.scenario.recreate()
}

要是觉得不够彻底,也可以直接关闭当前场景再重新初始化:

@Before
fun setUp() {
    scenarioRule.scenario.close()
    InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(
        "pm clear ${InstrumentationRegistry.getTargetContext().packageName}"
    ).close()
    scenarioRule = ActivityScenarioRule(MainActivity::class.java)
}

3. 批量测试:用Gradle参数一键搞定

如果是通过命令行跑批量测试,直接加个参数就能让所有测试前自动清除数据:

./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.clearPackageData=true

这个参数会让测试运行器在每个测试案例执行前自动清空目标应用的数据,省得在代码里重复写逻辑。

小提醒

如果你的测试不需要完全清除持久化数据(比如SharedPreferences、数据库),只需要重启Activity的话,可以跳过pm clear步骤,只重建Activity场景就行——不过这种情况可能会残留后台状态,得根据你的测试需求灵活选择。

内容的提问来源于stack exchange,提问作者punk_fusion92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:45:20