目标
依赖共享种子库的测试套件是在和自己耦合:一种顺序通过、另一种顺序失败,没人说得清哪条测试拥有哪些行。工厂加每测试作用域能彻底溶解这种耦合;而定期从生产分布刷新的“生产形态”数据集,保证测试面对的边界情况与真实世界保持同步。
步骤要点
- 盘点数据依赖:映射哪些测试读写哪些共享夹具与数据库,暴露导致顺序依赖的耦合点。
- 建实体工厂:提供创建合法实体且字段可覆盖的工厂,测试只声明自己场景的差异部分。
- 按测试圈定数据作用域:每条测试用自己创建的数据(唯一键或每测试 schema),自动删除或回滚,消除跨测试耦合。
- 版本化核心夹具:少数复杂真实世界夹具作为带出处说明的版本化文件,经评审变更。
- 定期刷新生产形态集:按计划从生产模式重新生成大规模匿名或合成数据,保持基数与边界分布的新鲜度。
排错提示
乱序就挂是共享可变夹具的铁证,工厂加每测试清理能让随机顺序连跑全绿;测试自己造出了非法实体是工厂没编码领域约束,必填与合法组合要进工厂默认值;没人敢删的老夹具是缺出处记录,标注来源与导出日期让退役变成有日期的决策。
适用边界
工厂默认值需要随领域演进维护,schema 变更时工厂要同步升级;大规模生产形态数据集的生成有计算成本,刷新频率要与漂移容忍度匹配。
代码示例
before: shared seed (dev-db, 1.2M rows)
test A updates user #42 -> test B (later) sees
changed state -> order-dependent failures
after:
factory: makeUser({role: 'admin', tier: 2})
test creates its own user (unique key: test-<uuid>)
teardown: delete by key (or per-test schema)
parallel: 4 shards, zero collisions
order: randomized x 20 runs, all green
fixtures (versioned, reviewed):
complex-refund-case.json (provenance: INC-2940)
seasonal-pricing.json (prod export 2026-09, masked)
refresh: nightly synth set from prod distributions