后端接口还没写完,前端页面已经排期上线;测试要压一批 10 万行的订单数据,手里却只有 3 条示例记录——这大概是每个研发团队都躲不掉的场景。手写假数据不仅慢,而且假得离谱:姓名全是"张三李四",手机号全是"13800138000",一到演示环节就露馅。
Mock 数据生成工具就是来解决这件事的。这两年这类工具集体接上了 AI 能力:你只要用一句自然语言描述字段,它就能推断出该字段应该长什么样,甚至连"下单时间必须晚于注册时间"这种业务约束都能照顾到。本文横向对比 6 款完全免费(或有足够用的免费额度)的工具,每款都给出可直接复制的实操代码,并附一套选型决策表。
一、先想清楚:你要的是哪一类 Mock
很多人选错工具,是因为没分清三种截然不同的需求:
- 造数据(Data Generation):我要 10 万条长得像真人的用户记录,导入数据库或喂给压测脚本。
- 造接口(API Mocking):后端接口还不存在,我要一个能返回 JSON 的地址,让前端先跑起来。
- 拦截请求(Request Interception):接口存在但不稳定,我要在浏览器或单测里劫持特定请求,返回可控结果。
这三类需求对应的工具完全不同。下面的对比表按这个维度分类,选之前先对号入座。
二、6款工具横向对比总表
| 工具 | 主攻类型 | 免费程度 | 上手难度 | 最适合的人 |
|---|---|---|---|---|
| Apifox | 造接口 + 造数据 | 个人版免费,团队协作有额度 | ★☆☆☆☆ | 前后端联调、有接口文档的团队 |
| Mock.js | 造数据(前端) | 完全免费开源 | ★★☆☆☆ | 前端工程师,想在项目里内嵌规则 |
| Faker | 造数据(批量) | 完全免费开源 | ★★☆☆☆ | 后端 / 测试,要灌库或跑压测 |
| Mockaroo | 造数据(可视化) | 免费额度每天 1000 行 | ★☆☆☆☆ | 不想写代码的产品、测试、运营 |
| JSON Server | 造接口 | 完全免费开源 | ★★☆☆☆ | 想要一个带增删改查的假后端 |
| MSW | 拦截请求 | 完全免费开源 | ★★★☆☆ | 写单元测试 / E2E 测试的工程师 |
三、逐款实测详解
1. Apifox:文档即 Mock,零配置最省事
Apifox 的定位是"Postman + Swagger + Mock + JMeter"四合一。它最大的价值在于不需要单独维护 Mock 规则:只要你在接口文档里定义了数据模型,Mock 服务立刻可用,字段变更后 Mock 结果实时同步。
更贴心的是它的智能 Mock:内置的规则引擎会根据字段名推断内容。字段叫 email 就返回邮箱格式,叫 avatar 就返回图片地址,叫 createTime 就返回时间戳——不用手写一行规则。
实操三步:
- 在 Apifox 里新建接口,定义响应的数据结构(也可以直接导入 OpenAPI / Swagger 文件)。
- 点击"Mock"标签,直接复制生成的本地 Mock 地址,形如
http://127.0.0.1:4523/m1/xxx-xxx/user/list。 - 前端把 baseURL 换成这个地址,页面立刻有数据。
进阶技巧:Apifox 支持"高级 Mock",可以按请求参数返回不同结果。比如 id=1 返回正常用户,id=999 返回 404 错误——测异常分支特别好用,比手动改代码优雅得多。
短板:它是桌面客户端,不适合塞进 CI 流水线做纯代码化的数据生成(虽然有 Apifox CLI,但那是跑测试用的)。
2. Mock.js:前端老将,规则语法是精髓
Mock.js 出现得早,但它的数据模板语法至今仍是同类里最简洁的。核心思想是在 key 上写规则,用 | 分隔:
const Mock = require('mockjs');
const data = Mock.mock({
// 生成 5 到 10 条记录
'list|5-10': [{
'id|+1': 1, // 自增 ID
'name': '@cname', // 中文姓名
'email': '@email', // 邮箱
'age|18-60': 1, // 18 到 60 的整数
'score|1-100.1-2': 1, // 带 1-2 位小数
'status|1': ['正常', '禁用', '待审核'], // 从数组里随机取一个
'createTime': '@datetime', // 随机日期时间
'avatar': '@image("100x100")' // 占位图
}]
});
console.log(JSON.stringify(data, null, 2));
安装只需 npm install mockjs。@cname、@ctitle、@cparagraph 这类中文占位符是它相对国外工具的最大优势——生成的中文姓名、标题、段落都很自然,做国内产品的演示图特别省事。
短板:项目已多年低频维护,随机性偏"机械"(比如 @cname 的姓氏分布不符合真实人口比例)。做演示够用,做严肃的数据分析测试要慎重。
3. Faker:批量灌库的首选
Faker 是跨语言的老牌方案,Python 版(pip install faker)和 JS 版(npm install @faker-js/faker)都很成熟,支持 70 多种语言环境,中文用 zh_CN。
from faker import Faker
import csv
fake = Faker('zh_CN')
Faker.seed(2026) # 固定种子,保证每次生成的数据可复现
with open('users.csv', 'w', newline='', encoding='utf-8-sig') as f:
w = csv.writer(f)
w.writerow(['id', 'name', 'phone', 'email', 'company', 'address', 'register_at'])
for i in range(1, 100001): # 十万条
w.writerow([
i,
fake.name(),
fake.phone_number(),
fake.email(),
fake.company(),
fake.address().replace('\n', ' '),
fake.date_time_between(start_date='-2y', end_date='now')
])
print('done')
两个必须记住的点:第一,一定要 Faker.seed(),否则每次跑出来的数据都不一样,测试结果无法复现;第二,写 CSV 时用 utf-8-sig 编码,否则 Excel 打开全是乱码——这个坑几乎人人踩过一次。
业务约束怎么办? Faker 本身不懂业务规则,得自己兜。比如"下单时间必须晚于注册时间":
reg = fake.date_time_between(start_date='-2y', end_date='-1d')
order = fake.date_time_between(start_date=reg, end_date='now') # 以注册时间为起点
4. Mockaroo:不写代码也能造十万行
Mockaroo 是在线可视化工具,界面上拉几个下拉框定义字段类型,点导出就完事。免费额度是每天 1000 行,支持导出 CSV、JSON、SQL(直接生成 INSERT 语句)、Excel 等格式。
它的强项是内置了 140+ 种真实数据类型:不只是姓名地址,连信用卡号(符合 Luhn 校验)、ISBN、MAC 地址、汽车品牌型号都有现成的。还支持公式字段,比如 total = price * quantity,让字段之间保持逻辑一致。
适合场景:一次性需求。给客户做演示、填一张表格、灌一批种子数据,用它最快——五分钟搞定,不用装任何东西。不适合:需要反复生成、要进 CI 的场景,1000 行/天的限制会很快撞墙。
5. JSON Server:30 秒起一个假后端
如果你要的不只是数据,而是一个能增删改查的完整 REST 接口,JSON Server 是最省力的答案。
# 1. 写一个 db.json
{
"posts": [
{ "id": 1, "title": "第一篇", "views": 100 },
{ "id": 2, "title": "第二篇", "views": 250 }
],
"users": [
{ "id": 1, "name": "小王" }
]
}
# 2. 一行命令启动
npx json-server db.json --port 3000
启动后你立刻拥有了这些接口:GET /posts、GET /posts/1、POST /posts、PUT /posts/1、DELETE /posts/1,而且写操作会真实落盘到 db.json,刷新页面数据还在。还自带分页(?_page=1&_limit=10)、排序(?_sort=views&_order=desc)、模糊搜索(?q=关键词)。
组合拳:用 Faker 生成 db.json,再用 JSON Server 托管,就得到一个数据量真实、功能完整的假后端,前端可以从列表页一路调试到详情页。
6. MSW:在网络层拦截,测试场景的正解
MSW(Mock Service Worker)的思路和前面几款都不一样:它不起服务器,而是用 Service Worker / Node 拦截器在网络层劫持请求。业务代码一行都不用改,你的 axios、fetch 照常发请求,只是被中途截胡了。
// src/mocks/handlers.js
import { http, HttpResponse } from 'msw';
export const handlers = [
http.get('/api/user/:id', ({ params }) => {
return HttpResponse.json({
id: params.id,
name: '测试用户',
role: 'admin'
});
}),
// 模拟 500 错误,测试异常分支
http.post('/api/order', () => {
return new HttpResponse(null, { status: 500 });
})
];
这带来一个关键好处:同一套 Mock 规则,开发时在浏览器用,跑单测时在 Node 里用,E2E 测试时也能用。不用维护三份配置。这是它比 JSON Server、Apifox 更适合测试场景的根本原因。
短板:概念门槛最高,要理解 Service Worker 的注册机制,首次配置比其他工具都折腾。但一旦跑通,长期收益最大。
四、把 AI 接进来:一句话生成造数脚本
上面 6 款工具本身只有 Apifox 内置了较强的智能推断。但你完全可以用大模型(DeepSeek、通义千问、Kimi 都行)当"脚本生成器",让它替你写 Faker 或 Mock.js 代码。关键是提示词要给足约束。
可直接复用的提示词模板:
你是资深测试开发工程师。请用 Python + Faker(zh_CN) 生成测试数据脚本。
【表结构】
用户表 users: id(自增), nickname(中文昵称,2-8字), phone(中国手机号),
city(中国城市), register_at(注册时间), vip_level(0-5整数)
订单表 orders: order_no(18位数字), user_id(关联users.id),
amount(金额,10-9999,两位小数), pay_at(支付时间), status(待付款/已付款/已退款)
【业务约束】
1. orders.pay_at 必须晚于对应用户的 register_at
2. status 为"待付款"时 pay_at 必须为空
3. vip_level 越高,该用户的订单数越多(0级1-2单,5级20-50单)
4. 金额分布要符合长尾:80%订单在100元以下
【输出要求】
- 生成 1000 个用户和对应订单,写入两个 CSV 文件
- 使用 utf-8-sig 编码
- 固定随机种子为 2026
- 代码加中文注释,可直接运行
这套提示词的核心是把业务约束单独列成一节。这正是所有 Mock 工具最弱的地方——它们能生成合法的字段,但不懂字段之间的关系。让大模型来补这块,效率比自己写循环高得多。
如果你还想让 AI 顺手把数据库表结构也一起设计了,可以配合AI数据库设计工具免费推荐:6款一句话生成ER图与建表语句的神器横向对比与实操指南里的方法,从建表到造数一条龙。
五、选型决策:三个问题定答案
| 你的处境 | 推荐组合 | 理由 |
|---|---|---|
| 团队已有接口文档,前后端要联调 | Apifox | 文档即 Mock,零额外维护成本 |
| 纯前端项目,只想本地跑起来 | Mock.js 或 JSON Server | 轻,装完就能用,无需服务端 |
| 要往数据库灌几万条数据 | Faker + AI 生成脚本 | 无行数限制,业务约束可编程 |
| 临时给客户演示,不想写代码 | Mockaroo | 可视化,五分钟出 Excel |
| 要写单测 / E2E,需要稳定可控 | MSW | 一套规则通吃浏览器和 Node |
| 既要假后端又要真实数据量 | Faker 造 db.json + JSON Server 托管 | 数据真实 + 接口完整 |
六、五个容易踩的坑
- Mock 数据混进生产环境。 最严重的事故类型。务必用环境变量隔离,例如只在
NODE_ENV === 'development'时才启动 Mock,构建生产包时彻底剔除相关代码。 - 不固定随机种子。 上次测出的 bug 这次复现不了,因为数据变了。Faker 用
Faker.seed(n),Mockaroo 导出后直接存文件。 - 只造正常数据。 空字符串、超长文本、emoji、SQL 关键字、负数金额——这些边界值才是真正能测出问题的。造数时刻意掺 5% 的脏数据。
- CSV 用 utf-8 而非 utf-8-sig。 Excel 打开中文乱码,然后花半小时怀疑是脚本写错了。
- Mock 结构和真实接口不一致。 前端按 Mock 写完,联调时发现字段名对不上、层级嵌套不同。解决办法是让 Mock 直接从 OpenAPI / Swagger 文档生成,而不是手写——这也是 Apifox 这类"文档驱动"工具的核心价值。
七、一个完整的最小实践
如果你现在就想动手,按这个顺序走一遍,大约 15 分钟:
# 第 1 步:用 Faker 造 200 条数据,输出为 db.json
pip install faker
# gen_db.py
from faker import Faker
import json, random
fake = Faker('zh_CN')
Faker.seed(2026)
random.seed(2026)
posts = [{
'id': i,
'title': fake.sentence(nb_words=6).rstrip('。'),
'author': fake.name(),
'views': random.randint(0, 50000),
'createTime': fake.date_time_between('-1y').isoformat()
} for i in range(1, 201)]
json.dump({'posts': posts}, open('db.json', 'w', encoding='utf-8'),
ensure_ascii=False, indent=2)
# 第 2 步:托管成 REST 接口
npx json-server db.json --port 3000
# 第 3 步:验证
# 浏览器打开 http://localhost:3000/posts?_page=1&_limit=10&_sort=views&_order=desc
到这一步,你已经有了一个数据真实、支持分页排序、可增删改查的假后端。前端接上就能开发,完全不必等后端。
八、常见问题
Q:Mock.js 和 Faker 该选哪个?
看你在哪一端。前端项目里内嵌规则、要中文占位符,选 Mock.js;后端或测试要批量出文件、要精确控制业务约束,选 Faker。两者也可以并存,互不冲突。
Q:Mockaroo 每天 1000 行不够用怎么办?
两个办法:一是把它当"模板设计器",在界面上调好字段类型后导出小样,再用 AI 把这套结构翻译成 Faker 脚本本地无限量生成;二是直接跳过它,用 Faker。
Q:Mock 数据能用来做性能压测吗?
可以,但要注意数据分布。压测时如果所有记录的某个索引字段值都很集中,会掩盖真实的数据库性能问题。用 Faker 时刻意让主键、外键、时间字段分散开。
Q:接口文档变了,Mock 要重新配一遍吗?
用 Apifox 这类文档驱动的工具不用,改文档 Mock 自动跟着变。手写 Mock.js / MSW 规则的就得手动同步——这也是团队规模上来后建议切文档驱动方案的原因。
写在最后
Mock 数据这件事的本质,是用可控的假数据换取开发节奏的自由。工具选型不必追新,够用就行:个人小项目 Mock.js 或 JSON Server 足矣,团队协作上 Apifox,测试体系用 MSW,批量造数交给 Faker 加 AI 脚本。
真正拉开差距的不是用了哪款工具,而是有没有把业务约束和边界值考虑进去。一份只有"正常数据"的 Mock,测不出任何有价值的问题。
相关阅读
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论