Bogus를 이용한 Fake Data 생성 #10

개발에 있어 테스트 데이터는 중요합니다. 실제 환경을 더 재현할 수 있어 단위 테스트를 생성하거나 데이터베이스에 샘플 데이터를 삽입하려는 경우에는 데이터를 생성하는 데 많은 시간을 들이지 않고 대표적인 데이터를 사용하는 것이 중요합니다.
그래서 bogus library가 나옵니다. 이 오픈 소스 NuGet 패키지를 사용하면 애플리케이션 또는 데이터베이스에서 다양한 용도로 사용할 수 있는 가짜 데이터를 신속하게 생성할 수 있습니다. 이 강좌에서는 우리는 보거스가 생성한 가짜 데이터를 사용하는 애플리케이션을 빠르게 동작시키는 방법에 대해 알아볼 것입니다

출처:https://youtu.be/ONJUPMYBgKI

blazor 서버앱을 한개 생성하곘습니다.
구성은 그냥 기본으로 하곘습니다.

Nuget 에서 bogus 패키지를 설치해줍니다.
프로젝트를 생성하면 기본적인 sample앱을 볼수있습니다.


Model 폴더에 PersonModel Model을 생성합니다.

PersonModel.cs

public record PersonModel(
int id,
string firstname,
string lastname,
string email,
string phone, 
    string streetaddress,
    string city,
    string state,
    string zipcode,
    CreditRating Rating
    );
    
Enums.cs

public enum CreditRating
{
    Excellent,
        VeryGood,
        Good,
        Fair,
        Poor
}

imort.razor에 using 시켜줍니다.
그리고 임시 데이타를 생성할 class를 생성합니다.

DataGenerator.cs

using Bogus;

public class DataGenerator
{
    Faker<PersonModel> personModelFake;

    public DataGenerator()
    {
        Randomizer.Seed = new Random(123);
        personModelFake = new Faker<PersonModel>()
            .RuleFor(u => u.id, f => f.Random.Int(1, 10000))
            .RuleFor(u => u.firstname, f => f.Name.FindName())
            .RuleFor(u => u.lastname, f => f.Name.LastName())
            .RuleFor(u => u.city, f => f.Address.City())
            .RuleFor(u => u.phone, f => f.Phone.PhoneNumber())
            .RuleFor(u => u.state, f => f.Address.StateAbbr())
            .RuleFor(u => u.zipcode, f => f.Address.ZipCode())
            .RuleFor(u => u.email, (f, u) => f.Internet.Email(u.firstname, u.lastname))
            .RuleFor(u => u.phone, f => f.Name.FindName())
            .RuleFor(u => u.Rating, f => f.PickRandom<CreditRating>());
    }

    public PersonModel GeneratePerson()
    {
        return personModelFake.Generate();
    }
}

using Bogus; using 을 한후
Faker personModelFake; bogus Provider를 선업합니다.
그리고 생성자에
Randomizer.Seed = new Random(123); 생성한 임시데이타에 수량을 설정한후

이런식으로 값 value에 rule 설정해서 임시데이타를 설정합니다.
personModelFake = new Faker()
.RuleFor(u => u.id, f => f.Random.Int(1, 10000))
.RuleFor(u => u.zipcode, f => f.Address.ZipCode())
.RuleFor(u => u.email, (f, u) => f.Internet.Email(u.firstname, u.lastname))
.RuleFor(u => u.phone, f => f.Name.FindName())
.RuleFor(u => u.Rating, f => f.PickRandom());

그리고 program.cs에서 해당 DataGenerator 의존성을 선언합니다.

builder.Services.AddTransient();

Index.razor

@page "/"

@inject DataGenerator data

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

@data.GeneratePerson().ToString()

이렇게 하고 실행은 하면 오류가 나는데 record 모델은 동적으로 바인딩할수 없기 때문입니다. 이럴떄 약간의 꽁수로 record를 get set 모델로 바꿉니다.

public record PersonModel {
public  int id { get; set; }
public  string firstname { get; set; }
public  string lastname { get; set; }
public  string email { get; set; }
public  string phone { get; set; }
public  string streetaddress { get; set; }
public  string city { get; set; }
public  string state { get; set; }
public  string zipcode { get; set; }
public   CreditRating Rating { get; set; }
}

실행을 하면

꽤 쓸만한 쓸만한 데이타가 나옵니다.

여러개의 임시 데이타를 얻기 위해서는

 public IEnumerable<PersonModel> GenerateForever()
  {
      return personModelFake.GenerateForever();
  }

GenerateForever 로 생성하고

 private void LoadData()
  {
      //var results = data.GeneratePerson();
      //people.Add(results);
      var results = data.GenerateForever().Take(10);
      people.AddRange(results); 
  }

원하는 갯수만큼 가져올수 있습니다.

7개의 좋아요