Çoğu geliştirici için TDD (Test Driven Development - Teste Yönelik Geliştirme) sadece test kodu yazmaktan ibarettir. Fakat işin aslı gerçekten böyle mi? Bunu anlamak için TDD’nin gerçekte ne anlam ifade ettiğine bakmakta yarar var. Teste yönelik geliştirme ismi her ne kadar bir test metodolojisine benzese de aslen bir yazılım geliştirme tekniğidir. Çoğu metodoloji gibi kapsamı epey geniştir. Kod yazma alışkanlığını ve yazılan kodun niteliğini doğrudan etkiler.

Test Driven Development, kod yazmadan önce test kodlarının (senaryolarının) yazılması, bu senaryolara bağlı kodun yazılması ve sonradan refactor edilmesi tekniğidir. Diğer bir deyişle bu yaklaşımı kısaca, “önce test sonra kod ve düzenleme” olarak tanımlayabiliriz. Buradaki refactor etmekten kasıt, kodun önce akla ilk basit şekilde yazılması, daha sonra da üzerinden geçerek aslen olması gereken şekle getirilmesidir. Bu şekilde testi de yazılan kodun kapsamı ve işlevi tam olarak oturtulur. TDD yaklaşımı bizi belirli bir tarzda kod geliştirmeye zorlamak için (SOLID Principles) tasarlanmıştır. Test edilebilir kod yazmak bu yaklaşımın temel taşıdır. Bunun için kodumuzun küçük parçalar halinde, bağımsız çalışabilen (single responsibility), dışa bağımlılığı az (loosely coupled), modifiye etmektense genişletmeye açık (open-closed), bağımlılıklarına soyut bir şekilde (sadece ne iş yaptıklarını bilmek, nasıl yaptıklarıyla ilgilenmemek) bağlantılı (dependency inversion) ve kullanılmayan herhangi bir bağımlılığının yaratabilmek için Dependency Injection gibi tekniklerin kullanılması gerekir.

Her ne kadar karışık gibi görünse de aslen oldukça basit olan bu teknik için alışması kolay ama ustalaşması zor diyebiliriz. TDD kod yazma alışkanlıklarımızı kökten değiştirdiği için alıştıktan sonra geriye dönmesi oldukça zordur.

Bu yaklaşımın avantajları arasında, yazılan tüm kod parçalarını kapsayan bir test kodu da bulunduğu için daha sonradan yapılan değişikliklerin etkilediği yerlerin kolaylıkla tespit edilmesi, yine aynı sebepten geliştirilen uygulamadaki hata oranlarının büyük ölçüde düşmesi, yazılan kodun belirli kalite standartlarında olması ve kodun kolaylıkla refactor edilebilmesi sayılabilir. Bunun yanında Agile geliştirme süreçlerinin temel taşlarından olan “küçük işler, küçük süreçler” yaklaşımına da doğrudan oturmaktadır.