模拟数据生成详解:假数据为什么也要「真」
为什么需要”假”数据
开发早期,后端 API 还没好,前端要联调、要展示效果、要做演示,总不能对着空页面发呆。这时候需要模拟数据(mock data)——长得像真实数据但不对应任何真实用户的虚构数据,用来填充界面、驱动开发。
为什么不用真实生产数据?三个硬原因:
- 隐私合规:真实用户数据含个人信息(姓名、手机、身份证、地址),开发/测试环境用它就是数据泄露,违反个保法/GDPR
- 可用性:开发阶段生产数据还没产生,或拿不到
- 可控性:真实数据形态不可控,难复现边界情况(超长姓名、特殊字符、空值)。模拟数据能精确构造各种 case
模拟数据生成器的价值就是快速批量产出真实感、本地化、格式合法的假数据,让开发不卡在”没数据”上。
好的模拟数据要”真”在哪
“假数据”听着简单,但好用与否差别很大。优质的模拟数据要在几个维度上”真实”:
1. 本地化
姓名、地址、手机号有强烈地域特征。生成器要按目标地区产出:
- 中文姓名:百家姓 + 常见名用字组合,符合中文姓名结构(而非直接音译英文名)
- 手机号:符合中国手机号格式——1 开头、第二位 3~9、共 11 位,且号段是真实运营商在用的(138/159/186 等),不能是 12345678901 这种明显假的
- 身份证号:符合校验规则——6 位地区码 + 8 位生日 + 3 位顺序 + 1 位校验位(按 ISO 7064 MOD 11-2 算),校验位要对得上,否则过不了任何格式校验
- 地址:省市区层级真实存在,门牌号合理
本地化差的工具会生成”张三的手机是 123-456-7890”这种一眼假的数据,演示时露馅。好的工具按真实号段、真实行政区划生成。
2. 格式合法性
数据不仅要”像真的”,还要”能通过校验”:
- 邮箱:
[email protected]格式合法,域名 plausible - 手机/身份证:能通过正则和校验位算法
- 银行卡/信用卡:能通过 Luhn 校验(这个对测试支付流程关键)
- 日期:格式一致、逻辑合理(生日不能在未来、入职日期在生日之后)
格式不合法的假数据在过表单校验时直接被拦,没法用来测流程。
3. 内部一致性
单条记录内部字段要自洽:
- 性别和姓名匹配(别给”王芳”标男性——除非故意测边界)
- 生日和年龄一致
- 邮箱前缀和姓名有关联(
zhangsan@...比asdf@...真实) - 地址的省市区层级对应
一致性好的数据在演示和截图时可信度高,不会一眼穿帮。
4. 真实感分布
真实数据的分布不是均匀的。姓氏”王李张刘”出现频率远高于冷僻姓,年龄集中在某些区间,手机号段有热门段。好的生成器按近似真实的概率分布生成,而不是完全均匀随机——这样数据”统计上也像真的”,对做数据分析、可视化的演示尤其重要。
模拟数据 vs 真实数据的边界
重要认知:模拟数据永远不能替代真实数据做某些测试。
- 性能压测:模拟数据通常字段少、重复模式,压测出的性能可能偏乐观。真实数据的多样性和长尾(超长字符串、深嵌套)是性能瓶颈的常客
- 数据相关性的 bug:模拟数据很难复现真实数据里字段间的隐蔽关联(如某地区手机号集中在某号段),这类 bug 用假数据测不出
- 隐私脱敏 vs 模拟:有些场景需要”结构真实但内容脱敏”的数据(保留真实数据的分布和关联,只替换敏感值),这比纯模拟更接近生产,但实现复杂
所以模拟数据适合功能开发、界面演示、基础测试;上线前的关键测试仍需脱敏后的真实数据或更精细的测试数据策略。
生成原理
生成器的实现通常是:
- 模板定义:定义每个字段的类型和约束(姓名=中文姓+名、手机=中国号段、年龄=18~65 等)
- 类型库:内置各类型数据的生成函数(姓库、名库、号段库、地区库)
- 关联规则:处理字段间依赖(邮箱前缀取姓名拼音、年龄由生日算)
- 批量生成:按模板循环生成 N 条,输出 JSON/CSV/SQL
进阶功能:多语言、自定义模板、导出多种格式、生成 SQL insert 语句直接灌测试库。
实用场景与注意
- 前端开发:后端没好时 mock 接口返回,配 [[uuid]] 生成唯一 ID
- 演示/截图:用真实感数据做产品演示,避免真实用户信息
- 测试库初始化:批量生成测试账号,注意身份证/手机虽格式合法但不对应真人,别误用于真实业务注册
- 教学:教 SQL/数据分析时给一份假数据练习
注意:生成的手机号、身份证号虽校验合法,但可能偶然撞上真实号(号段就那些)。别把模拟数据往真实系统注册,更别用于诈骗——这些工具是为开发测试服务的。
小结
模拟数据生成的核心是”假而真”——格式合法、本地化、内部一致、分布真实,才能撑起开发、演示、测试。它解决了”早期没数据”和”不能用真实数据”的矛盾,但替代不了真实数据在性能和关联性测试上的作用。理解了”为什么假数据也要真”,你才能用好生成器并知道它的边界。配 [[uuid]] 生成唯一标识,能让模拟记录更接近真实系统。