原文:CREATING SAMPLE DATA FOR C#[1]
作者: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 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 GetCustomers()
{
Randomizer.Seed = new Random(123456);
var ordergenerator = new Faker()
.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()
.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
庫的取用。當你執行程式之後,你會得要以下結果。
如上所見,程式生成了一個顧客的資料集,並附帶了每個顧客的所有訂單資訊。
References
[1]
CREATING SAMPLE DATA FOR C#: https://blogs.msmvps.com/bsonnino/2019/04/24/creating-sample-data-for-c/
朋友會在“發現-看一看”看到你“在看”的內容