造数工厂是什么
测试数据工厂用代码生成「默认合法、按需覆盖」的测试对象:工厂函数或 Builder 提供全套合理默认值,用例只声明真正关心的字段(比如只把金额改成负数)。相比手工拼 JSON 或共享一份大 fixture,它让「这条用例为什么特殊」一目了然,也避免字段联动修改时的批量返工。
基本信息
| 形态 | 工厂函数、Builder 模式、Object Mother、Faker 随机数据 |
|---|---|
| 核心原则 | 默认值合法、覆盖要显式、字段联动集中管理 |
| 唯一性 | 订单号、手机号用序列或随机保证不互撞 |
| 隔离 | 每条用例自建数据,不共享可变对象 |
| 清理 | 事务回滚或按「测试前缀」批量清理 |
| 语言生态 | Java Builder、Python factory_boy 与 Faker、JS 各类工厂库 |
最小示例
最小示例
def make_order(amount=100, sku="SKU-1", status="待支付", phone=None):
return {"sku": sku, "amount": amount, "status": status,
"phone": phone or next_phone()} # 默认值全部合法
def test_negative_amount_rejected():
order = make_order(amount=-1) # 只覆盖关心的字段
assert submit(order).code == "AMOUNT_INVALID"典型使用场景
- 用例只关心一两个字段:其余全部走默认值,意图突出
- 字段联动变更:新增必填字段时只改工厂一处
- 批量造数:压测、列表分页、大数据量场景
- 随机数据加种子:模拟真实分布且失败可复现
- 跨用例独立造数:并行执行时互不撞数据
- 清理策略统一:造数带测试前缀,删数按前缀圈定
造数方式对比
| 方式 | 优点 | 坑 |
|---|---|---|
| 手写字面量 | 直观、无抽象 | 复制粘贴,一处变更处处返工 |
| 共享 fixture | 省事 | 用例互相污染,改一处惊动全量 |
| 工厂函数 | 默认加覆盖,意图清晰 | 默认值要跟上业务规则 |
| 随机数据 | 贴近真实分布 | 无种子则失败无法复现 |
随机数据要能复现:记录种子;对断言重要的字段不要用随机值,随机只用于无关维度。
清理按「测试前缀」圈定范围:绝对不要用模糊条件删除数据,误伤存量数据的代价极高。
工厂的默认值就是团队对「合法数据」的共识:它过期了,成批用例会以诡异方式失败,维护节奏要跟上业务变更。