测试数据库的方案
说明为什么测试应使用独立数据库,并对比独立测试库、共享开发库和事务回滚三类方案。
#type / howto
#status / growing
#tech / dev / test
#resource / database
[!info] related notes
- 前置笔记:
- 相关 MOC: 数据库 MOC
- 相关资源: Docker 创建开发/测试数据库, 数据库中插入大量数据
测试数据库的方案
目标
给自动化测试准备一个可重复、可清理、不会污染开发数据的数据库环境。
前置条件
- 你有需要落到真实数据库的测试
- 你愿意区分开发环境和测试环境
步骤
为什么不要直接复用开发数据库
直接复用开发数据库通常会带来四类问题:
- 测试前清表会删除你正在调试的数据
- 唯一键和外键容易与手工数据冲突
- 测试结果依赖现有数据,不可重复
- 某些删除和回滚测试会直接破坏开发环境
常见方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 独立测试数据库 | 隔离性最好,可重复 | 需要单独准备环境 | 推荐默认方案 |
| 共享开发数据库 | 配置最省事 | 污染数据、冲突多、风险高 | 不推荐 |
| 事务回滚 | 单次测试清理快 | 难覆盖事务逻辑,不适合多进程并发 | 少量特殊场景 |
推荐默认方案
优先使用独立测试数据库:
- 端口独立
- 数据库名独立
- 数据卷独立
- 每次测试前清理数据
如果要进一步提速,可以在 Docker 里为测试数据库使用临时数据卷或内存文件系统。
验证
- 测试运行前后不影响开发数据库
- 测试可重复执行,结果稳定
- 清理数据库的脚本只连接测试库
常见问题
- “只换数据库名”不一定够,很多错误都来自环境变量误连到开发库
- 使用事务回滚时,如果业务本身也有事务,测试隔离往往会变复杂
- 跑集成测试时,验证“真的在用测试数据库”比写清理脚本本身更重要