Dane takie można wprowadzić manualnie za pomocą skryptów SQL bądź UI aplikacji. Minusem takiego rozwiązania jest czas potrzebny na stworzenie odpowiedniej ilości rekordów.
Z pomocą przychodzą różnego rodzaju biblioteki, które pozwalają wygenerować dowolną liczbę danych testowych.
Jedną z takich bibliotek, które miałem ostatnio możliwość używać jest Bogus, który można dodać jako paczkę nugeta: https://www.nuget.org/packages/Bogus/
Bogus jest portem popularnej biblioteki faker.js. Autor zadbał aby korzystanie z niego było wygodne i pozwalało korzystać z smaczków C# jak fluent syntax.
Prosty przykład wykorzystania biblioteki:
Tworzymy prosty obiekt przechowujący dane np. osoby:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public override string ToString() { return $"{nameof(FirstName)}: {FirstName}, {nameof(LastName)}: {LastName}, {nameof(Email)}: {Email}"; } }
Następnie ściągamy paczkę nugeta z Bogusem:
PM> Install-Package Bogus
Kolejnym krokiem jest stworzenie obiektu klasy Faker, który pozwala na wypełnianie poszczególnych właściwości klasy danymi:
var faker = new Faker<Person>() .RuleFor(p => p.FirstName, f => f.Person.FirstName) .RuleFor(p => p.LastName, f => f.Person.LastName) .RuleFor(p => p.Email, f => f.Person.Email); var personList = faker.Generate(10); personList.ForEach(Console.WriteLine);
Za pomocą metody RuleFor definiujemy jakimi danymi poszczególne właściwości klasy mają zostać wypełnione. W przykładzie powyżej zdefiniowaliśmy, że faker ma wypełnić imię, nazwisko oraz email. Po uruchomieniu aplikacji zobaczymy następujący efekt:
Dane takie możemy wykorzystać w dowolny sposób.
Bardzo fajnym rozwiązaniem jest także stworzenie klasy która dziedziczy po klasie FakerBase. Rozwiązanie to pozwala opakować kod tworzący dane testowe w różne scenariusze (możemy np. dla jednych testów generować więcej danych, dla innych mniej, stosować inne algorytmy czy też korzystać z wsparcia wielu języków - lokalizacja). Przykładowa klasa implementująca FakerBase:
public class CustomerFaker : FakerBase { public static IList<Customer> GenerateCustomers(int count) { var customerFaker = new Faker<Customer>() .RuleFor(c => c.FirstName, f => f.Person.FirstName) .RuleFor(c => c.LastName, f => f.Person.LastName) .RuleFor(c => c.BirthDate, f => f.Person.DateOfBirth.ToString("d")) .RuleFor(c => c.Id, f => f.Random.Guid()) .RuleFor(c => c.Chain, f => 5136) .RuleFor(c => c.Addresses, f => AddressFaker.GenerateAddresses()) .RuleFor(c => c.Emails, f => EmailFaker.GenerateEmails()) .RuleFor(c => c.Loyalties, f => LoyaltyFaker.GenerateLoyalties()) .RuleFor(c => c.Phones, f => PhoneFaker.GeneratePhones()) .RuleFor(c => c.Prefix, f => f.Name.Prefix()) .RuleFor(c => c.Suffix, f => f.Name.Suffix()) .RuleFor(c => c.MiddleName, f => f.Person.UserName); return customerFaker.Generate(count); } }
Czy warto korzystać z tej biblioteki? Myślę, że tak. Pisanie własnej od zera może i wydaje się fajnym wyzwaniem, jednak zajmie nam niepotrzebnie czas, który możemy poświęcić na inne aspekty rozwoju aplikacji. Lepszym pomysłem wydaje się fork rozwiązania (projekt jest na githubie) i dodanie potrzebnych nam rzeczy.
Biblioteka posiada także wersję premium. Wersja premium dodaje większą ilość słowników oraz plugin do VS, który ułatwia pisanie kodu przypisującego odpowiednie generatory danych dla naszych klas - kolejna oszczędność czasu :)
Brak komentarzy:
Prześlij komentarz