欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#如何使用Bogus创建模拟数据示例代码

程序员文章站 2023-11-01 09:08:28
原文:creating sample data for c# 作者:bruno sonnino 译文:c#中使用bogus创建模拟数据 译者: lamon...

原文:creating sample data for c#

作者:bruno sonnino

译文:c#中使用bogus创建模拟数据

译者: lamond lu

背景

在我每次写技术类博文的时候,经常做的一件事就是创建模拟数据。在每篇博文中,为了解释某些概念,我需要创建许多模拟数据。这是一个我在实际中遇到的问题,因为我需要为我的程序找到一些合适的数据。有些时候,我会从数据库中找一些数据(northwind和adventureworks都是我的好朋友^.^), 有些时候,我会使用一些现成的json或者xml数据,当然有时候我只能自己手动创建一些数据。

当然以上方案都不完美,也都不稳定,所以每次我都需要探索一些新方式来获取数据(对于学习来说这很好,但是维护起来确是一种灾难)。

最后我找到了bogus, 一个基于c#的简单数据生成器。

C#如何使用Bogus创建模拟数据示例代码

使用bogus生成模拟数据, 你只需要定义规则并生成数据即可,就是这么简单。而且bogus可以生成固定数据或者变化数据。这样一旦你拿到了这些数据,你就可以把它们序列化成你想要的格式: json, xml,数据库或者文本文件。

生成模拟数据

为了生成模拟数据,我们首先需要针对模拟数据创建对应的实体类。这里我们可以创建一个命令行程序,并添加一下两个类。

public class customer
{
 public guid id { get; set; }
 public string name { get; set; }
 public string address { get; set; }
 public string city { get; set; }
 public string country { get; set; }
 public string zipcode { get; set; }
 public string phone { get; set; }
 public string email { get; set; }
 public string contactname { get; set; }
 public ienumerable<order> orders { get; set; }
}
public class order
{
 public guid id { get; set; }
 public datetime date { get; set; }
 public decimal ordervalue { get; set; }
 public bool shipped { get; set; }
}

在你创建好以上两个实体类之后,你就可以来添加仓储来获取模拟数据了。为了使用bogus, 你可以使用nuget将bogus库添加到你的项目中。

install-package bogus

下面我们就可以来添加一个仓储类来获取模拟数据了。这里我们添加一个samplecustomerrepository类,并加入以下方法。

public ienumerable<customer> getcustomers()
{
 randomizer.seed = new random(123456);
 var ordergenerator = new faker<order>()
  .rulefor(o => o.id, guid.newguid)
  .rulefor(o => o.date, f => f.date.past(3))
  .rulefor(o => o.ordervalue, f => f.finance.amount(0, 10000))
  .rulefor(o => o.shipped, f => f.random.bool(0.9f));
 var customergenerator = new faker<customer>()
  .rulefor(c => c.id, guid.newguid())
  .rulefor(c => c.name, f => f.company.companyname())
  .rulefor(c => c.address, f => f.address.fulladdress())
  .rulefor(c => c.city, f => f.address.city())
  .rulefor(c => c.country, f => f.address.country())
  .rulefor(c => c.zipcode, f => f.address.zipcode())
  .rulefor(c => c.phone, f => f.phone.phonenumber())
  .rulefor(c => c.email, f => f.internet.email())
  .rulefor(c => c.contactname, (f, c) => f.name.fullname())
  .rulefor(c => c.orders, f => ordergenerator.generate(f.random.number(10)).tolist());
 return customergenerator.generate(100);
}

这里的第三行代码,我们为randomizer.seed属性指定一个固定的随机种子,因此每次生成的数据都是一样的。如果你不希望每次都生成固定的数据,你可以去掉这行代码。

这里我们为订单和客户数据的生成定义了规则,然后我们调用了generate方法来生成模拟数据。就是这么简单。

如上所见,bogus提供了许多类来生成数据。例如company类可以用来生成公司模拟数据,例如公司名称。你可以使用这些生成的数据作为你程序的模拟数据,这些数据有3种使用场景

  • 单元测试的模拟测试数据
  • 设计阶段的模拟数据
  • 原型的模拟数据

但是我确信,你能发现更多的使用场景。

这里为了使用这些数据,你可以在main方法中加入以下代码

static void main(string[] args)
{
 var repository = new samplecustomerrepository();
 var customers = repository.getcustomers();
 console.writeline(jsonconvert.serializeobject(customers, 
  formatting.indented));
}

这里我们将模拟数据转换成了json字符串,所以这里你需要添加对newtonsoft.json库的引用。当你运行程序之后,你会得要以下结果。

C#如何使用Bogus创建模拟数据示例代码

如上所见,程序生成了一个顾客的数据集,并附带了每个顾客的所有订单信息。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。