4- Test Driven Development

Mustafa Dikyar
5 min readJul 24, 2023

Herkese selamlar,

Unit Test makale serimize Bölüm 4: Test Driven Development (TDD) konusu ile devam ediyoruz.

Eğer ilk üç kısmı okumadıysanız, önceki makalelere aşağıdaki linkler üzerinden erişebilirsiniz.

Zaman kaybetmeden makalemize devam edelim.

Öncelikle TDD(Test Driven Development) yaklaşımını teorisini ele alalım.

TDD (Test Driven Development), yazılım geliştirme sürecinde testlerin önceliklendirilip kodun testlerle birlikte geliştirilmesini sağlayan bir yaklaşımdır. Testler önce yazılır, ardından kod bu testleri geçecek şekilde geliştirilir ve refaktör edilir.

Öncelikle uygulamamızın gereksinimlerini en basit halleriyle ortaya koyarız.

Sonra gereksinimimizi ele alırız ve kodu yazmadan önce unit testi oluştururuz. İlgili unit testi, kodumuzun ne yapması gerektiğini ve gereksinimlerimizi net bir şekilde tanımlarız.

Kod henüz tamamlanmadığı için testlerimizin başarısız olduğunu gözlemleyebiliriz. Bu noktadan sonra yapmamız gereken tek ve en önemli şey, mevcut testin başarıyla geçmesi için gereken geliştirmeleri yapmaktır.

Geliştirmelerimizi tamamladıktan ve testimizin başarılı olduğunu gözlemledikten sonra, bir sonraki adımımız kodu refaktör etmek olacaktır. Mümkünse kodumuzu basitleştirip daha okunabilir hale getirmeye çalışırız.

Özetlemek gerekirse, şu ana kadar ilk gereksinimi karşılamak için öncelikle test yazdık. Ancak kodumuz henüz tamamlanmadığı için testimizin başarısız olduğunu gözlemledik. Ardından, geliştirmelerimizi yaparak testimizi başarıyla tamamladık ve kodumuzu refaktör ettik.

Şimdi, ikinci gereksinimimizi ele almaya başlıyoruz ve yine geliştirmelerimizi yapmadan önce unit testi yazıyoruz (fail).

Bu noktada yapmamız gereken tek şey, yazdığımız unit testi başarılı bir şekilde geçmesi için gereken geliştirmeyi yapmak ve kodumuzu yeniden düzenlemekten ibarettir.

Geliştirmelerimiz, gereksinimlerin tamamlandığı bir döngü şeklinde ilerlerken, en önemli nokta sadece ihtiyaç duyduğumuz kodu geliştirmektir.

Başka bir deyişle, Test Driven Development yaklaşımı geliştirmelerimizi testlerin yönlendirdiği sonucuna varırız.

Red-Green-Refactor döngüsü TDD’nin merkezinde yer alır ve aynı zamanda TDD döngüsü olarak da adlandırılır.

TDD, gereksinimlerimiz kadar sürekli olarak tekrar edilerek sonuca ulaşmamızı sağlar.

Şimdi de TDD’nin avantajlarına göz atalım.

  1. TDD yaklaşımının en büyük avantajı, kodun ne yapması gerektiğinin açık bir şekilde gözlemlenebilmesi ve böylece geliştirilecek kod hakkında düşünme zorunluluğunun ortadan kaldırmasıdır.
  2. Testi yazdıktan sonra kodun beklendiği şekilde çalıştığını test ederiz, sadece gereksinimleri uygulayarak hızlı bir geri bildirim mekanizması elde ederiz.
  3. Başka bir avantajımız, TDD yaklaşımıyla kodumuzun otomatik olarak modüler hale gelmesi ve bağımlılıklarının ayrıştırılmasıdır. Bu yaklaşım, bağımlılıkları baştan ayırmamızı zorunlu kılar.
  4. Son olarak, TDD yaklaşımıyla yazdığımız kodlar daha sürdürülebilir ve bakımı daha kolay hale gelir. Her gereksinim için en az bir birim testimizin olması sayesinde kodları anlamak ve geliştirmek daha kolay olur.

İşin teorisini tamamladığımıza göre hadi kod yazalım.

Öncelikle gerekliliklerimizi ortaya koyarak başlayalım.

Eğer önceki makalelerimizi okuduysanız veya hemen yukarıda linkini bıraktığımız demo projemizi incelediyseniz, projemize aşina olduğunuzu varsayarak devam ediyorum.

En temel haliyle verilen bir listedeki öğeleri işleyen bir kod akışımız var. Console outputu incelediğimizde, listede üç espresso, iki latte ve beş cappuccino olduğunu gözlemleyebiliriz.

Şimdi TDD yaklaşımını kullanabilmek için kodu biraz değiştirelim ve ihtiyacımızı belirleyelim.

Kodumuzun mevcut durumunu değerlendirdiğimizde, listenin son iki kaydının daha eski tarihli olduğunu fark ettik. Ancak çıktıyı incelediğimizde Cappuccino sayısının 7 olarak işlendiğini görüyoruz.

Bu durumda, eski tarihli kayıtların istenmeyen bir durum olduğunu kabul ediyoruz ve TDD yaklaşımını kullanarak bu sorunu çözmek için adımlar atacağız.

Verdiğimiz listeyi kodumuz üzerindeki bu satırın işlediği bilgisine sahibiz.

dataProcessor.ProcessItems(machineDataItems);

Öncelikle bu yeni gereksinimimiz için bir unit test yazarak işe başlayalım.

İşte unit testimiz burada.

Testimizde Arrange kısmını incelediğimizde, hatalı kayıtlar ve hatalı kayıt olarak işaretlediğim kayıtları görmüşsünüzdür. Bu kayıtlar, en son oluşturulan kayıtlardan daha eski veya tekrar eden kayıtlar olduğunu görüyoruz.

Act bölümünde processor’ümüz çalışıyor ve Assert bölümünde kontrollerimizi sağlıyoruz. Bu bölümde, cappuccino için iki item beklediğimizi ve espresso için de bir kayıt beklediğimizi belirtiyoruz.

Hadi testimizi çalıştıralım ve sonuçlarını gözlemleyelim.

Testimizin sonuçlarını incelediğimizde beklediğimiz gibi eski tarihli ve tekrar eden kayıtların görmezden gelinmediğini için hata aldığımızı görüyoruz.

İşte mevcuttaki ProcessItem metotumuz:

ProcessItems metoduna geçelim ve testimizin başarıyla tamamlanması için gerekli geliştirmeyi yapalım.

Bu aşamada, yukarıda teorik olarak bahsettiğimiz konuların da net bir şekilde anlaşıldığına inanıyorum.

İşte bu kadar, geliştirmemiz tamamlandı. İki kod arasındaki farklılıkları inceleyerek, başarıya ulaşmamızı sağlayacak geliştirmeleri inceleyebilirsiniz.

Geliştirmelerimiz tamamlandığına göre, şimdi testimizi başarıyla geçmesini bekleyebiliriz.

Haydi, testimizi çalıştıralım ve sonucu gözlemleyelim.

Harika! TDD döngümüzün ilk iki adımını başarıyla tamamladık.

Son olarak ta demo projemizi ayağa kaldıralım ve kodumuzun çıktısına son kez bakalım.

Outputu incelediğimiz zaman burada da beklediğimiz sonuçları elde ettiğimizi görebiliyoruz.

Şimdi döngümüzün son adımı olan refaktör konusuna bakabiliriz.

Burada da sözü fazla uzatmadan kodumuzun refaktör edilmiş son halini buraya bırakıyorum.

Böylelikle makalemizin bu bölümünün de sonuna gelmiş bulunuyoruz.

Böylelikle, Unit Test makale serimizin döndüncüsünün de sonuna geldik.

Bir sonraki makalemizde Bölüm 5: Github Actions ile Otomatik Unit Test Çalıştırma konusunu ele alacağız.

Önceki makaleye bu link üzerinden, sonraki makaleye de buradaki link üzerinden ulaşabilirsiniz.

Okuduğunuz için teşekkür ederim.

--

--