Bir önceki makalemizde TDD yaklaşımına değinmiştik. Bu yazımızda TDD yaklaşımında önemli yer tutan birim testlerini inceleyceğiz. Birim testi bir yazılım projesindeki metotların, fonksiyonların doğru çalışıp çalışmadığını anlamak için oluşturulan testtir. Bir testin birim testi olabilmesi için test edilecek birimlerin ayrı ayrı ele alınması gerekmektedir. Birim testi bir bütünü oluşturan birimlerin entegre testi değildir.Ayrıca bir test;
- Veritabanı ile ilişkiliyse,
- Network üzerinden iletişim sağlıyorsa,
- Dosya sistemiyle ilişkisi varsa,
- Başka birim testleriyle aynı zamanda çalışamıyorsa,
- Çalıştırılmak için özel bir konfigürasyon bekliyorsa
bu testin birim testi olduğunu söyleyemeyiz (Microsoftun bu konudaki yaklaşımında farklılıkar bulunmaktadır, ilerleyen makalelerde değineceğiz). Bunların yanında birim testi hem Test Güdümlü Yazılım Geliştirme Sürecini kolaylaştırır hem de uygulamamızın her bir biriminin sorunsuzca çalıştığından emin olmamızı sağlar.
Projedeki Hangi Kısımlar için Birim Testi Yazılmalıdır?
Bir nesne yazıldığında o nesnenin tüm özelliklerini barındıran test sınıfını da yazmak gerekmektedir ki bu nesne parametreler alan ve uygun değerler döndüren public metotları içermektedir. Yine de birim testinin projedeki hangi kısımlar için yazılacağı yazılım geliştiriciye bağlıdır. Ancak nesne tabanlı programlamada genel yaklaşım bir sınıf içerisindeki tüm public metotlar için birim testi yazmak yönündedir. Değişkenlere ulaşım amaçlı kullanılan getter ve setter’lar için veya hatanın çok kolay bulunabileceği, işlevinin bir bakışta anlaşılabileceği metotlar için birim testi yazılmaması öngörülebilir. Ancak tüm metotlar için birim testinin yazılmaması bir projede test edilen kodların tüm kodlara oranı (Code Coverage) yüzdesini düşürmesi açısından dezavantaj olarak görülebilir.
Birim Testinin Yazılım Geliştirme Sürecine Katkıları
- Sonradan ortaya çıkabilecek hataların oluşturacağı maliyeti en aza indirger.
- Refactoring sonucundaki test maliyetini düşürür: Yeniden ele alınan kod bloklarında bozulma olup olmadığını anlamak amacıyla ilgili kod bloğu için önceden oluşturulmuş birim testi çalıştırılarak sonucun doğruluğu kolayca kontrol edilebilir.
- Code Inspection (kod inceleme) açısından çok verimlidir.
- Uzun vadede birim testi olmadan kod yazmaktan daha hızlı ve verimli kod yazmayı sağlar çünkü sonrasında oluşacak hatalara dönüp bakma ihtimalini en aza indirger.
- Yazılan kodun en dip seviyede anlaşılmasını sağlar çünkü çok net anlaşılmayan kodun birim testini yazmak imkansızdır. Bu da çok daha temiz ve hatasız kod bloklarının ortaya çıkmasını sağlar.
- Bir kod bloğunun işlevi birim testine bakılarak çok daha kolay anlaşılabilir, bu da dokümantasyon niteliğinde olabilir.
Fonksiyonel testler çok önemlidir. Bu testlerde bir fonksiyonda yaşanan sıkıntı birbirine bağlı tüm fonksiyonları etkilemektedir. Düzeltilen hata da o fonksiyona bağlı tüm fonksiyonlarda düzeldiği anlamına gelebilir.
Ancak birim testinde durum böyle değildir. Hatanın ilgili fonksiyonu başka fonksiyonlarla bağlantılı olmadığı için alınan hata da diğer fonksiyonları etkilememektedir. Bu da birim testin amacını karşılamaktadır.
Grafiksel olarak; Birbirine bağlı fonksiyonların birinde çıkan hata diğerlerini de etkilemektedir ve çözüm hepsinde çözümdür.
Birim testinde ise fonksiyonlar birbirlerine bağlı olmadıklarından hata sadece kendi fonksiyonunu etkilemektedir ve çözümü yine sadece kendisini bağlamaktadır.
Karmaşık objeleri basitleştirilmiş fonksiyonlarıyla taklit eden objeye Mock objesi denir. Bir birim testi donanım, bağlantı veya başka herhangi bir kaynağı benzetimi açısından Mock objelere ihtiyaç duymaktadır. Çünkü bahsi geçen bu dış kaynak fonksiyonları birim testi kümesinde yer almamaktadırlar. Birim testi aynı zamanda performans için de Mock objelere ihtiyaç duymaktadır. Çünkü canlı sistemde çalışan bir obje çok yüklü olabilir ve bu nesnenin sadece belirli kısımlarına ihtiyaç duyulabilir. Unutulmamalıdır ki test performansı çok önemlidir. Aksi takdirde test çalıştırılması külfete dönüşebilir.
Entegre Testi (Entegrasyon Testi)
Yazılım modüllerinin birleştirilerek grup halinde test edilmesine Entegre Tesi (Integration Test) denmektedir. Birim testinin üstünde sistem testinin altında yer almaktadır. Birim testleri gibi sadece bir birimi kapsamaz ancak sistem testleri gibi de tüm sistemin testi için kullanılmaz. Entegre Testi sadece ilişkili modüllerin bir arada test edilmesine olanak kılar.
Ömer KİREMİTÇİ, Armağan DÖKER