[C#]使用BOGUS來大量產生假資料

[C#]使用BOGUS來大量產生假資料

前言

我們平時開發有很多時候,都需要產生假資料,比如說我們要做poc,甚至設計資料庫的時候,需要對table產生資料,或者在後端資料庫還沒完成的時候,可能在web api就要先產生假資料來做ui的部份,還有一種狀況是在TDD開發的時候,為了要做stub的狀況,我們也必須要產生假資料,如果只是新增個兩三筆還可以,但如果要產生大量假資料就很麻煩,接下來就介紹一下,如何使用BOGUS方便的快速產生大量假資料。

導覽

  1. 下載
  2. 新增一筆資料
  3. 新增多筆資料
  4. 格式化假資料
  5. 產複雜物件的假資料
  6. 結論

下載

首先用nuget搜尋一下BOGUS,而github連結位置https://github.com/bchavez/Bogus

新增一筆資料

在此我是直接使用linq pad來示例,為求方便我會把註解說明寫在程式碼裡面,我們先看一下最簡單的使用方式,假設我現在要新增一筆假資料

void Main()
{
	var faker = new Faker("en"); //這裡可以指定多國語系,比如-zh_TW,zh_CN....值得注意的是英文最齊全,其餘的語系並不一定會有相對應的名詞
	var o = new Order()
	{
		OrderId = faker.Random.Number(1, 100),
		Item = faker.Lorem.Sentence(), //這邊都是Bogus提供的名詞,有非常多種,比如下面是的是產品名稱
		OrderName=faker.Commerce.Product(),
		Quantity = faker.Random.Number(1, 10)
	};
	Console.WriteLine(o);
}

class Order
{
	public int OrderId { get; set; }
	public string Item { get; set; }
	public int Quantity { get; set; }
	public string OrderName { get; set; }
}

另一種新增假資料的方式

void Main()
{
	int orderId=1;
	var faker=new Faker<Order>("en")
		.RuleFor(u=>u.OrderId,f=>f.Random.Number(1,100))
		.RuleFor(u=>u.Item,f=>f.Lorem.Sentence())
		.RuleFor(u=>u.Quantity,f=>f.Random.Number(1,10))
		.RuleFor(u=>u.OrderName,f=>f.Commerce.Product());
	var order=	faker.Generate();
	Console.WriteLine(order);
}

新增多筆資料

如果我要新增一仟筆假資料該怎麼做呢

void Main()
{
	var faker = new Faker("en");
	var orders = new List<Order>();
	for (int i = 0; i < 1000; i++)
	{
		orders.Add(new Order
		{
			OrderId = i+1,
			Item = faker.Lorem.Sentence(),
			OrderName = faker.Commerce.Product(),
			Quantity = faker.Random.Number(1, 10)
		});
	}
	Console.WriteLine(orders);
}

class Order
{
	public int OrderId { get; set; }
	public string Item { get; set; }
	public int Quantity { get; set; }
	public string OrderName { get; set; }
}

格式化假資料

如果我需要特別的格式化某些字

void Main()
{
	var tel = new Bogus.Randomizer().Replace("04-228#####"); 
    Console.WriteLine(tel);

    var bid = new Randomizer().Replace("?1########");
    Console.WriteLine(bid);

    var token = new Randomizer().Replace("**********");
    Console.WriteLine(token);
	
	//#代表數字,?代表英文,*代表有可能是英文也有可能是數字
}

產複雜物件的假資料

如果我們物件長這樣子,我們其實可以拆開來做,或者乾脆就寫在一起,在此示例是寫在一起的做法。

void Main()
{
	var faker = new Faker<Order>("en")
		.RuleFor(u => u.OrderId, f => f.Random.Number(1, 100))
		.RuleFor(u => u.Item, f => f.Lorem.Sentence())
		.RuleFor(u => u.Quantity, f => f.Random.Number(1, 10))
		.RuleFor(u => u.OrderName, f => f.Commerce.Product())
		.RuleFor(u => u.Customers, f =>
		{
			return Enumerable.Range(1, 100)
				.Select(x => new Customer { UserName = f.Internet.UserName(), Email = f.Internet.Email() }).ToList();
		});

	var order = faker.Generate();
	Console.WriteLine(order);
}

class Order
{
	public int OrderId { get; set; }
	public string Item { get; set; }
	public int Quantity { get; set; }
	public string OrderName { get; set; }
	public List<Customer> Customers { get; set; }
}

class Customer
{
	public string UserName { get; set; }
	public string Email { get; set; }
}

結論

介紹一個可以快速產大量假資料的方法給各位,如果需要有任何參考,請直接去github查找囉,如果有任何更好的方式,也再請提供給筆者哦。