news 2026/4/16 11:02:48

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一款开源、强大、简单易用的 .NET 假数据生成利器

前言

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

  • 👪DotNetGuide技术社区:https://mp.weixin.qq.com/s/CbPvhmfK4ZWsHJj2eKMk7Q

项目介绍

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

支持语言

支持语言:C#、F#、VB.NET。

应用场景

  • 单元测试 / 集成测试:快速生成符合业务模型的测试对象,替代手工 Mock 数据。

  • 数据库填充(Seed):开发/测试环境数据库填充真实感十足的假数据。

  • 性能与压力测试:批量生成大规模数据集来模拟真实负载。

  • API 开发调试:快速构造 API 返回的模拟响应数据。

  • 数据脱敏:替换生产数据中的敏感信息。

支持以下语言环境

Bogus 支持以下语言环境:

创建一个 .NET 控制台应用

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

项目 NuGet 安装

在 NuGet 包管理器控制台中执行:

Install-Package Bogus

或者在 NuGet 包管理器中搜索安装:

Bogus 快速入门

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

以下是 Bogus 仓库中提供的示例代码,使用 Bogus 生成了 3 个带随机订单的模拟用户。

public class Program { static void Main(string[] args) { //生成 3 个随机订单的模拟用户信息 var users = GenerateSampleUsers(3); } /// <summary> /// 生成随机订单的模拟用户 /// </summary> /// <param name="count"></param> /// <returns></returns> public static List<User> GenerateSampleUsers(int count = 3) { // 设置随机种子,生成可重复的数据集 Randomizer.Seed = new Random(3897234); var fruit = new[] { "apple", "banana", "orange", "strawberry", "kiwi" }; var orderIds = 0; var testOrders = new Faker<Order>() // 开启严格模式:确保所有属性都有规则 .StrictMode(true) // OrderId 自增 .RuleFor(o => o.OrderId, f => orderIds++) // 从水果篮中随机挑选 .RuleFor(o => o.Item, f => f.PickRandom(fruit)) // 随机数量 1~10 .RuleFor(o => o.Quantity, f => f.Random.Number(1, 10)) // 可空 int?,80% 概率为 null .RuleFor(o => o.LotNumber, f => f.Random.Int(0, 100).OrNull(f, .8f)); var userIds = 0; var testUsers = new Faker<User>() // 自定义构造函数 .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####"))) // 基本规则 .RuleFor(u => u.FirstName, f => f.Name.FirstName()) .RuleFor(u => u.LastName, f => f.Name.LastName()) .RuleFor(u => u.Avatar, f => f.Internet.Avatar()) .RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName)) .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName)) .RuleFor(u => u.SomethingUnique, f => $"Value {f.UniqueIndex}") .RuleFor(u => u.SomeGuid, Guid.NewGuid) // 随机选取枚举 .RuleFor(u => u.Gender, f => f.PickRandom<Gender>()) .RuleFor(u => u.CartId, f => Guid.NewGuid()) // 组合属性:利用已生成的 FirstName 和 LastName .RuleFor(u => u.FullName, (f, u) => u.FirstName + " " + u.LastName) // 嵌套集合生成 .RuleFor(u => u.Orders, f => testOrders.Generate(3)) // 生成完成后的回调 .FinishWith((f, u) => { Console.WriteLine("User Created! Name={0}", u.FullName); }); // 一次生成 3 个用户 return testUsers.Generate(count); } } /// <summary> /// 订单实体 /// </summary> public class Order { public int OrderId { get; set; } public string Item { get; set; } public int Quantity { get; set; } public int? LotNumber { get; set; } } /// <summary> /// 性别枚举 /// </summary> public enum Gender { Male, Female } /// <summary> /// 用户实体 /// </summary> public class User { public User(int userId, string ssn) { this.Id = userId; this.SSN = ssn; } public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get; set; } public string UserName { get; set; } public string Email { get; set; } public string SomethingUnique { get; set; } public Guid SomeGuid { get; set; } public string Avatar { get; set; } public Guid CartId { get; set; } public string SSN { get; set; } public Gender Gender { get; set; } public List<Order> Orders { get; set; } }

生成随机用户信息

使用 Bogus 快速生成随机用户姓名、邮箱、地址、电话等关联数据:

/// <summary> /// 生成随机用户信息 /// </summary> public static void GenerateRandomData() { // 自动生成姓名、邮箱、地址、电话等关联数据 var faker = new Faker("zh_CN");// 使用简体中文 var randomName = faker.Name.FullName(); var randomEmail = faker.Internet.Email(); var randomAddress = faker.Address.FullAddress(); var randomPhone = faker.Phone.PhoneNumber(); Console.WriteLine($"Name: {randomName}"); Console.WriteLine($"Email: {randomEmail}"); Console.WriteLine($"Address: {randomAddress}"); Console.WriteLine($"Phone: {randomPhone}"); }

EF Core 数据库种子数据填充

使用 EF Core 填充 Blog & Post 数据:

/// <summary> /// EF Core 数据库种子数据填充 /// 适合开发/测试环境,在应用启动时自动填充数据: /// FakeData.Init(10); // 生成 10 个 Blog,每个包含 3~5 篇 Post /// </summary> public static class FakeData { public static List<Blog> Blogs = new List<Blog>(); public static List<Post> Posts = new List<Post>(); public static void Init(int count) { var postId = 1; var postFaker = new Faker<Post>() .RuleFor(p => p.PostId, _ => postId++) .RuleFor(p => p.Title, f => f.Hacker.Phrase()) .RuleFor(p => p.Content, f => f.Lorem.Sentence()); var blogId = 1; var blogFaker = new Faker<Blog>() .RuleFor(b => b.BlogId, _ => blogId++) .RuleFor(b => b.Url, f => f.Internet.Url()) .RuleFor(b => b.Posts, (f, b) => { postFaker.RuleFor(p => p.BlogId, _ => b.BlogId); var posts = postFaker.GenerateBetween(3, 5); // 关键:收集所有 Posts 到静态列表中 Posts.AddRange(posts); return posts; }); // 清空旧数据,避免重复调用累积 Blogs.Clear(); Posts.Clear(); Blogs = blogFaker.Generate(count); } } /// <summary> /// Blog /// </summary> public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } /// <summary> /// Post /// </summary> public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } }

在 Program.cs 启动时填充:

public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 注册 DbContext builder.Services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); var app = builder.Build(); // 应用启动时填充种子数据 using (var scope = app.Services.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService<BlogDbContext>(); // 确保数据库已创建 context.Database.EnsureCreated(); // 仅在数据库为空时填充假数据 if (!context.Blogs.Any()) { FakeData.Init(10); // 生成 10 个 Blog,每个包含 3~5 篇 Post context.Blogs.AddRange(FakeData.Blogs); context.Posts.AddRange(FakeData.Posts); context.SaveChanges(); Console.WriteLine($"已填充 {FakeData.Blogs.Count} 个博客, {FakeData.Posts.Count} 篇文章"); } } app.MapControllers(); app.Run(); } }

自定义扩展 Bogus 数据集

开发者可以轻松扩展 Bogus,添加自定义的数据生成器:

/// <summary> /// 为 Bogus 的 Faker 类提供食品相关的自定义假数据扩展方法 /// </summary> public static class FoodExtensions { /// <summary> /// 生成一个随机的糖果名称 /// </summary> /// <param name="faker"></param> /// <returns></returns> public static string Candy(this Faker faker) { return faker.PickRandom(new[] { "巧克力", "棒棒糖", "口香糖", "软糖", "太妃糖" }); } /// <summary> /// 生成一个随机的饮品名称 /// </summary> /// <param name="faker"></param> /// <returns></returns> public static string Drink(this Faker faker) { return faker.PickRandom(new[] { "可乐", "雪碧", "橙汁", "咖啡", "牛奶" }); } } // 使用自定义扩展 var faker = new Faker(); Console.WriteLine($"最爱糖果: {faker.Candy()}"); Console.WriteLine($"最爱饮料: {faker.Drink()}");

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

  • GitHub开源地址:https://github.com/bchavez/Bogus

  • 文章代码示例:https://github.com/YSGStudyHards/DotNetExercises/tree/master/BogusExercise

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

  • GitHub开源地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

  • Gitee开源地址:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 7:13:14

智能指南针-Android studio软件源代码-java语言

智能指南针&#xff1a;简介与使用说明 一、软件简介 &#x1f9ed; 软件名称&#xff1a;智能指南针核心功能&#xff1a;一款集成了方向指示、海拔测量、气压监测及经纬度定位的多功能户外导航工具。 主要特点 精准方向指示&#xff1a;通过手机传感器实时显示方位&#xff0…

作者头像 李华
网站建设 2026/4/13 18:35:51

-Android studio软件源代码-java语言

本地视频播放器&#xff1a;简介与使用说明 一、软件简介 &#x1f3ac; 软件名称&#xff1a;本地视频播放器核心功能&#xff1a;一款专为移动端设计的本地视频播放工具&#xff0c;支持多格式视频文件的管理与播放&#xff0c;提供便捷的播放控制。 主要特点 本地播放&#…

作者头像 李华
网站建设 2026/4/8 21:37:43

效果实测:李慕婉-仙逆-造相Z-Turbo生成的动漫图片质量

效果实测&#xff1a;李慕婉-仙逆-造相Z-Turbo生成的动漫图片质量 最近在AI绘画圈子里&#xff0c;一个专门生成《仙逆》角色李慕婉的模型火了。它就是“李慕婉-仙逆-造相Z-Turbo”。光听名字就知道&#xff0c;这是个针对性很强的模型&#xff0c;专门为喜欢这部作品、想创作…

作者头像 李华
网站建设 2026/4/15 17:16:25

多模态交互技术:AI原生应用的创新驱动力

多模态交互技术:AI原生应用的创新驱动力 关键词:多模态交互技术、AI原生应用、多模态融合、自然交互、多模态模型、用户体验、创新驱动力 摘要:本文将带您走进“多模态交互技术”的奇妙世界,从生活场景出发,用“给小学生讲故事”的语言,解释多模态交互的核心概念、技术原…

作者头像 李华
网站建设 2026/3/23 0:50:49

数据科学家必备:大数据标准化的10个黄金法则

数据科学家必备&#xff1a;大数据标准化的10个黄金法则关键词&#xff1a;大数据标准化、数据科学家、黄金法则、数据质量、数据处理摘要&#xff1a;本文围绕数据科学家必备的大数据标准化的10个黄金法则展开。首先介绍了大数据标准化的背景知识&#xff0c;接着详细解释了核…

作者头像 李华
网站建设 2026/4/8 19:28:03

Qwen3-ASR-1.7B语音识别入门:从上传到输出的完整流程

Qwen3-ASR-1.7B语音识别入门&#xff1a;从上传到输出的完整流程 1. 引言 1.1 为什么你需要一个真正好用的语音识别工具&#xff1f; 你有没有遇到过这些场景&#xff1a; 开会录音整理成文字要花两小时&#xff0c;还漏掉关键决策点&#xff1b;听外语播客想快速获取要点&…

作者头像 李华