用 node.js 脚本 + faker.js 生成假数据最可控,因插件存在生成逻辑不可见、字段间无法关联、不支持动态约束三大缺陷,而脚本可调试、可复现、易嵌入 ci,且能精准控制语义化输出。

直接用 Node.js 脚本生成最可控,比插件更可靠、更易复现、更容易嵌入 CI 流程。
为什么不用 Random Data Generator 插件
这类插件(如 Random Data Generator)在简单场景下点右键就能出数据,但实际用起来容易卡在三个地方:
- 生成逻辑不可见、不可调试——你不知道它用什么规则生成邮箱,比如是否带域名后缀、是否去重
- 字段间无法建立关联——比如生成一个
user_id后,没法让order.user_id自动对齐 - 不支持动态约束——比如“每个用户最多 3 个订单”,插件基本做不到
如果你的数据要用于 Playwright 测试断言、JSON Schema 验证或 Jest 单元测试的 fixture,这些限制会直接导致测试 flaky 或维护成本飙升。
用 faker.js + Node.js 脚本生成结构化数据
faker 是目前 Node 生态中事实标准的假数据生成库,v8+ 版本已完全 ESM 化,适配 VSCode 内置的 Node 调试器。
实操步骤:
- 在项目根目录运行:
npm install @faker-js/faker - 新建
generate-users.js,内容如下:
import { faker } from '@faker-js/faker';
<p>const users = Array.from({ length: 10 }, () => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
createdAt: faker.date.recent({ days: 30 }).toISOString(),
}));</p><p>console.log(JSON.stringify(users, null, 2));</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3866" title="jinn-node"><img
src="https://img.php.cn/upload/skill/000/000/081/178981932374166.jpg" alt="jinn-node" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3866" title="jinn-node" class="overflowclass">jinn-node</a>
<p class="overflowclass">在Jinn网络为自主项目工作赚取代币奖励,让闲置的OpenClaw代理开始工作。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3866" title="jinn-node" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 在 VSCode 中右键该文件 → “Run Code”(需装 Code Runner),或终端执行:
node generate-users.js > fixtures/users.json
注意:faker.person.fullName() 和 faker.internet.email() 返回的是字符串,不是函数调用;v8+ 必须用 import,require() 会报错。
生成带关联关系的数据(如订单 + 用户)
真实测试数据常需主从结构。例如:10 个用户,每人 1~5 个订单。这时候不能靠两次独立 Array.from,得先存用户再嵌套生成:
import { faker } from '@faker-js/faker';
<p>const users = Array.from({ length: 10 }, () => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
}));</p><p>const orders = users.flatMap(user =>
Array.from(
{ length: faker.number.int({ min: 1, max: 5 }) },
() => ({
id: faker.string.uuid(),
user_id: user.id,
amount: faker.number.float({ min: 10, max: 500, fractionDigits: 2 }),
status: faker.helpers.arrayElement(['pending', 'shipped', 'delivered']),
})
)
);</p><p>console.log(JSON.stringify({ users, orders }, null, 2));</p>
关键点:
- 用
flatMap替代map+flat,避免多一层嵌套数组 -
faker.helpers.arrayElement()比手写arr[Math.floor(Math.random() * arr.length)]更安全(不会因空数组 crash) - 所有时间、数字、枚举都走
faker方法,避免手动拼接导致格式不一致(如日期漏toISOString())
VSCode 中快速运行与调试脚本
别总切终端。直接在 VSCode 里调试生成脚本,能立刻看到变量值、检查数据分布:
- 确保已安装官方
Node.js Extension Pack(含 Debugger for Node.js) - 在脚本第一行加断点,按
Ctrl+Shift+D打开调试面板,选 “Node.js” 环境,点绿色 ▶️ 运行 - 想每次生成不同数据?在
launch.json的env里加:"NODE_OPTIONS": "--enable-source-maps",方便定位 faker 内部调用
真正麻烦的从来不是“怎么生成”,而是“生成的数据能不能被下游稳定消费”。比如 Playwright 测试里用 page.getByText(data[0].name),如果 name 里混入了 emoji 或换行符,就可能匹配失败——这得靠 faker.person.lastName() 这类语义化方法来规避,而不是靠正则清洗。










