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

Espresso技术问题:如何在不终止/崩溃测试时彻底杀死应用?

彻底关闭并重启应用的自动化测试方案

问题背景

我正在结合Espresso与UiAutomator做应用自动化测试,部分功能受登录后更新的功能标志控制。应用从服务器获取初始数据包后功能标志会开启,这时需要彻底杀死应用并重启才能让新标志生效。

试过两种方法都没彻底关闭应用:

  • 用ActivityScenario的代码,应用仍留在最近应用列表:
Intents.release()
scenarioRule.scenario.close()
Intents.init()
ActivityScenario.launch<MyActivity>(intent)
  • 加了UiAutomator的代码,还是没彻底关闭:
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.pressRecentApps()
device.findObject(UiSelector().descriptionContains("my app's name")).swipeUp(100)

但手动执行登录→打开最近应用→上滑关闭应用的步骤是有效的。

可行解决方案

要彻底搞定这个问题,得同时终止应用进程+清除最近应用条目,完整代码如下:

// 1. 直接终止应用进程,比关闭Activity更彻底
val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
val packageName = targetContext.packageName
val uiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
uiAutomation.forceStopPackage(packageName)

// 2. 清除最近应用里的条目(适配不同设备)
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.pressRecentApps()
// 给点时间让最近应用列表加载出来,可根据设备性能调整时长
Thread.sleep(1000)
val appEntry = device.findObject(UiSelector().descriptionContains("my app's name"))
if (appEntry.exists()) {
    // 大部分现代Android设备用向上滑动关闭,部分设备可能需要左右滑,自行调整
    appEntry.swipeUp(500)
}
// 返回主屏幕
device.pressHome()

// 3. 重启应用
Intents.init()
val launchIntent = targetContext.packageManager.getLaunchIntentForPackage(packageName)
ActivityScenario.launch<MyActivity>(launchIntent)

注意事项

  • forceStopPackage()是系统级别的进程终止,能确保应用完全停止,不会在后台残留。
  • 硬编码的Thread.sleep()可以换成Espresso的IdlingResource来实现等待,更稳定。
  • 不同品牌设备的最近应用关闭手势可能有差异,比如有些是左右滑动,需要根据测试设备调整滑动方向和距离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:41:31