تولید اطلاعات تصادفی توسط GenFu


گاها برای تولید اطلاعات تصادفی، خصوصا هنگام نوشتن تست‌ها، زمان زیادی بیهوده تلف شده و حجم زیادی کد اضافه تولید میشود. کتابخانه‌ای بنام GenFu ایجاد شده که وظیفه ایجاد داده‌های تصادفی را بر عهده گرفته‌ است. این کتابخانه متن باز (Open Source) بوده و می‌توانید آن را از مخزن گیت‌هاب دریافت نمایید.

در مطلب جاری قصد ایجاد اطلاعات تصادفی برای کلاس زیر را داریم :

public class Person
{
    public int ID { get; set; }

    public string Firstname { get; set; }

    public string Lastname { get; set; }

    public string Email { get; set; }

    public string PhoneNumber { get; set; }

    public override string ToString()
    {
        return $"{ID}: {Firstname} {Lastname} - {Email} - {PhoneNumber}";
    }
}

نصب GenFu

برای نصب کتابخانه GenFu از دستور زیر در Package Manager Console استفاده میکنیم :

Install-Package GenFu

1. ایجاد یک شخص

برای ایجاد شخصی جدید همراه با اطلاعاتی تصادفی به شکل زیر عمل خواهیم کرد :

var person = A.New<Person>();
Console.WriteLine(person);

نتیجه کد فوق به این صورت خواهد بود :

18: Diedra Morgan - [email protected] - (531) 273-9001

اگر دقت کنید متوجه میشوید که GenFu بصورت خودکار داده‌هایی مرتبط با Property هایی که نام گذاری کردید‌، ایجاد کرده‌است.

برای Email، داده‌ای با فرمت صحیح ایمیل و برای PhoneNumber هم شماره تلفنی با فرمت صحیح تولید شده است.


2. ایجاد چند شخص

برای ایجاد لیستی از اشخاص نیز میتوانید از متد ListOf استفاده کرده و تعداد اشخاص مورد نیازتان را به آن ارسال کنید ( پیشفرض 25 ) :

var people = A.ListOf<Person>(5);
people.ForEach(Console.WriteLine);

کد فوق باعث ایجاد 5 شخص با اطلاعات تصادفی متفاوتی خواهد شد:

97: Maria MacKenzie - [email protected] - (670) 787-3053
34: Alexander Scott - [email protected] - (730) 645-4946
66: Kevin Perez - [email protected] - (230) 758-8233
81: Maria Evans - [email protected] - (508) 572-4343
79: Tyler Parker - [email protected] - (297) 357-7617

تا به اینجای کار GenFu بخوبی جوابگوی نیازهایمان بوده‌است. اما اگر پیشفرض‌ها جوابگو نبود و بخواهیم فرمت داده‌های تولید شده را تغییر دهیم چطور ؟

برای اینکار میتوانیم از متد Configure استفاده کرده و نحوه ایجاد داده را برای Property هایی که مشخص میکنیم، تغییر دهیم.


3. ایجاد چند شخص و مقدارهی یک property با مقدار ثابت

اگر بخواهیم داده‌های ایجاد شده را داخل دیتابیس لحاظ کنیم، نیاز داریم تا ID آن‌ها را برابر 0 قرار دهیم تا دیتابیس مشکلی برای ثبتشان نداشته باشد. برای ایجاد لیستی از اشخاص که ID آن‌ها برابر 0 باشد :

A.Configure<Person>().Fill(x => x.ID, 0);

var people = A.ListOf<Person>(5);
people.ForEach(Console.WriteLine);

نتیجه :

0: Darron Gonzalez - [email protected] - (405) 418-7783
0: Melanie Garcia - [email protected] - (711) 277-8826
0: James Hughes - [email protected] - (734) 400-8322
0: Miranda Torres - [email protected] - (495) 479-8147
0: David Hughes - [email protected] - (361) 617-6642

در این حالت بدون هیچگونه مشکلی میتوانید داده‌های ایجاد شده را داخل دیتابیس ذخیره نمایید.


4. ایجاد چند شخص و مقداردهی یک property با متد

حالت دیگری که میتوانید نحوه مقداردهی یک Property را تنظیم کنید، استفاده از متد یا delegate است:

var i = 1;

A.Configure<Person>()
    .Fill(c => c.ID, () => i++);

var people = A.ListOf<Person>(5);
people.ForEach(Console.WriteLine);

نتیجه :

1: Paul Long - [email protected] - (202) 573-6278
2: Jesse Iginla - [email protected] - (589) 791-3606
3: Raymundo Price - [email protected] - (336) 400-1601
4: Elizabeth Getzlaff - [email protected] - (662) 582-9010
5: Abigail Bailey - [email protected] - (225) 661-7023

همانطور که می‌بینید، ID اشخاص بصورت تصاعدی مقداردهی شده است.


5. ایجاد چند شخص و مقداردهی یک property با مقادیر property‌های دیگر

همچنین میتوانید از مقادیر Property‌های دیگر برای مقداردهی یک Property استفاده کنید :

A.Configure<Person>()
    .Fill(c => c.ID, 0)
    .Fill(c => c.Email,
        c => $"{c.Firstname}.{c.Lastname}@gmail.com");

var people = A.ListOf<Person>(5);
people.ForEach(Console.WriteLine);

کد فوق باعث تولید اشخاصی میشود که ایمیل آن‌ها برابر (Firstname).(Lastname) خواهد بود :

0: Patrick Perry - [email protected] - (796) 460-6576
0: Rebecca Main - [email protected] - (757) 472-3332
0: Kimberly Carter - [email protected] - (436) 484-8273
0: Sara Lewis - [email protected] - (424) 717-7682
0: Lauren Ross - [email protected] - (277) 294-5776

6. استفاده از Extension‌های درون ساخت GenFu برای مقداردهی

GenFu دارای Extension هایی بوده که باعث میشوند اطلاعات یک Property با مقادیر قابل درک و مشخصی پر شوند.

مثال :

A.Configure<Person>()
    .Fill(x => x.Firstname).AsPersonTitle();

var people = A.ListOf<Person>(5);
people.ForEach(Console.WriteLine);

نتیجه :

64: Miss. Ratzlaff - [email protected] - (386) 309-2414
7: Air Marshall Yarobi - [email protected] - (459) 238-0717
96: Air Marshall Taylor - [email protected] - (775) 401-5281
28: Doctor Cox - [email protected] - (569) 464-7961
99: Master Phillips - [email protected] - (578) 221-9021

7. GenFu WireFrame

در نهایت GenFu دارای پکیج جانبی به اسم Wireframes است که شامل HTML Helper هایی است که با استفاده از آن‌ها میتوانید المان‌های HTML مانند P, Image, Table و … را با مقادیری برای تست بعنوان Placeholder ایجاد کنید.

برای نصب و مطالعه بیشتر درباره GenFu WireFrames این لینک را ببینید.