本文要点
- 固定样本用于稳定断言,随机样本用于扩展探索
- 随机生成必须接受 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 是为文档和测试保留的域名,可降低误发给真实第三方的风险。
合成数据可以直接在生产测试吗?
不应默认允许。即使数据是合成的,也可能触发真实邮件、物流、支付或分析副作用。
