占位文本与 Mock 数据:从前端原型到后端测试的工程实践

为什么每个开发者都需要占位文本与 Mock 数据

打开任何一个前端原型、设计稿、接口文档、单元测试,你都会看到它们:

  • 设计稿里密密麻麻的 “Lorem ipsum dolor sit amet…”
  • 接口文档里 {"name": "张三", "email": "test@example.com"}
  • 单元测试里 const users = [{ id: 1 }, { id: 2 }, { id: 3 }]
  • 数据库种子脚本里 100 条虚构用户记录

这些就是占位文本Mock 数据。它们看似不起眼,却是软件开发中最高频的”基础设施”之一。好的占位文本能让设计评审聚焦版式而非内容;好的 Mock 数据能让接口测试覆盖边界情况;好的随机生成器能让测试用例不重复。

本文从工程实践出发,讲清楚占位文本与 Mock 数据的设计原则、实现要点与工具协同。

配套工具:占位文本与 Mock 数据生成器

一、Lorem Ipsum 的前世今生

1.1 拉丁文假文章的起源

Lorem Ipsum 不是无意义的乱码,而是一篇真实的拉丁文。它源自公元前 45 年西塞罗的《善恶极》(De finibus bonorum et malorum)第一卷第 32-33 节。16 世纪某位印刷工人为了展示字体样张,把这段文字拼凑成”假文章”,因为其字母分布接近真实英文,能让观者专注于版面而非语义。

直到今天,Lorem Ipsum 仍是设计、印刷、Web 领域的占位文本事实标准。Adobe InDesign、Figma、Bootstrap 文档默认占位都是它的变体。

1.2 为什么不直接用”测试测试测试”

你可能会问:占位文本随便写什么都行,为什么非要拉丁文?

答案在于字母分布。真实英文文本的字母频率并不均匀(e/t/a/o/i/n/s/h/r 占 60%+),而 “测试测试测试” 或 “test test test” 的字母分布极度失真。这会导致:

  • 设计稿里行宽、字间距、断行点与真实内容差异明显
  • 字体渲染测试无法反映真实阅读体验
  • 段落高度、首行缩进、悬挂标点等排版细节无法验证

Lorem Ipsum 的拉丁文字母分布接近真实英文,是”看起来像文章但不打扰阅读”的最佳折中。

1.3 三种粒度:段落、句子、单词

本工具支持三种粒度:

  • 段落:3-6 句组成一段,适合填充文章正文区
  • 句子:单个句子,适合卡片标题、列表项、表单提示
  • 单词:单个拉丁词,适合标签、按钮、短标题

不同粒度覆盖不同场景。例如做新闻列表原型,用句子粒度生成 20 条标题;做博客首页原型,用段落粒度生成 5 篇摘要。

二、中文排版的占位困境

2.1 拉丁字母不适合中文

直接把 Lorem Ipsum 用在中文站点会有明显问题:

  • 字宽不同:拉丁字母是变宽(i 窄、m 宽),中文是等宽(每个字 1em)
  • 行高不同:中文行高通常 1.6-1.8,英文 1.4-1.5 即可
  • 断行规则不同:中文可在任意字间断行,英文只能在单词间断行
  • 标点不同:中文全角标点占 1em,且有避头尾规则

用 Lorem Ipsum 测试中文排版,得到的结果几乎无效。

2.2 中文占位的常见方案

业界有几种中文占位方案:

  1. 乱数假文:从常用字库随机抽字,分布均匀但语义混乱
  2. 古诗片段:用《滕王阁序》《岳阳楼记》等经典,文辞优美但过于眼熟
  3. 现代散文模板:从预设句子库随机组合,兼顾分布与可读性
  4. 千字文:天地玄黄宇宙洪荒,每字不重复,适合字间距测试

本工具采用方案 3:从 20 句模板库(含古诗、散文、现代文)随机组合成段落。这样既保证字母分布接近真实中文,又避免古诗过于眼熟导致观者分心。单词粒度则从常用字库随机选取单字,用于字间距、行高测试。

三、Mock 数据的工程价值

3.1 前后端并行开发的基石

现代 Web 开发的典型流程:

产品经理 → 接口契约(OpenAPI Schema)→ 前端 / 后端并行开发

            前端用 Mock 数据先开发

            后端实现接口 → 联调替换 Mock

前端开发阶段,后端接口可能尚未实现。此时需要 Mock 数据填充界面,验证布局、交互、状态流转。Mock 数据的质量直接决定前端开发效率——如果数据格式与真实接口不一致,联调时要返工重做。

3.2 测试用例的边界覆盖

单元测试不仅要测”正常路径”,还要测边界情况:

  • 空字符串、超长字符串、特殊字符
  • 0、负数、最大值、NaN
  • null、undefined、空数组、空对象
  • 闰年、月末、跨年、跨时区

手动构造这些边界数据费时易错。用 Mock 数据生成器批量生成,再人工挑选边界值,效率高得多。

3.3 数据库种子数据

新项目初始化时,通常需要往数据库灌入一批种子数据用于演示:

  • 10 个用户、50 篇文章、200 条评论
  • 不同角色(管理员、普通用户、访客)
  • 不同状态(已发布、草稿、已删除)

用 Mock 生成器导出 CSV 或 SQL,直接导入数据库,比手写 INSERT 语句快 10 倍。

四、11 种 Mock 数据类型的设计

本工具支持 11 种常用数据类型,覆盖 90% 的 Mock 场景:

类型格式示例设计要点
中文姓名姓+1-2字名王晓明百家姓 + 吉祥字,50% 单字名
英文姓名First LastJames Smith30 个 First + 30 个 Last
邮箱name@domainjames123@gmail.com6 个常用域名
URLhttps://domain/pathhttps://www.example.com/about5 个域名 + 8 条路径
中国手机号1[3-9]xxxxxxxxx13812345678符号工信部号段规则
UUID v48-4-4-4-12550e8400-e29b-41d4-a716-446655440000基于 crypto.randomUUID
IPv4a.b.c.d192.168.1.100排除 0.x 与 255.x
颜色#RRGGBB#2b6cff三通道独立随机
日期YYYY-MM-DD2024-06-152000-2025 范围,日用 28 避免越界
数字1-99942整数,可扩展为范围参数
布尔true/falsetrue等概率

4.1 为什么手机号要限定 1[3-9] 开头

中国手机号格式由工信部规定:第 1 位固定为 1,第 2 位为 3-9(13x、14x、15x、16x、17x、18x、19x 号段)。如果直接生成 1 + 10 位随机数,可能产生 10xxxxxxxxx12xxxxxxxxx 这种非法号段,导致表单校验失败。本工具严格按号段规则生成,保证通过常见的手机号正则校验。

4.2 为什么日期用 28 而不是 31

不同月份天数不同(1/3/5/7/8/10/12 月 31 天,4/6/9/11 月 30 天,2 月 28 或 29 天)。如果日期随机 1-31,生成 2024-02-30 这种非法日期会破坏测试。本工具日期统一用 1-28,保证所有月份都合法。如需测试月末边界(如 2 月 29 日闰年),可手动构造。

五、CSPRNG vs PRNG:随机数质量决定数据质量

5.1 Math.random 的问题

JavaScript 的 Math.random 是伪随机数生成器(PRNG),基于 xorshift128+ 算法。它有两个关键缺陷:

  1. 可预测:给定连续输出,可以反推内部状态,预测后续所有”随机”数
  2. 分布不均:在高精度取模时存在模偏差(modulo bias)

对于占位文本,这两个问题无所谓。但对于 UUID、密码、密钥,可预测性是致命的——攻击者可以枚举出你生成的所有 UUID,撞库窃取数据。

5.2 crypto.getRandomValues 的优势

浏览器提供的 crypto.getRandomValues 是密码学安全随机数生成器(CSPRNG),基于操作系统熵源(Linux 的 /dev/urandom、Windows 的 CryptGenRandom)。它:

  • 不可预测:即使知道所有历史输出,也无法预测下一个数
  • 分布均匀:基于硬件中断、键盘鼠标时序等物理熵源
  • 性能足够:浏览器实现通常比 Math.random 慢 5-10 倍,但对于工具类应用完全够用

本工具的所有 Mock 数据生成都优先使用 CSPRNG,保证 UUID 碰撞概率约 2^-122(需要生成 2.71×10^36 个 UUID 才有 50% 碰撞概率)。这与 密码生成器 共享同一套随机源哲学。

5.3 降级策略

在不支持 crypto.getRandomValues 的环境(如非 HTTPS 页面、旧浏览器),本工具自动降级到 Math.random。这保证了兼容性,但 UUID 质量会下降。生产环境务必启用 HTTPS。

六、四种输出格式的场景适配

6.1 纯文本

每项一行,最简格式。适合:

  • 粘贴到笔记、文档作为示意
  • 作为命令行输入(如 curl 测试 URL 列表)
  • 喂给其他工具处理(如 sortuniq

6.2 JSON 数组

2 空格缩进的 JSON 数组。适合:

  • 前端 Mock 接口返回值(直接 fetch 本地 JSON 文件)
  • 配置文件示例(如 users.json
  • 喂给 JSON 工具 格式化、校验、树形查看
[
  "赵伟",
  "孙芳",
  "李娜"
]

6.3 CSV

type,value 两列。适合:

  • 导入 Excel 做数据分析
  • 数据库批量导入(LOAD DATA INFILE
  • 喂给 CSV/JSON 工具 转 JSON、校验格式
type,value
name-cn,"赵,伟"
name-cn,孙芳

注意:含逗号、换行、双引号的值会用双引号包裹并转义内部双引号(标准 CSV 规则)。本例中 “赵,伟” 因含逗号被包裹。

6.4 Markdown 表格

| # | value | 格式。适合:

  • 写入 README、文档站点
  • 提交到 GitHub Issue、PR 描述
  • 喂给 Markdown 工具 渲染预览
| # | value |
| --- | --- |
| 1 | 赵伟 |
| 2 | 孙芳 |
| 3 | 李娜 |

七、工具矩阵联动

本工具与其他工具形成「数据生成 → 处理 → 校验」的协同链路:

7.1 与 Markdown 工具联动

本工具的 Markdown 表格输出可直接粘贴到 Markdown 工具 渲染预览,验证表格语法是否正确、列宽是否合理。反向场景:在 Markdown 工具里写表格太慢,用本工具生成 10 行 Mock 数据再粘贴,效率提升 5 倍。

7.2 与 JSON 工具联动

本工具的 JSON 数组输出可粘贴到 JSON 工具 格式化、树形查看、搜索过滤。例如生成 50 个邮箱,用 JSON 工具检查是否有重复、是否符合预期域名分布。

7.3 与 CSV/JSON 工具联动

本工具的 CSV 输出可粘贴到 CSV/JSON 工具 转 JSON,进一步用于接口 Mock。反向场景:手头有一份 CSV 真实数据,想快速 Mock 一份结构相同的测试数据,可用本工具生成 CSV 再合并。

7.4 与 UUID 工具联动

本工具生成的 UUID v4 可粘贴到 UUID 工具 查看版本号、变体位、时间戳(v1 才有)。这有助于理解 UUID 的内部结构,以及为什么 v4 适合做数据库主键(无序、不可预测、碰撞概率极低)。

7.5 与密码生成器联动

本工具的 CSPRNG 与 密码生成器 共享同一套随机源哲学:密码学安全、不可预测、分布均匀。理解了 CSPRNG 的价值,你就能明白为什么密码不能用 Math.random 生成,以及为什么 UUID v4 可用于会话令牌。

八、扩展阅读

总结

占位文本与 Mock 数据是软件开发的基础设施,质量直接影响设计评审、接口联调、测试覆盖的效率。本工具的核心设计原则:

  1. 分布真实:Lorem Ipsum 字母分布接近英文,中文模板库接近真实中文
  2. 格式合规:手机号符合号段规则,日期避免越界,UUID 符合 RFC 4122
  3. 随机安全:优先 CSPRNG,保证 UUID 不可预测,降级策略保证兼容
  4. 输出灵活:四种格式覆盖前端、后端、文档、数据库场景
  5. 工具协同:与 Markdown / JSON / CSV / UUID / 密码工具形成完整链路

下次需要 Mock 数据时,别再手写 test1test2test3 了——用工具生成 100 条高质量数据,专注业务逻辑而非数据构造。