C#如何使用Bogus创建模拟数据示例代码
原文:creating sample data for c#
作者:bruno sonnino
译文:c#中使用bogus创建模拟数据
译者: lamond lu
背景
在我每次写技术类博文的时候,经常做的一件事就是创建模拟数据。在每篇博文中,为了解释某些概念,我需要创建许多模拟数据。这是一个我在实际中遇到的问题,因为我需要为我的程序找到一些合适的数据。有些时候,我会从数据库中找一些数据(northwind和adventureworks都是我的好朋友^.^), 有些时候,我会使用一些现成的json或者xml数据,当然有时候我只能自己手动创建一些数据。
当然以上方案都不完美,也都不稳定,所以每次我都需要探索一些新方式来获取数据(对于学习来说这很好,但是维护起来确是一种灾难)。
最后我找到了bogus, 一个基于c#的简单数据生成器。
使用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库的引用。当你运行程序之后,你会得要以下结果。
如上所见,程序生成了一个顾客的数据集,并附带了每个顾客的所有订单信息。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
上一篇: iPhone SDK beta 2 发布