11 Haziran 2022 Cumartesi

Unit Testler İşe Yarıyor Mu? (Uygulamalı)

      S.A. Arkadaşlar,

      Malumunuz yeni iş başlangıçları pek kolay olmaz. Gerçi yeni başlangıçlar genel olarak da kolay olmayabilir. Yeni arkadaşlar, yeni iş, yeni kodlar, adaptasyon derken yazmayı özlediğimi fark ettim. Not aldığım farklı konular da olsa test yazmak gerçekten işe yarıyor mu sorusuna cevap aramaya çalışacağız. Üzerinde çalıştığım projede buna tekrardan şahit oldum ve bu tecrübemi kodlarla da destekleyerek adım adım anlatmaya çalışacağım. Projemiz her ne kadar açık kaynaklı olsa da ben kendi github hesabımdan adım adım commit'leri yapmaya  çalışacağım. Böylece hangi aşamada hangi adımları düzelttiğimi daha açık görebiliriz diye umuyorum. Hazırsak başlayalım.  

     Öncelikle doğru çalışmasını beklediğim değerler ile test yazmaya başladım. Genelde de böyle yapıyorum. Öncelikle kodumun doğru girdilerle doğru sonuç üretmesini bekliyorum. Manuel olarak da test edip doğru sonuç aldığım örnek değerleri ve bunun karşılığında hangi sonuçları beklediğimi de girdim. Sonuç maalesef beklediğim gibi olmadı :) Girmiş olduğum 5 değerin 2 tanesi yanlış dönüyordu. Ekranda herhangi bir yanlışlık olmasa da boş olan değerleri de listeye eklediğimi fark ettim ve bazı durumlarda beklediğimden 1 değer fazla geldiğini fark ettim. Bu linkteki ParseAsync_ShouldWorkProperlyWithCorrectInputs adlı testi inceleyebilirsiniz. Bunun sonucunda ise aşağıdaki gibi değişikliği tamamlayarak bütün testleri doğru bir şekilde çalışmayı başardık.
else if(replacedText.Length > 0)
{      
     parsedList.Add(replacedText);
}

    Şimdi ise farklı bir durum üzerine odaklanalım. Testleri yaparken değerleri hep doğru giriyordum, fakat unit test tarafına değeri girerken kaçış karakterleri sebebiyle girdiğimin değerlerin arasında boşluk olduğunu fark ettim ve bu sebeple de kodum hata fırlatıyordu. Aynı linkteki ParseAsync_ShouldWorkWithWrongConfigOptions adlı testi incelerseniz değerlerin arasındaki boşluğu fark edeceksinizdir. Buna çözüm olarak da regex kodumu geliştirdim ve \s* ifadesini ekleyerek aradaki boşlukların hataya sebebiyet vermesini engellemiş olduk.
var pollNames = Regex.Matches(content, @"(?<=PollName\s*=\s*"")(.*?)(?="")").Select(p => p.Value).ToList();
var polls = Regex.Matches(content, @"(?<=Widget Type\s*=\s*"")(.*?)(?="")").Select(p => p.Value).ToList();

    Bir diğer durumumuz ise girilen değerin yine her zaman doğru bir şekilde girilmesiydi. Her ne kadar yazılımcılara hitap etsek de gözden kaçan bir durum sonucu değerler yanlış girilebilirdi. Bu durumu daha önceden fark etmiş olsam da gerekli kod düzeltmesini yapmamıştım. Yukarıda da bahsettiğim gibi öncelikle kodu doğru değerlerle çalıştırmak önemliydi, ama şimdi bunu da düzeltmek lazımdı. Aynı linkteki ParseAsync_ShouldWorkWithWrongWidgetType isimli testi incelerseniz bir yanlış olduğunu fark edeceksiniz ve bu durumda diziyle ilgili bir hata fırlatıyordu. Burada da kod tarafına gerekli değişiklikleri aşağıdaki gibi yaparak bu hatamızı da gidermiş olduk.
if (polls.Count > k)
{
    if (parsedList[i] == delimeter)
    {
        var name = _options.FirstOrDefault(p => p == polls[k]);
        if (name is not null && pollNames.Count > k)
        {
            contentFragments.Add($"{name}-{pollNames[k]}");
        }
    }
    k++;
}

    Tabii ki kod içerisinde hala birçok eksiklik olabilir, yeni testler ekledikçe aslında kodumuzun sağlamlığı artmaktadır, ama hiçbir zaman tamamen kusursuz olmayacaktır. Bence bu da yaptığımız işin hem güzelliği hem de zorluğu olarak nitelendirilebilir.

    Uzun yıllardır hem unit hem integration testler yazıyorum, özellikle unit test tarafı için uzun süredir benim açımdan bu kadar faydalı ve bu durumu net bir şekilde ifade edeceğim bir durum oluşmamıştı. Bu vesileyle ben de bu yaşadığım tecrübeyi paylaşarak bir nebze de olsa faydalı olacağını düşündüm.

    Son olarak özet mahiyetinde unit testleri veri tabanı işlerinden ziyade bu tarz domain katmanını test edecek konularda yazmak çok daha faydalı olacaktır. Çünkü aksi durumda bizler unit test kapsamından çıkıp yavaş yavaş integration test kapsamına girdiğimizi unutmamalıyız. Bu konuyla ilgili daha genişçe yazmayı umarak burada bir noktalı virgül bırakıyorum :)

    Hz. Aişe (r.a.)’den nakledildiğine göre Allah Resulü (s.a.v.) şöyle buyurmuştur:
“Aziz ve Celil olan Allah, birinizin, yaptığı işi en iyi şekilde yapmasından memnun kalır.” 
(Taberânî, el-Mu’cermil-Evsat, 1/275)

2 yorum:

  1. Bilgiler için teşekkür ederim kardeşim. Allah razı olsun...

    YanıtlaSil
  2. Rica ederim. Cümlemizden inşallah.

    YanıtlaSil