Genfu Framework Kullanarak Test-Dummy Data Oluşturma

Bir süre önce üzerinde çalıştığım bir proje için Api uygulaması geliştiriyordum ve bu api'de bulunan end-point'leri kullanan ios ve android olmak üzere 2 tanede client bulunmaktaydı. Uygulamada dışa bağımlılığı bulunan(farklı veri sağlayıcılar) 2 tane Query fonksyinonu geliştirirken dış sağlayıcılar kendi yaptıkları geliştirmeyi yetiştiremediğinden benim üzerinde çalıştığım uygulamadada gecikmeler söz konusu olacaktı ve buna engel olmak adına mobile-client yazan arkadaşlara fake-data sağlayarak geliştirmeye devam etme konusunda hemfikir olduk. Tabikide bir loop içerisinde list.Add(new Foo()) demek yerine bu tür işler için kütüphaneler olduğunu farkettim ve Genfu kütüphanesini kullanmaya karar verdim.

Genfu; çeşitli konfigurasyonlar tanımlayarak test-data oluşturmanızı sağlayan oldukça complex tanımlamalar yaratarak kullanabileceğimiz bir framework'dür.

 

GenFu is a library you can use to generate realistic test data. It is composed of several property fillers that can populate commonly named properties through reflection using an internal database of values or randomly created data. You can override any of the fillers, give GenFu hints on how to fill them.

Örneğin product listesi dönen bir end-point tasarladığımızı düşünelim ve Genfu kullanarak test-data'ları oluşturarak bu endpoint'in return etmesini sağlayalım.

Vs'da bir WebApi projesi oluşturduysak, nuget üzerinden aşağıdaki komutu kullanarak genfu'yu projemiz referanslarına ekleyelim.

install-package GenFu

Product sınıfımız aşağıdaki gibi olsun.

public class ProductDto
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
    public DateTime ExpireDate { get; set; }
    public string Code { get; set; }
}

Genfu kullanım olarak oldukça basit. Eğer tek bir product oluşturmak istiyorsak yapmamız gereken,

var product = A.New<ProductDto>();

Eğer listOfProduct oluşturmak istiyorsak count bilgisi vererek şu şekidle oluşturabiliriz,

var listOfProduct = A.ListOf<ProductDto>(250);

Peki ya fiyatı $18.00 ile $46.00 arasında, ExpireDate'i ileri bir tarih ve Code property’sinin Value’su şunlardan biri "TR", "UK", "US", "FR", "GE", "NL"  olan ürünler oluşturmam gerekiyorsa;

A.Configure<ProductDto>()
    .Fill(p => p.Price)
    .WithinRange(18, 46);

A.Configure<ProductDto>()
    .Fill(p => p.ExpireDate)
    .AsFutureDate();

var codeList = new List<string>() { "TR", "UK", "US", "FR", "GE", "NL" };
A.Configure<ProductDto>()
    .Fill(p => p.Code).WithRandom(codeList);

Projenizi run edip endpoint'ın döndüğü result'a bakacak olursak;

[HttpGet]
public GetAllProductResponse Get()
{
    var listOfProduct = A.ListOf<ProductDto>(5);

    return new GetAllProductResponse
    {
        ProductList = listOfProduct
    };
}
{
   "productList":[
      {
         "id":"f982280d-94cd-4ac5-be3b-3860560dc3c9",
         "name":"shorts",
         "price":27.38,
         "quantity":73,
         "expireDate":"2020-10-12T17:31:19.3580228+03:00",
         "code":"NL"
      },
      {
         "id":"21e2ae7f-43ad-4c9f-a9bd-89eb59b885cf",
         "name":"them",
         "price":18.79,
         "quantity":23,
         "expireDate":"2020-07-28T04:36:29.3604574+03:00",
         "code":"FR"
      },
      {
         "id":"17769e84-77ea-4a98-884d-1d07a7240eab",
         "name":"shorts",
         "price":31.60,
         "quantity":42,
         "expireDate":"2020-08-22T06:20:56.3605175+03:00",
         "code":"GE"
      },
      {
         "id":"32971066-a892-47fd-9680-7d15d954cebc",
         "name":"shorts",
         "price":18.59,
         "quantity":23,
         "expireDate":"2020-11-09T12:56:16.3605641+03:00",
         "code":"FR"
      },
      {
         "id":"7e9d1ab1-b753-4a25-9fb0-12364625fd73",
         "name":"Cardigan",
         "price":19.23,
         "quantity":49,
         "expireDate":"2020-11-21T03:29:26.360619+03:00",
         "code":"US"
      }
   ]
}

Özetleyecek olursak, günlük hayatta development yaparken şu cümleyi çoğumuz duyarız "karşı tarafın servisi hazır değil ama sen geliyomuş gibi yaz.. " yada "sen business layer'ı yazarken client'a önden dummy-data ver onlarda devam etsin.." etc. Genfu uygulamalarınız için sadece endpoint’in döneceği response için değil kendi iç dependent olduğunuz servis sağlayıcılar içinde fake-data'lar oluşturmanızı sağlayan oldukça fonksiyonel bir kütüphanedir ve sahip olduğu geniş extension method'lar kullanılarak ihtiyacımız olan fixture'ların hemen hemen hepsine çözüm olabilir.

Source

Add comment