Bogus 数据重复因默认随机种子复用,需显式传动态seed;中文乱码因locale未构造时指定且字段未走本地化路径;嵌套对象为空因未显式RuleFor注入Faker<T>;大批量OOM因Generate()全量加载,应改用GenerateLazy()流式生成。

生成的数据总是重复、中文乱码、嵌套对象为空、大批量时内存爆掉——这些问题不是 Bogus 有 bug,而是没踩对初始化和调用节奏。
为什么 new Faker() 后 Generate() 出来的数据一模一样?
默认随机种子复用是主因。Bogus 在无显式 seed 时可能复用相同时间戳或静态 Random 实例,尤其在快速连续测试中。
- 显式传入唯一 seed:
new Faker<user>(seed: Guid.NewGuid().GetHashCode())</user>或new Faker<user>(seed: DateTime.Now.Ticks)</user> - 别用
Randomizer.Seed = new Random(...)全局设种——它影响所有 Faker 实例,且线程不安全 - 单元测试里若需可重现数据,才用固定 seed(如
seed: 12345),日常开发建议用动态 seed
中文姓名/手机号/地址全是英文?
没生效 locale 是最常见疏漏。Bogus 的 Locale 必须在构造时指定,且后续字段调用要走对应本地化路径。
- 正确写法:
new Faker<user>("zh_CN")</user>,不是new Faker<user>().Locale = "zh_CN"</user>(后者无效) - 字段必须用
f.Name.FirstName(),而非f.Person.FirstName()(后者绕过 locale) - 手机号得手动格式化:
f.Phone.PhoneNumber("1##########"),因为f.Phone.Number()在 zh_CN 下仍可能返回英文模板 - 身份证号(IDNumber)不在官方 zh_CN 本地化覆盖范围内,需自行实现校验逻辑或用第三方扩展
嵌套对象(如 User.Address)始终为 null?
Bogus 不会自动递归生成子对象,必须显式声明 RuleFor 并注入独立的 Faker<Address> 实例。
- 错误写法:
.RuleFor(u => u.Address, f => f.Resolve(new Address()))—— 这只 new 空对象,不填字段 - 正确写法:
.RuleFor(u => u.Address, f => f.Use(new Faker<address>("zh_CN")))</address>或.RuleFor(u => u.Address, f => f.Generate(new Faker<address>("zh_CN")))</address> - 若 Address 也有嵌套(如 City.Province),同样要逐层用
Faker<T>显式配置,不能依赖“自动推导”
Generate(100000) 直接卡死或 OOM?
Generate(n) 是同步全量构造,n=10 万时所有对象同时驻留内存。这不是 Bogus 慢,是你让它扛了不该扛的负载。
- 改用流式生成:
faker.GenerateLazy(100000)返回IEnumerable<T>,按需枚举,内存常驻仅 1 个对象 - 避免深层嵌套放大:比如
.RuleFor(u => u.Orders, f => f.Make(5, () => new Faker<order>().Generate()))</order>,10 万用户 × 5 订单 = 50 万对象,指数级膨胀 - 复用同一个
Faker<T>实例,别在循环里反复new—— 它线程安全,重复 new 反而触发重复初始化和种子冲突
最容易被忽略的是:RuleFor 和 Customize 的执行顺序。Customize 总是在所有 RuleFor 之后运行,所以它能读到已赋值字段;但如果你在 Customize 里又去改一个已被 RuleFor 设过的字段,就等于白写了——这个时机差,调试时很难一眼发现。


















