跳到主要内容

模拟数据怎么造:前端和接口测试的假数据实战

前端联调没数据、表格组件要填、接口测试缺样本,这篇讲清怎么按字段类型造姓名邮箱地址和 JSON 假数据,导出 JSON / CSV / SQL,全程浏览器本地生成。

发布于 作者 李雷
#测试数据 #模拟数据 #假数据 #前端开发 #接口测试

模拟数据怎么造:前端和接口测试的假数据实战

写前端的人都遇过这种局面:组件写好了,后端接口还没出,页面上空空一片。或者接口出了,但返回的几条数据撑不起分页、排序、长文本截断这些边界。手敲几行 JSON 顶一阵子,可一旦要看 300 行的列表性能,或者要触发某个只在脏数据下才冒头的 bug,手敲就完全不够用了。

这篇就讲一件事:怎么按字段类型快速造出一批结构真实、语义虚构的测试数据,并按 JSON、CSV、SQL 三种格式导出去用。

为什么不直接用线上接口的数据

调真实接口当测试数据,有三个绕不开的坑。一是数据量不可控,你想要正好 25 行看分页,接口给你 4 行或 4000 行。二是不可复现,今天联调好的页面截图,明天接口数据一变就对不上了。三是隐私,真实用户的姓名邮箱进了你的测试仓库、进了 Storybook fixture,这是合规风险。

造假数据正好把这三件事都解决:行数你定,seed 固定就字节级可复现,所有姓名邮箱都是从公开名单随机组合的,不对应任何真人。

按字段类型搭 Schema

造数据的核心是先描述清楚每个字段是什么类型。一个用户对象大概长这样:id 是自增整数,fullName 是姓加名拼出来的人名,email 是邮箱,country 是国家,created_at 是日期,role 是一个只在 admin / editor / viewer 里取值的枚举,active 是布尔。

Mock 数据生成器 里把这些都做成了可挑的类型:id、uuid、firstName、lastName、fullName、email、username、phone、address、city、country、date、boolean、int、float、enum、paragraph、url,一共 18 种。你加字段、给字段命名、选类型,Schema 就成了。enum 类型可以自己填候选值列表,比如上面的 role,这样造出来的数据不是纯随机字符串,而是落在你业务允许的取值范围内。

一段真实的 JSON 输出

设 5 个字段 id / fullName / email / country / active,行数 3,seed 填 42,导出 JSON 大概是这样:

[
  {
    "id": 1,
    "fullName": "Marcus Bennett",
    "email": "marcus.bennett@example.org",
    "country": "Canada",
    "active": true
  },
  {
    "id": 2,
    "fullName": "Priya Nair",
    "email": "priya.nair@test.io",
    "country": "Singapore",
    "active": false
  },
  {
    "id": 3,
    "fullName": "O'Brien Sullivan",
    "email": "obrien.sullivan@example.com",
    "country": "Ireland",
    "active": true
  }
]

注意第三行那个带撇号的名字 O'Brien。这不是巧合,内置名单里本来就掺了撇号和重音字符,专门用来把你导入器、序列化层里的转义和引号路径跑通。手敲五行的 fixture 你大概率全填的是 Tom、Jerry 这种干净名字,那条最容易崩的代码路径永远碰不到。

三种导出格式各管什么场景

JSON 给前端:直接塞进 .fixtures.ts,或者拿来 mock 接口返回。配合 JSON 格式化工具 把缩进和键序理顺,看着更清楚,也方便对比两次生成的差异。

CSV 给数据导入:压测上传解析器、灌 Excel、喂给 BI 工具。1000 行带撇号、带重音的脏名字过一遍你的 CSV 导入器,比单元测试里那五条干净数据有用得多。

SQL 给数据库:导出的是一条 INSERT INTO table_name (...) VALUES (...), (...);,所有行批在一句里,Postgres、MySQL、SQLite、SQL Server 都吃。字符串单引号、内嵌单引号按规范双写转义,O'Brien 会变成 'O''Brien',直接粘进 psql 不会报语法错。

seed 固定,才有可复现这回事

我自己最常用的是 seed 这一项。上周给一个数据表组件做视觉回归,没固定 seed,结果每次跑测试名字都换一批,快照天天抖、天天误报。后来统一约定:凡是要 commit 进仓库的 fixture 一律带 seed,throwaway 的临时数据才留空。相同 seed 加相同 Schema 加相同行数,永远产出字节一致的输出,CI 每次拿到的输入完全一样,失败也以同样方式失败,排查起来一句命令就能复现。

具体落地很简单:造一个只在特定数据形状下才出现的 bug,用 seed 7 生成 50 行存进仓库,写测试加载它。CI 挂掉时,每个同事用 seed 7 重新生成就拿到一模一样的输入,不必把五千行 dump 提交进版本库,也不用猜是哪次随机跑触发了边界。

本地生成,数据不出标签页

整个过程跑在浏览器里。Schema、seed、行数、每一行生成出来的数据,都留在页面和下载文件里,不上传服务器,URL 里也不写,分享链接只带工具地址,不泄露你的字段定义。内置的姓名地名词库随页面一起下发,加载完断网也照常生成。对要在内网、要在合规环境里造数据的团队,这一点比快慢更要紧。

一个提醒:生成的邮箱别拿去真实发件,域名可能解析到活服务器,一次测试群发就打进真人收件箱了,要测发信走 MailHog 这类沉淀工具接住。


Made by Toolora · Updated 2026-06-13