← 中文资源

简体中文版本

用 Faker 生成逼真的测试数据

生成带可信分布、固定种子可复现、外键完整的一百万行数据集,并用 COPY 灌入数据库。

阅读英文原文

目标

两百行玩具数据掩盖了规模带来的一切问题:翻不到第二页的分页、被优化器无视的索引、让 GROUP BY 失真的均匀分布。固定种子的 Faker 能生成百万行可信数据且每次完全一致,weighted 辅助函数保持倾斜真实。经 COPY 灌库后,几分钟就拥有让性能测试变得有意义的数据集。

步骤要点

  1. faker.seed(20261022) 固定种子,任何机器每次运行产出字节级一致的数据,缺陷可精确复现。
  2. 先生成父表(5 万客户,国家按 55/25/15/5 加权),再按每客户 0-12 单的倾斜展开子表订单,保证外键完整。
  3. 输出 CSV 而不是 INSERT 语句,体积小一个数量级且走最快装载路径。
  4. \copy 灌库后验证行数与 DISTINCT 客户数与生成端一致、外键全部可解析。
  5. 按国家 GROUP BY 断言分布近似权重,确认倾斜真实落地而不是均匀抹平。

排错提示

日期跑到未来是 Faker 默认参考时间漂移,用 faker.date.recent({ days: 90 }) 钉住范围;数据可复现却不真实说明用了均匀随机,枚举要加权、金额与日期要用真实值域;外键装载失败就按依赖序生成并先装父表,或全部 staging 后再启用约束校验。

适用边界

合成数据无法复刻生产相关性,分析级测试仍应以脱敏样本为准;固定种子让每次数据相同,当测试开始“记住”特定行时需要换新种子重新生成。

代码示例

faker.seed(20261022); // reproducible

const customers = Array.from({ length: 50_000 }, () => ({
  id: faker.string.uuid(),
  name: faker.person.fullName(),
  country: faker.helpers.weighted(["US", "DE", "JP", "BR"], [0.55, 0.25, 0.15, 0.05]),
}));

const orders = customers.flatMap((c) =>
  Array.from({ length: faker.number.int({ min: 0, max: 12 }) }, () => ({
    customerId: c.id,
    total: Number(faker.commerce.price()),
  }))
);