news 2026/10/24 12:13:04

一款开源、强大、简单易用的 .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/10/20 22:38:16

Anything XL vs 其他SDXL模型:二次元生成效果对比

Anything XL vs 其他SDXL模型&#xff1a;二次元生成效果对比 大家好&#xff0c;我是专注于AI绘画技术探索的彤姐。在SDXL模型生态中&#xff0c;选择一款合适的二次元生成模型常常让人眼花缭乱。今天&#xff0c;我们就来深入对比一下近期备受关注的万象熔炉 | Anything XL与…

作者头像 李华
网站建设 2026/10/23 20:11:51

保姆级教程:用ollama快速搭建QwQ-32B文本生成服务

保姆级教程&#xff1a;用ollama快速搭建QwQ-32B文本生成服务 你是不是也想体验一下最近很火的推理大模型QwQ-32B&#xff1f;但一看到复杂的部署流程就头疼&#xff1f;别担心&#xff0c;今天我就带你用最简单的方法&#xff0c;在10分钟内搭建一个属于自己的QwQ-32B文本生成…

作者头像 李华
网站建设 2026/10/19 19:30:23

实战分享:Qwen3-ForcedAligner-0.6B在语音处理中的惊艳表现

实战分享&#xff1a;Qwen3-ForcedAligner-0.6B在语音处理中的惊艳表现 1. 引言&#xff1a;从“听”到“看”的精准对齐 你有没有想过&#xff0c;一段语音里的每个字、每个词&#xff0c;具体是在哪个时间点说出来的&#xff1f;这个看似简单的需求&#xff0c;在语音处理领…

作者头像 李华
网站建设 2026/10/20 5:54:12

StructBERT中文版:语义相似度计算的GPU加速实践

StructBERT中文版&#xff1a;语义相似度计算的GPU加速实践 1. 快速上手&#xff1a;从零部署到第一个相似度判断 如果你正在寻找一个能快速判断中文句子相似度的工具&#xff0c;StructBERT中文版可能是你需要的解决方案。这个工具基于阿里达摩院开源的StructBERT-Large模型…

作者头像 李华
网站建设 2026/10/20 5:54:12

DeepSeek-OCR-2保姆级教程:本地部署+文档解析全流程

DeepSeek-OCR-2保姆级教程&#xff1a;本地部署文档解析全流程 你是不是也经历过这样的尴尬&#xff1f;手头有一叠纸质合同、扫描版标书、PDF版技术手册&#xff0c;想快速提取内容做比对或归档&#xff0c;却卡在第一步&#xff1a;复制粘贴出来的全是乱码&#xff0c;表格错…

作者头像 李华