Espresso测试之间如何重置应用或Activity以获得干净测试环境?
Espresso 测试每次运行重置干净环境解决方案
@After 规则能否实现需求的说明
仅靠 @After 规则销毁 Activity 无法完全实现干净环境的要求:你之前尝试的销毁 Activity、关闭 ActivityScenario 的操作,只能清除 Activity 实例本身的状态,应用进程内的全局单例、后台残留任务,以及本地持久化存储的 SharedPreferences、数据库、缓存文件等数据都不会跟随 Activity 销毁而重置,所以会出现没有重置效果的问题。
最优解决方案:Android Test Orchestrator
你找到的 Android Test Orchestrator 是官方推荐的最可靠方案,适配 1.0 及以上版本的 AndroidJUnitRunner,原理是每个测试用例都运行在独立的 Instrumentation 调用进程中,单测结束后直接销毁对应进程,所有状态会被自动完全清理,不需要手动编写任何重置逻辑。
配置方式(模块级 build.gradle)
android { defaultConfig { // 声明使用AndroidJUnitRunner testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 引入Orchestrator依赖 execution "androidx.test:orchestrator:1.4.2" } testOptions { executionOptions { // 开启Orchestrator运行模式 orchestratorEnabled = true } } }
替代方案:手动清理状态
如果暂时不想接入 Orchestrator,可以在 @After 方法中手动执行全量状态清理,需要覆盖以下内容:
- 清空所有 SharedPreferences 存储内容
- 删除/重置应用数据库数据
- 清空应用内部缓存目录、临时文件
- 重置所有全局单例的状态到初始值
- 终止所有后台运行的异步任务、工作线程
该方案维护成本较高,项目复杂度提升后容易出现状态清理遗漏的问题,仅适合小型项目临时使用。
原有代码优化建议
你当前的测试代码中 scenario 实例是在 @Test 方法中初始化的,若测试用例执行过程中出现异常未完成初始化,@After 中调用 scenario.close() 会触发空指针异常,建议将 Activity 启动逻辑统一放到 @Before 方法中执行,保证每个测试用例都会重新启动全新的 Activity 实例。
内容的提问来源于stack exchange,提问作者CCat
相关产品推荐
相关产品推荐

