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
相关产品推荐
相关产品推荐

