本文要点

  • 固定样本用于稳定断言,随机样本用于扩展探索
  • 随机生成必须接受 seed 并在失败时记录
  • 正常、边界和明确错误的样本要分组
  • 邮箱使用 example.com,数据带 synthetic 标记
作者
Random Address Generator 编辑团队
审核
数据模型与 QA 审核组
最近实质更新
增加可重复种子、正常/边界/错误分组、来源记录和生产隔离。

固定 fixtures 和随机生成各有用途

固定 fixture 适合截图、快照、API 合约和数据迁移测试,因为期望值稳定。随机生成适合扩大组合覆盖,但如果没有可重复种子,只会产生无法复现的偶发失败。

实用方法是保留一组少而精的固定回归样本,再让随机生成器接受 seed、国家和场景参数。失败时将 seed 写入报告,并将有价值的新边界固化为回归样本。

样本类型目的例子
正常证明主要流程可用合法形式且地区字段一致
边界暴露长度、编码和可选性长街道、Unicode、前导零
错误验证错误恢复城市与邮编不一致
故障验证系统弹性查询超时、重试和服务降级

让测试数据可识别但不破坏格式

邮箱使用 example.com 等保留测试域名,记录增加 dataPurpose: synthetic-test 和 fixtureId,日志中优先输出 fixtureId 而非完整地址。用于测试地址解析器时,街道字符仍应符合目标国家字段形状。

不要复制真实客户记录再只替换姓名。街道、电话、邮箱和其他字段仍可能识别真人或将通知发送给第三方。

{
  "fixtureId": "ca-boundary-003",
  "dataPurpose": "synthetic-test",
  "seed": 7319,
  "countryCode": "CA",
  "email": "qa-7319@example.com"
}

随机不代表字段可以乱配

每个生成器都要定义 invariants:国家代码与格式相符,城市、行政区域和邮编来自同一参考记录,邮编保存为文本,可选行不被 N/A 填充。属性测试可在大量 seed 上验证这些不变条件。

明确错误的 fixture 可违反一条 invariant,但必须带 expectedError 说明目的,防止它被误当正常数据。

  • 每个 seed 可重放
  • 正常样本的地区组合恒定一致
  • 错误样本只违反指定规则
  • 参考数据版本记录在输出中

防止测试记录触发生产副作用

测试环境的电子邮件、短信、打印、发货和支付连接必须使用 sandbox 或出站阻断。仅仅在地址上写“Test”不足以防止代码调用真实物流 API。

CI 应在启动时检查环境标记和供应商凭据类型,并拒绝将 synthetic-test 记录提交到生产队列。

将失败样本变成可维护的回归资产

每次随机测试发现新问题时,保留最小可复现记录、seed、数据版本和错误断言。定期删除重复样本,但不要为了“刷新”而每次重新生成全部固定 fixtures。

为每个固定 fixture 记录 owner、scenario、expected outcome、创建原因和最近审核日期。一个没有说明要保护什么行为的大型 JSON 文件,很快会变成没人敢删也没人信任的数据堆。审核时先查找被其他 fixture 包含的重复场景,再查找已不存在的产品规则。

不要根据随机生成的完整文本做 UI 快照。快照使用明确固定的样本;随机测试则断言属性和 invariants。这种分工可以避免每次地址文本变化都产生无意义的快照更新。

  • 每个固定样本有 owner 和明确保护的行为
  • 审核重复场景和已失效规则
  • 固定样本服务快照,随机样本服务属性测试
  • 仅在参考数据实质变化时更新快照版本

常见问题

测试地址是固定好还是随机好?

两者结合。固定样本保证回归稳定,带 seed 的随机样本扩大组合覆盖。

为什么测试邮箱要使用 example.com?

example.com 是为文档和测试保留的域名,可降低误发给真实第三方的风险。

合成数据可以直接在生产测试吗?

不应默认允许。即使数据是合成的,也可能触发真实邮件、物流、支付或分析副作用。

来源与进一步阅读

  1. RFC 2606:保留的测试域名
  2. USPS:地址与 ZIP Code 基础