首页/开发/软件测试速查/测试数据工厂
自动化测试66 条

测试数据工厂

测试数据工厂(Object Mother/Builder)把「构造一份合法数据」的代码集中管理,用例只声明差异字段;数据需求变化时改一处而不是几十个用例。

软件测试速查开发更新于 2026-10-13

造数工厂是什么

测试数据工厂用代码生成「默认合法、按需覆盖」的测试对象:工厂函数或 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省事用例互相污染,改一处惊动全量
工厂函数默认加覆盖,意图清晰默认值要跟上业务规则
随机数据贴近真实分布无种子则失败无法复现
随机数据要能复现:记录种子;对断言重要的字段不要用随机值,随机只用于无关维度。
清理按「测试前缀」圈定范围:绝对不要用模糊条件删除数据,误伤存量数据的代价极高。
工厂的默认值就是团队对「合法数据」的共识:它过期了,成批用例会以诡异方式失败,维护节奏要跟上业务变更。

易错点

  • 共享一份可变 fixture:用例 A 改了字段,用例 B 莫名失败,改为每条用例自建
  • 手写重复 JSON:字段变更全量返工,工厂化后只改一处
  • 随机数据无种子:CI 偶发失败无法复现,等于黑盒
  • 工厂默认值过期:业务新增必填字段后大批用例诡异失败,先查工厂
  • 造数不清理:测试库膨胀与软删数据堆积,影响后续查询与性能

数据来源与参考

  • Martin Fowler《Object Mother》(martinfowler.com)
  • pytest 官方文档(fixture 与数据准备)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌