sobota, 26 października 2019

Generowanie danych testowych

Dane testowe to szeroki temat. Dane takie potrzebne są do wstępnych testów aplikacji, testów obciążeniowych (load test) itp.
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