Günümüzde yaygın kullanılan yazılım geliştirme yöntemlerinden biri de Çevik Geliştirme (Agile Development)’dir. Test Güdümlü Programlama ise bu yazılım geliştirme yöntemi kapsamında uygulanabilcek pratiklerden sadece biridir[1]. Test Güdümlü Programlama küçük adımlı yazılım geliştirme döngülerinden oluşur. Her bir yazılım geliştirme döngüsünde yazılımcı, öncelikle elindeki gereksinimlerden sadece birine ait birim testini yazar. Ardından bu testi başarıyla geçirecek kodun yazılımını yapar ve daha sonra tasarımını daha iyi bir noktaya taşımak için yazılımda gerekli değişiklikleri yapar. Tüm bu işlemler sadece bir yazılım geliştirme halkasına karşılık gelir ve her döngüde sadece bir gereksinimin karşılığı olan yazılım geliştirme faaliyeti tamamlanır. Bu yazılım geliştirme döngüleri tamamlandığında yazılımcı elindeki tüm gereksinimleri karşılayan kodu yazdığından emindir.
Test Güdümlü Programlama yönteminde yazılımcı birim testi olmayan kodu geliştirmeyi kesinlikle reddeder. Yazılımcı kendisine gelen gereksinim değişikliklerinde ilk öncelikle gereksinim değişikliğinin etkilediği birim testleri günceller ya da gerekiyorsa yeni birim testler ekler ve daha sonra bu testleri geçirecek kodun yazılımına başlar. Yine aynı şekilde eğer yazılımcıya kalifikasyon testlerinden ya da gerçek ortamdan bildirilen bir hata varsa, yazılımcı ilk olarak ilgili hatayı ortaya çıkaracak birim testi yazar. Daha sonra kodun yazılımını yaparak birim testin başarıyla geçmesini sağlar. Böylece yazılımcı aynı hatanın tekrar alınmayacağını alınsa da birim testler düzeyinde fark edileceğini garanti eder.
Test Güdümlü Programlama yöntemi sayesinde yazılımcı daha test edilebilir kod yazmaya çalışır. Bir kodun test edilebilirliği ne kadar fazla ise kodun içerisindeki sınıfların birbirleriyle olan bağılılığı o kadar azdır. Böylece yazılımcı nesne yönelimli programlama mottolarından biri olan “high cohesion and loose coupling” durumunu sağlar. Ayrıca bu tarz bir yöntemle geliştirilmiş yazılımda tasarım iyileştirme faaliyetleri daha kolay ve güvenli gerçekleştirilir. Çünkü yazılımcı kodunda yaptığı her bir değişiklikte tüm birim testlerini koşturarak yaptığı değişikliğin herhangi bir gereksinimi ezilip ezmediğini kontrol edebilecektir.
Test Güdümlü Programlama üç aşamadan oluşmaktadır[1], bunlar;
-
Red – İmplementasyona değil gereksinime odaklan: Bu aşamada yazılımcı kendisine verilmiş gereksinimlerden sıradaki gereksinime ait birim testi yazar. Yazılan test, daha öncesinden yazılmış olan tüm birime testlerle birlikte çalıştırılır. En son yazılan birim teste ait implementasyon henüz yapılmadığı için ilgili test başarısız (Red) sonuçlanır.
-
Green – Basit düşün basit yap: Yazılımcı gereksinimi karşılayacak yazılımın implementasyonu en az kodla yapar. Yazılan kodun sadece şimdiye kadar birim testi yazılmış gereksinimleri karşılaması beklenir. Gelecekte yazılımı yapılacak durumların kodlaması önceden yazılmaz ve düşünülmez. Implementasyon tamamlandıktan sonra yazılımın gereksinimi karşılayıp karşılamadığını kontrol etmek için tüm birim testler çalıştırılır. Beklenen durum tüm birim testlerinin başarıyla geçmesidir. Bu testler başarıyla koştuğu takdirde yazılımcı bir sonraki aşamaya geçebilir aksi takdirde gereksinim ile yazılım arasında uyumsuzluk olduğunu gösterir.
-
Refactor – Tasarımını iyileştir: Yazılımcı bu aşamada testlerinde değişiklik yapmadan kodunu yeniden gözden geçirerek tasarımını iyileştirmeye çalışır. Bu kapsamda yazılımcı kullandığı methot, değişken ve sınıf isimlerini düzenler. Var olan kod tekrarlarını giderir ve kodunu daha test edilebilir hale getirir. Böylece kodunun bağımlılığını azaltırken amaca yönelik methot ve sınıfların ortaya çıkmasını sağlar. Bu aşamada dikkat edilmesi gereken nokta değişikliklerin adım adım yapılmasıdır. Ayrıca her bir adımda yazılımın derlenebiliyor olmasına özen göstermelidir. Bununla birlikte yazılımcı her değişiklik adımında tüm testleri çalıştırarak testlerin başarıyla geçtiğinden emin olmalıdır. Testler geçmediği sürece yeni değişiklikler yapmamalıdır.
Test Güdümlü Programlamanın en önemli faydaları:
-
Her bir gereksinim için yazılan birim testler sürekli olarak çalıştığından yazılımın gereksinimleri karşılayıp karşılamadığı sürekli kontrol altındadır.
-
Yazılım sadece ele alınan gereksinimi karşılayacak şekilde geliştirildiğinden gereksiz kod yazımı en aza indirilir. Bu da kodun ve tasarımın karmaşıklığını azaltır.
-
Her birim test bir gereksinim ile eşleştiği için yazılımda oluşan hataları bulmak kolaylaşacaktır.
-
Geliştirilen yazılımın tüm fonksiyoneliteleri test edildiğinden, istenilen bir anda mevcut yazılım üzerinde güvenli bir şekilde değişiklik yapılmasına olanak sağlar.
-
Daha test edilebilir bir kod için bileşenler arasındaki iletişim arayüzler (interface) veya soyut sınıflar (abstract class) üzerinden gerçekleştirilerek kodun anlaşılırlığı artar ve diğer bileşenlere olan bağlılığı azalır.
-
Gereksinimler birim test düzeyinde sürekli kontrol edildiğinden kalifikasyon testlerinden ve gerçek ortamdan gelebilecek hata sayısı azalacaktır.
-
İyi yazılmış bir birim testi sınıfı, test edilen sınıfın tüm spesifikasyonlarının tanımlandığı bir dokümantasyon olarak referans alınabilir.
Tüm bu anlatılanlar Test Güdümlü Programlamanın temel kavramlarını özetlemekle birlikte, okuyucunun bu metot ile yazılım geliştirmeye başlayabilmesi için gerekli pratik eğitimi alması gerekmektedir. Bunun için Test Driven Development’ın yaratıcısı Kent Beck tarafından yazılmış olan “Test-Driven Development By Example”[2] kitabı takip edilebilir. Ya da biraz daha görsel bir eğitim arıyorsanız James Shore’un “Let’s Play: Test-Driven Development”[3] eğitim videolarından yararlanılabilir.
Referanslar:
-
James Shore and Shane Warden, The Art of Agile Development, O’Reilly Media, 2004
-
Kent Beck , Test-Driven Development By Example, Addison-Wesley Professional, 2002
- http://www.jamesshore.com/Blog/Lets-Play