原文地址:https://www.cnblogs.com/sdflysha/p/20190821-generate-lorem-data.html

在演示Demo、数据库脱敏、性能测试中,有时需要生成大量随机数据。Bogus就是.NET中优秀的高性能、合理、支持多语言的随机数据生成库。

BogusGithub链接:https://github.com/bchavez/Bogus,图标如下:

安装Bogus

目前Bogus最新版是28.0.2,本文演示基本该版本,不保证官方以后会不会修改本文的使用方式。

使用Powershell

PM> Install-Package Bogus -Version 28.0.2

或者使用PackageReference

<PackageReference Include="Bogus" Version="28.0.2" />

使用

我的数据生成代码如下(代码使用LINQPad运行,可以几乎复制到Visual Studio中运行,效果一样,其中.Dump()LINQPad特有方法):

void Main()
{
var userGenerator = new Faker<User>()
.RuleFor(x => x.Id, x => x.IndexFaker + 1)
.RuleFor(x => x.Gender, x => x.Person.Gender)
.RuleFor(x => x.FirstName, (x, u) => x.Name.FirstName(u.Gender))
.RuleFor(x => x.LastName, (x, u) => x.Name.LastName(u.Gender))
.RuleFor(x => x.Email, (x, u) => x.Internet.Email(u.FirstName, u.LastName))
.RuleFor(x => x.BirthDate, x => x.Person.DateOfBirth)
.RuleFor(x => x.Company, x => x.Person.Company.Name)
.RuleFor(x => x.Phone, x => x.Person.Phone)
.RuleFor(x => x.Website, x => x.Person.Website)
.RuleFor(x => x.SSN, x => x.Person.Ssn()); userGenerator.GenerateForever().Take(10).Dump();
} class User
{
public int Id { get; set; }
public Bogus.DataSets.Name.Gender Gender { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime BirthDate { get; set; }
public string Company { get; set; }
public string Phone { get; set; }
public string Website { get; set; }
public string SSN { get; set; }
}

生成的数据如图所示:

注意细节,姓名FirstName/LastName是会根据性别Gender来随机生成的,然后邮箱Email字段也会根据FirstName/LastName来相应地生成,并非完全随机,毫无规律。这些规则是通过.RuleFor()第二个回调的第二个字段来决定的:

.RuleFor(x => x.FirstName, (x, u) => x.Name.FirstName(u.Gender)) // 根据Gender生成FirstName
.RuleFor(x => x.LastName, (x, u) => x.Name.LastName(u.Gender)) // 根据Gender生成LastName
.RuleFor(x => x.Email, (x, u) => x.Internet.Email(u.FirstName, u.LastName)) // 根据姓名生成邮箱

最后的.GenerateForever返回了一个IEnumerable<User>,是一个状态机,可以永久生成数据。

Bogus也提供了一次性生成缓存数据的方法:List<User> Generate(int count)。但由于我可能将这些数据做今后博客文章的性能测试原始数据,数据量可能会非常大,如果将这些数据缓存起来将非常浪费内存,并且影响性能。因此本例中我使用GenerateForever来生成原始数据。

通过.NET Core 3.0最新提供的System.Text.Json里面的JsonSerializerUtf8JsonWriter,我可能以极其高效的方法将这些测试数据序列化为JSON,然后保存到磁盘中:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test-data.json";
using var file = File.Create(path);
using var writer = new Utf8JsonWriter(file, new JsonWriterOptions { Indented = true });
var data = userGenerator.GenerateForever().Take(6_0000);
JsonSerializer.Serialize(writer, data);
Process.Start("explorer", @$"/select, ""{path}""".Dump()); // 资源管理器打开test-data.json文件夹

演示和下载

最后示例数据如下:

一共6万条数据,每条数据有10个字段,test-data.json19,166 KB

可以用如下代码将这6万条数据加载到.NET内存:

void Main()
{
string path = @"C:\Users\sdfly\Desktop\test-data\test-data.json";
byte[] bytes = File.ReadAllBytes(path);
var users = JsonSerializer.Deserialize<List<User>>(bytes);
// 数据分析演示
users.GroupBy(x => x.Email[x.Email.IndexOf('@')..])
.Select(x => new { Host = x.Key, Count = x.Count() })
.Dump();
} class User
{
public int Id { get; set; }
public int Gender { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime BirthDate { get; set; }
public string Company { get; set; }
public string Phone { get; set; }
public string Website { get; set; }
public string SSN { get; set; }
}

结果如下:

所有邮件都是hotmail.com/gmail.com/yahoo.com三种邮箱的均匀分布,每种大约都在20000左右。

.NET使用Bogus生成大量随机数据(转载)的更多相关文章

  1. .NET使用Bogus生成大量随机数据

    .NET如何生成大量随机数据 在演示Demo.数据库脱敏.性能测试中,有时需要生成大量随机数据.Bogus就是.NET中优秀的高性能.合理.支持多语言的随机数据生成库. Bogus的Github链接: ...

  2. mock的使名用一(生成随机数据)

    Mock.Random 是一个工具类,用于生成各种随机数据. Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) . var Random = Moc ...

  3. Python Faker的使用(1):基础使用方法与函数速查,生成随机数据

    在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...

  4. 使用vs2010生成SQL Server 随机数据

    前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷. 为了简单扼要的说明,下面我用一个实例来说明如何快捷使用: 在VS2010创建数据库项 ...

  5. 一个比较全面的java随机数据生成工具包

    最近,由于一个项目的原因需要使用一些随机数据做测试,于是写了一个随机数据生成工具,ExtraRanom.可以看成是Java官方Random类的扩展,主要用于主要用于测试程序.生成密码.设计抽奖程序等情 ...

  6. MOCK.JS 生成随机数据,拦截 Ajax 请求

    mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...

  7. 随机数据生成与对拍【c++版,良心讲解】

    10.7更新:见最下面 离NOIP2018没剩多长时间了,我突然发现我连对拍还不会,于是赶紧到网上找资料,找了半天发现了一个特别妙的程序,用c++写的! 不过先讲讲随机数据生成吧. 很简单,就是写一个 ...

  8. python 数据可视化 -- 生成可控的随机数据集合

    生成可控的随机数据集合 使用 numpy.random 模块 numpy.random.random(size=None)  返回 [0.0, 1.0) 区间的随机 floats, 默认返回一个 fl ...

  9. JS随机生成不重复数据的代码分享

    JS随机生成不重复数据. 代码如下: <script> // 定义存放生成随机数的数组 var array=new Array(); // 循环N次生成随机数 for(var i = 0 ...

随机推荐

  1. DirectShow 常用函数总结

    本文准备总结一些 Direct Show 常用的API接口函数,方便以后查询回忆.如果这里没有你想了解的函数,你可以自行搜索MSDN + 函数名去 MSDN 查找你想要了解的函数,也可以查看百度百科相 ...

  2. IT兄弟连 HTML5教程 了解HTML5的主流应用1

    在很多人眼里,HTML5与互联网营销密切相关,但其实从开发者的角度而言,它是一种网页标准,定义了浏览器语言的编写规范.伴随HTML5标准尘埃落定,浏览器对HTML5特性的逐步支持,再加上国内对HTML ...

  3. 03-模板(过滤器,代码复用,表单,CSRF)

    模块代码复用 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有相同的模板代码内容,但是内容中部分值不一样 多个模板中具有完全相同的 html 代码块内容 像遇到这种 ...

  4. poj-3682 King Arthur's Birthday Celebration

    C - King Arthur's Birthday Celebration POJ - 3682 King Arthur is an narcissist who intends to spare ...

  5. Do Deep Nets Really Need to be Deep?

    url: https://arxiv.org/pdf/1312.6184.pdf year: NIPS2014 浅网络学习深网络的函数表示, 训练方法就是使用深网络的 logits(softmax i ...

  6. laravel中select2多选,初始化默认选中项

    项目中有发送消息功能,需要能通过搜索,多选用户,来指定发送人.使用 select2 插件来完成. select2 的 html 代码如下: <div class="form-group ...

  7. Mysql优化之Explain查询计划查看

    我们经常说到mysql优化,优化中一种常见的方式就是对于经常查询的字段创建索引.那么mysql中有哪些索引类型呢? 一.索引分类1.普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 2.唯一 ...

  8. RabbitMQ的消息确认ACK机制

    1.什么是消息确认ACK. 答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失.为了确保数据不会丢失,RabbitMQ支持消 ...

  9. EF-入门操作

    EntityFramework Core 理解 DbContext :数据库 DbSet: 数据库表 Model : 数据行 IQueryable<Model> 查询结果集合 Lamada ...

  10. startsWith(),endsWith()判断当前字符串是否是以给定字符串开始或结尾的

    package seday01;/** * boolean startsWith(String str) * boolean endsWith(String str) * 判断当前字符串是否是以给定字 ...