Son zamanlarda iyice popülerliği artan test driven development (test tabanlı geliştirme) konusunda birkaç yazı yazmak istedim. Öncelikle test driven development’ın ne olduğu ile başlamak istiyorum.
Nedir?
TDD geliştirilen veya geliştirilecek yazılımın otomatikleştirilmiş testlerinin yapılarak uygulanan bir yazılım geliştirme şeklidir. Otomatikleştirilmiş testler bir kez hazırlanır ve istenildiği zaman tekrar tekrar çalıştırılabilir. Bu şekilde kodun bir parçası değiştiğinde diğer parçaların ondan etkilenip etkinlemediğinden her seferinde emin olabiliyoruz. Otomatikleştirilmiş testlerin en basiti mouse ve klavye hareketlerini kaydederek tekrar tekrar yazılım üzerinde uygulamaktır. Mouse ve klavye hareketlerini bir kez kaydederek her seferinde tüm parçaları tek tek elle test etmek zorunda kalmıyoruz. Tabiki bu mouse, klavye hareketlerini kaydetmek çok antik bir yöntem. Elbette biz bunu yapmayacağız. Ancak otomatikleştirilmiş testlere en basit örnek budur demek istedim.
Neden?
Test kodu yazmak genelde gereksiz, çok zaman alan, maliyetli ve öğrenmesi/uygulaması zor olarak görülür. Bu yüzden bir çok kişi/şirket TDD’den kaçınmayı tercih ediyor. Aslında düşünüldüğünde, TDD uygulandığında az önce saydığım etkenlerden uzun vadede daha karlı çıkılacağı artık bilinmeyen birşey değil.
TDD bize zaman kaybettiriyor. Deadline’a yetişmesi gereken bir sürü iş var.
Bu anti-TDD’cinin en önemli savunma mekanizmasıdır. Kendisi bir konuda haklıdır. TDD ile yazdığınız kodun 2-3 katı kadar (belki daha çok) test kodu yazarsınız. Ancak gözden kaçırdığı ise, kendisinin sadece günü kurtardığıdır. Yazdığınız kodda değişiklik yaptığınızda diğer parçaların hala beklenen bir şekilde çalıştığından emin olabilir misiniz? TDD ile olabilirsiniz. Çünkü her bir birimin kendine özgü testi vardır. Kod değiştiğinde tek yapmanız gereken daha önceden hazır olan testleri bir kez daha çalıştırmak. Kısa vadede günü kurtarıyorsunuz, ancak yazılımınız belki yıllarca çalışacak.
Öğrenmesi/Uygulaması zor
Zor mor değil. 200-300 sayfalık bir kitap okuyarak veya sağdan soldan blog postları okuyarak, deneyerek uygulayabilirsiniz. Mükemmel bir şekilde uygulayamasanız bile, test edilmemiş bir yazılımdan her zaman daha iyidir.
Değişimlere ayak uydurmak
Herkes bilir ki bir yazılım projesi asla bitmez. Ürün sahibi her zaman yeni isteklerde bulunur. Bunlara yazılımcı her zaman itiraz/küfür eder. Yinede seve seve yapmak zorunda kalır. Ancak yazılımcı artık değişimlerin kaçınılmaz olduğunun farkında olması gerekir. TDD yaparak değişimlere çok iyi bir şekilde ayak uydurabilirsiniz. Yazılım her ne kadar değişsede siz zaten önceden yazdığınız testler ile buna hazırsınız. Hala yazılımınız güvenilir bir şekilde çalıştığından eminsiniz. Test edilebilir bir kod ürettiğinizde kodunuz zaten istemeseniz bile değişimlere kolay ayak uydurabilen bir kod olmuş oluyor.
Nasıl?
TDD içerisinde bir çok test çeşidini barındırıyor.
Unit Testing (Birim Testler)
Bir yazılımın her bir biriminin kendine özgü testler ile dışa bağımlı olmadan test edilmesi anlamına geliyor. Yani bir kullanıcı login mekanizmasını test ediyorsanız, veritabanı ve cookielere bağlı olmadan kodunuzun beklendiği aşamaları kaydedip kaydetmediğinize bakıyorsunuz.
Functional Testing (Fonksiyon Testi)
Adından da anlaşılabileceği üzere, bir işlevin gerektiği gibi çalışıp çalışmadığını test etmemize yarıyor. Az önce unit testte veritabanı ve cookie’ye bağlı olmadan login mekanizmasını test etmiştik. Functional testler ile veritabanı ile bağlantıya geçtiğinde gerçekten doğru bir şekilde login olup cookieleri doğru bir şekilde kaydedip kaydetmediğini de test ediyoruz.
Acceptence Testing (Kabul edilebilirlik Testi)
Burada ise, sizin yazdığınız yazılımın, sizden istenenleri gerçekten karşılayıp karşılamadığını test ediyorsunuz. Mesela bir acceptence test:
– Login olmak istiyorum
– Kullanıcı adım: test
– Şifrem: test
– Login buttonuna basıyorum
– Login olmuş olmalıyım
Burada yazanları bir kod olarak yazıyorsunuz. Ve istekler ile sizin yazılımınızın uyuşup uyuşmadığına bakıyoruz.
Sonuç
Bu yazı ile TDD’ye teorik olarak bir göz atmış olduk. Bir sonraki yazımda ise PHP ile TDD hakkında birkaç şey yazacağım. Hepinize kolay gelsin.