Test Driven Development – Test Yönelimli Geliştirme Üzerine

Test Driven Development, 11 yıldır yazılım yöneticiliği yapsam da son 7 yıldır öğrenip içselleştirip ekiplerimle uyguladığımız günlük metodolojilerden biri. Bugün biraz TDD hakkında teorik bilgi vermek istedim.

Peki nedir Test Driven Development? “Biz zaten testlerimizi yapıyoruz” dediğinizi duyar gibi oluyorum. Birçok danışmanlığını verdiğim şirkette programcılar “Ben kodumun gerekli yerlerine test yazıyorum, yani TDD biliyorum” diyor. Fakat TDD tamamen farklı bir yaklaşım.

TDD ne değildir;
TDD; isminde Test geçtiği halde yazılımınızı test etme metodolojisi değildir.
TDD; Unit Testing değildir. Bu kavramlar genelde karıştırılır.
TDD; bir mimari yaklaşımdır. Kodunuzu test etmeye değil testlerle geliştirmeye yarar.
TDD; bir vakit kaybı değildir. Yatırımınızı bugfix yapmaya, gereksiz iletişime, dokümantasyona ve güvensizliğe değil teste kaydırırsınız. Diğer Extreme Programming metodolojileri de vakit kaybı değildir. Şimdiye kadar irili ufaklı birçok ekipte ve projede büyük faydalarını gördük. Fakat bu da başka bir yazının konusu.

TDD ile yapmaya çalışıtığım tam olarak şudur; Değişik örnekler ekleyerek, mimaride yapacağım yeniliklerin, ekleyeceğim komplikasyonların bu örnekleri desteklediğini görmeye ve düzgün çalıştırdığını ispat etmeye çalışırım. Adım adım bu temellerin üzerine yeni senaryo örnekleri ekleyerek mimarimi ve kodumu geliştiririm.

Unit Testing ise tam olarak şudur; Biraz önce geliştirdiğim bir şeyin düzgün çalıştığından emin olmak istediğim için farklı örnekler eklerim. Bu örneklerle, yaptığım geliştirmemin en başta tasarladığım şekilde çalışıp çalışmadığını inceler, problem varsa tespit etmeye çalışırım.

TDD ile Unit Testing farklı düşünüş biçimleri, farklı bakış açılarıdır. TDD’de elinizdeki yazılımın sahip olmadığı bir özellikle ilgili gerçeklemesini istediğiniz testi ekler, öncelikle bunu yapmadığını ispat edersiniz. Daha sonra bu testi gerçekleyen en basit kodu yazar, testin geçtiğini ispat edersiniz. Unit Testing yaparken kodunuzu zaten yazmışsınızdır. “Acaba şu farklı parametreler / varyasyonlar için de çalışıyor mu?” yaklaşımı ile yaptığınız implementasyondan daha çok emin olmaya çalışırsınız.

Unit Testing kötüdür diye birşey söylenemez. Unit Testing, TDD gibi bir kod geliştirme aracıdır, kodunuza olan güvenimizi arttırmak için kullanırız. Her ikisine de ihtiyacımız var. Dahası, birçok projede ikisini de kullandığımız olmuştur.

Ne durumda hangisini yaptığınızın bilincinde olmanız yaptığınız işe hakimiyetinizi arttırır. Yapınıza ekleme mi yapıyorsunuz yoksa yaptığınızdan emin olmaya mı çalışıyorsunuz.