使用 deletedatabase 彻底删除数据库是保证测试隔离性的最可靠方式,需封装为 promise 并监听 onsuccess/onerror;注意避免 onblocked 阻塞及 ci 环境中 indexeddb 不可用问题。

在自动化测试流水线中使用 IndexedDB 时,清理和重置数据库环境是保证测试隔离性与可靠性的关键。IndexedDB 是异步、事务型的客户端存储,不能像内存变量那样直接赋值清空,也不能通过简单删除对象实现重置——必须显式调用 deleteDatabase 或重建 object store。
使用 deleteDatabase 彻底清除数据库
最可靠的方式是在每个测试套件(或每个测试用例)开始前,主动删除目标数据库,确保从干净状态启动:
- 调用
window.indexedDB.deleteDatabase('your-db-name')返回一个IDBRequest对象,需监听onsuccess和onerror事件 - 建议配合 Promise 封装,便于在 async/await 测试逻辑中等待删除完成
- 注意:若数据库正被其他上下文(如另一个标签页、Service Worker)打开,删除会挂起,直到所有连接关闭;测试环境中应确保无残留连接
在 Jest 或 Vitest 中封装清理工具函数
以 Jest 为例,在 beforeEach 或 beforeAll 中执行清理,并在 afterEach 中可选验证是否已清空:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义
clearIndexedDB(name)函数,返回 Promise,内部处理 deleteDatabase 的 success/error - 在测试文件顶部统一调用:
beforeEach(() => clearIndexedDB('test-db')) - Vitest 用户可利用
beforeEach+vi.hoisted提前注入 mock 或清理逻辑,避免跨测试污染
避免“假清理”:检查 open 请求是否阻塞旧版本
IndexedDB 的 indexedDB.open(dbName, version) 若传入的 version 小于当前数据库版本,会触发 onblocked 事件而非自动升级或覆盖——这常导致测试卡住或误判成功:
- 务必在
open前确保数据库已被deleteDatabase删除,或显式指定更高 version 触发 upgrade(但升级需手动删 store,不如直接删库干净) - 在
open请求中监听onblocked并 fail 测试,防止流水线静默失败 - 调试时可在 DevTools → Application → Storage → IndexedDB 查看实际存在的数据库列表,确认清理生效
CI 环境注意事项
某些 CI 浏览器环境(如 Headless Chrome via Puppeteer)可能默认禁用 IndexedDB,或因沙箱策略限制持久化行为:
- 启动浏览器时添加
--disable-features=IsolateOrigins,site-per-process可缓解部分隔离问题(仅限调试) - 更稳妥做法:在 CI 配置中启用
--enable-blink-features=IDBObserver(非必需),并确保运行时有完整 DOM 上下文(例如不使用 jsdom,而用真实 Chromium 实例) - 若只能用 jsdom(无 IndexedDB 支持),需 mock
window.indexedDB全局对象,用内存 Map 模拟基本读写,但这类 mock 不替代真实环境验证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










