找回密码
 立即注册
首页 业界区 业界 一款开源、强大、简单易用的 .NET 假数据生成利器 ...

一款开源、强大、简单易用的 .NET 假数据生成利器

钱艷芳 2026-2-11 03:40:10
前言

在日常的 .NET 项目开发中,我们经常需要大量的测试数据来验证业务逻辑、填充数据库、进行性能测试或者做产品演示。手动编写这些测试数据不仅枯燥乏味、浪费时间,而且难以覆盖各种边界场景。今天大姚给大家推荐一款开源、强大、简单易用的 .NET 假数据生成库:Bogus
项目介绍

Bogus 是一个基于著名的 faker.js 移植而来的开源(MIT License) .NET 假数据生成库,它为 .NET 开发者提供了一套强大、简单易用的 API,可快速生成各种类型的模拟数据,支持 40+ 种语言区域本地化,广泛应用于单元测试、数据库填充、原型演示以及示例数据生成等场景。
支持语言

支持语言:C#、F#、VB.NET。
应用场景


  • 单元测试 / 集成测试:快速生成符合业务模型的测试对象,替代手工 Mock 数据。
  • 数据库填充(Seed):开发/测试环境数据库填充真实感十足的假数据。
  • 性能与压力测试:批量生成大规模数据集来模拟真实负载。
  • API 开发调试:快速构造 API 返回的模拟响应数据。
  • 数据脱敏:替换生产数据中的敏感信息。
支持以下语言环境

Bogus 支持以下语言环境:

创建一个 .NET 控制台应用

接下来我们创建一个名为:BogusExercise .NET 9 控制台应用:


项目 NuGet 安装

在 NuGet 包管理器控制台中执行:
  1. Install-Package Bogus
复制代码
或者在 NuGet 包管理器中搜索安装:

Bogus 快速入门

生成 3 个随机订单的模拟用户信息

以下是 Bogus 仓库中提供的示例代码,使用 Bogus 生成了 3 个带随机订单的模拟用户。
  1.     public classProgram
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             //生成 3 个随机订单的模拟用户信息
  6.             var users = GenerateSampleUsers(3);
  7.         }
  8.         /// 
  9.         /// 生成随机订单的模拟用户
  10.         /// 
  11.         /// 
  12.         /// 
  13.         public static List GenerateSampleUsers(int count = 3)
  14.         {
  15.             // 设置随机种子,生成可重复的数据集
  16.             Randomizer.Seed = new Random(3897234);
  17.             var fruit = new[] { "apple", "banana", "orange", "strawberry", "kiwi" };
  18.             var orderIds = 0;
  19.             var testOrders = new Faker()
  20.                 // 开启严格模式:确保所有属性都有规则
  21.                 .StrictMode(true)
  22.                 // OrderId 自增
  23.                 .RuleFor(o => o.OrderId, f => orderIds++)
  24.                 // 从水果篮中随机挑选
  25.                 .RuleFor(o => o.Item, f => f.PickRandom(fruit))
  26.                 // 随机数量 1~10
  27.                 .RuleFor(o => o.Quantity, f => f.Random.Number(1, 10))
  28.                 // 可空 int?,80% 概率为 null
  29.                 .RuleFor(o => o.LotNumber, f => f.Random.Int(0, 100).OrNull(f, .8f));
  30.             var userIds = 0;
  31.             var testUsers = new Faker()
  32.                 // 自定义构造函数
  33.                 .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####")))
  34.                 // 基本规则
  35.                 .RuleFor(u => u.FirstName, f => f.Name.FirstName())
  36.                 .RuleFor(u => u.LastName, f => f.Name.LastName())
  37.                 .RuleFor(u => u.Avatar, f => f.Internet.Avatar())
  38.                 .RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName))
  39.                 .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName))
  40.                 .RuleFor(u => u.SomethingUnique, f => $"Value {f.UniqueIndex}")
  41.                 .RuleFor(u => u.SomeGuid, Guid.NewGuid)
  42.                 // 随机选取枚举
  43.                 .RuleFor(u => u.Gender, f => f.PickRandom())
  44.                 .RuleFor(u => u.CartId, f => Guid.NewGuid())
  45.                 // 组合属性:利用已生成的 FirstName 和 LastName
  46.                 .RuleFor(u => u.FullName, (f, u) => u.FirstName + " " + u.LastName)
  47.                 // 嵌套集合生成
  48.                 .RuleFor(u => u.Orders, f => testOrders.Generate(3))
  49.                 // 生成完成后的回调
  50.                 .FinishWith((f, u) =>
  51.                 {
  52.                     Console.WriteLine("User Created! Name={0}", u.FullName);
  53.                 });
  54.             // 一次生成 3 个用户
  55.             return testUsers.Generate(count);
  56.         }
  57.     }
  58.     /// 
  59.     /// 订单实体
  60.     /// 
  61.     publicclassOrder
  62.     {
  63.         publicint OrderId { get; set; }
  64.         publicstring Item { get; set; }
  65.         publicint Quantity { get; set; }
  66.         publicint? LotNumber { get; set; }
  67.     }
  68.     /// 
  69.     /// 性别枚举
  70.     /// 
  71.     publicenum Gender
  72.     {
  73.         Male,
  74.         Female
  75.     }
  76.     /// 
  77.     /// 用户实体
  78.     /// 
  79.     publicclassUser
  80.     {
  81.         public User(int userId, string ssn)
  82.         {
  83.             this.Id = userId;
  84.             this.SSN = ssn;
  85.         }
  86.         publicint Id { get; set; }
  87.         publicstring FirstName { get; set; }
  88.         publicstring LastName { get; set; }
  89.         publicstring FullName { get; set; }
  90.         publicstring UserName { get; set; }
  91.         publicstring Email { get; set; }
  92.         publicstring SomethingUnique { get; set; }
  93.         public Guid SomeGuid { get; set; }
  94.         publicstring Avatar { get; set; }
  95.         public Guid CartId { get; set; }
  96.         publicstring SSN { get; set; }
  97.         public Gender Gender { get; set; }
  98.         public List Orders { get; set; }
  99.     }
复制代码
生成随机用户信息

使用 Bogus 快速生成随机用户姓名、邮箱、地址、电话等关联数据:
  1.         /// 
  2.         /// 生成随机用户信息
  3.         /// 
  4.         public static void GenerateRandomData()
  5.         {
  6.             // 自动生成姓名、邮箱、地址、电话等关联数据
  7.             var faker = new Faker("zh_CN");// 使用简体中文
  8.             var randomName = faker.Name.FullName();
  9.             var randomEmail = faker.Internet.Email();
  10.             var randomAddress = faker.Address.FullAddress();
  11.             var randomPhone = faker.Phone.PhoneNumber();
  12.             Console.WriteLine($"Name: {randomName}");
  13.             Console.WriteLine($"Email: {randomEmail}");
  14.             Console.WriteLine($"Address: {randomAddress}");
  15.             Console.WriteLine($"Phone: {randomPhone}");
  16.         }
复制代码
EF Core 数据库种子数据填充

使用 EF Core 填充 Blog & Post 数据:
  1.     /// 
  2.     /// EF Core 数据库种子数据填充
  3.     /// 适合开发/测试环境,在应用启动时自动填充数据:
  4.     /// FakeData.Init(10); // 生成 10 个 Blog,每个包含 3~5 篇 Post
  5.     /// 
  6.     publicstaticclassFakeData
  7.     {
  8.         publicstatic List Blogs = new List();
  9.         publicstatic List Posts = new List();
  10.         public static void Init(int count)
  11.         {
  12.             var postId = 1;
  13.             var postFaker = new Faker()
  14.                 .RuleFor(p => p.PostId, _ => postId++)
  15.                 .RuleFor(p => p.Title, f => f.Hacker.Phrase())
  16.                 .RuleFor(p => p.Content, f => f.Lorem.Sentence());
  17.             var blogId = 1;
  18.             var blogFaker = new Faker()
  19.                 .RuleFor(b => b.BlogId, _ => blogId++)
  20.                 .RuleFor(b => b.Url, f => f.Internet.Url())
  21.                 .RuleFor(b => b.Posts, (f, b) =>
  22.                 {
  23.                     postFaker.RuleFor(p => p.BlogId, _ => b.BlogId);
  24.                     var posts = postFaker.GenerateBetween(3, 5);
  25.                     // 关键:收集所有 Posts 到静态列表中
  26.                     Posts.AddRange(posts);
  27.                     return posts;
  28.                 });
  29.             // 清空旧数据,避免重复调用累积
  30.             Blogs.Clear();
  31.             Posts.Clear();
  32.             Blogs = blogFaker.Generate(count);
  33.         }
  34.     }
  35.     /// 
  36.     /// Blog
  37.     /// 
  38.     publicclassBlog
  39.     {
  40.         publicint BlogId { get; set; }
  41.         publicstring Url { get; set; }
  42.         public List Posts { get; set; }
  43.     }
  44.     /// 
  45.     /// Post
  46.     /// 
  47.     publicclassPost
  48.     {
  49.         publicint PostId { get; set; }
  50.         publicstring Title { get; set; }
  51.         publicstring Content { get; set; }
  52.         publicint BlogId { get; set; }
  53.     }
复制代码
在 Program.cs 启动时填充:
  1.     public classProgram
  2.     {
  3.         public static void Main(string[] args)
  4.         {
  5.             var builder = WebApplication.CreateBuilder(args);
  6.             // 注册 DbContext
  7.             builder.Services.AddDbContext(options =>
  8.                 options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
  9.             var app = builder.Build();
  10.             // 应用启动时填充种子数据
  11.             using (var scope = app.Services.CreateScope())
  12.             {
  13.                 var context = scope.ServiceProvider.GetRequiredService();
  14.                 // 确保数据库已创建
  15.                 context.Database.EnsureCreated();
  16.                 // 仅在数据库为空时填充假数据
  17.                 if (!context.Blogs.Any())
  18.                 {
  19.                     FakeData.Init(10); // 生成 10 个 Blog,每个包含 3~5 篇 Post
  20.                     context.Blogs.AddRange(FakeData.Blogs);
  21.                     context.Posts.AddRange(FakeData.Posts);
  22.                     context.SaveChanges();
  23.                     Console.WriteLine($"已填充 {FakeData.Blogs.Count} 个博客, {FakeData.Posts.Count} 篇文章");
  24.                 }
  25.             }
  26.             app.MapControllers();
  27.             app.Run();
  28.         }
  29.     }
复制代码
自定义扩展 Bogus 数据集

开发者可以轻松扩展 Bogus,添加自定义的数据生成器:
  1.     /// 
  2.     /// 为 Bogus 的 Faker 类提供食品相关的自定义假数据扩展方法
  3.     /// 
  4.     publicstaticclassFoodExtensions
  5.     {
  6.         /// 
  7.         /// 生成一个随机的糖果名称
  8.         /// 
  9.         /// 
  10.         /// 
  11.         public static string Candy(this Faker faker)
  12.         {
  13.             return faker.PickRandom(new[] { "巧克力", "棒棒糖", "口香糖", "软糖", "太妃糖" });
  14.         }
  15.         /// 
  16.         /// 生成一个随机的饮品名称
  17.         /// 
  18.         /// 
  19.         /// 
  20.         public static string Drink(this Faker faker)
  21.         {
  22.             return faker.PickRandom(new[] { "可乐", "雪碧", "橙汁", "咖啡", "牛奶" });
  23.         }
  24.     }
  25.     
  26.     // 使用自定义扩展
  27.     var faker = new Faker();
  28.     Console.WriteLine($"最爱糖果: {faker.Candy()}");
  29.     Console.WriteLine($"最爱饮料: {faker.Drink()}");
复制代码
项目源码地址


更多项目实用功能和特性欢迎前往项目开源地址查看
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-2-21 05:31:16

举报

您需要登录后才可以回帖 登录 | 立即注册