Merhabalar arkadaşlar;
Geçen hafta sizlerle birlikte NUnit frame kullanmadan direkt Visual Studio 2012 üzerinden Unit Test'in nasıl yazıldığından bahsetmiştik. Bu hafta ise sizlere Unit Test yaparken hepimizin başına gelebilecek sıkça karşılaşılan genel hatalardan bahsedeceğim. Aşağıda yapılması gerekenleri maddeler halında açıklamaya çalışacağım, sizde bunları kendi uygulamalarınızda denerseniz anlatmak istediklerimi daha rahat kavrayacaksınız.
Öncelikle;
- Testlerimizin kolay çalışır olması yani kod kalabalıklığından arınmış olması gerekir.
- Code Coverage yapmaya elverişli olması gerekir ki bu sayede üçüncü kişiler tarafından test gerçekleştirilebilmelidir.
- Mantık hataları yapmaktan kaçınmak gerekir.
- Elle yazılmış Stub/Mock kullanımından kaçınmak gerekir.
- Herzaman saklanabilen yani sürekli kullanılabilecek testler yazmak gerekir.
- Private/Protected erişim belirleyicilerinden kaçınmak gerekir.
- Kod tekrar kullanılabilir olmalıdır (Create, Manipulate, Assert).
- Test izolasyonunu güçlendirmek gerekir.
- Multiple Assert olayından kaçınmak gerekir.
- Her test başına yalnızca bir Mock Object kullanmak gerekir.
- Karmaşık Mock ve Stub'lar yerine daha sade ve anlaşılır olmasına özen gösterilmelidir.
Sadece Public Değerler Test Edilebilir
"Unit" testing demek "Unit of Work Testing" anlamına gelmektedir. Yani varolan bir proje üzerinde yapılan hataları ve amacına yönelik çalışıp çalışmadığının kontrolü yapılır. Bu yüzden kodlarımızın tekrar kullanılabilir özellikte olması gerekir.
1) Object oluştururken sıkça kullanılan metodları tercih etmek gerekir;
[make_XX]
2) Bu yazılan object sayesinde başlangıç durumunu tekrar kullanılmak üzere çoğaltabilir yada ayarlayabilirsiniz;
[init_XX]
3) Yazılan bu metodlar ilede testlerimizi çalıştırabiliriz;
[verify_XX]
Test Izolasyonu Yapmak Önemlidir
Yazılan testler arasında bağlantı bulunmaması gerekir. Şöyle ki çalıştırılmak istenen her birim test için ayrı metod yazmak gerekir. İstenilen metod çağırılarak testler gerçekleştirilir. Burada önemli olan zaten birbirinden bağımsız gerçekleşebilmesidir. Bir test çalıştırılırken başka bir test üzerinden kesinlikle çağırılamaz, ya tek başına çalıştırılır ya da ilgili olan metodların tümüyle beraber çağırılır. Böyle olmadığı takdirde test yapmanın hiçbir anlamı kalmaz ve birsürü bug ile karşılaşırsınız, bu noktalara dikkat etmek önemlidir.
Birden Fazla Aynı İşlevi Yapabilen Assert Kullanımından Kaçınmak Gerekir
public string ="a";
public password="b";
string someresult=UnderTest.CreateMessage(user,password);
Assert.AreEqual(user + "," + password, someresult);
Assert.AreEqual(1, UnderTest.MessageCount);
Birden fazla Assert kullanmak yukarıda da bahsettiğim üzere aynı işlev için birden fazla test kullanmaya benzer. Eğer bir tanesinde hata meydana gelip çalışamaz hale gelirse bu bütün hepsini etkiler ve yazılan tüm testleri etkisiz hale getirir. Bu olayı tekrarlarsanız sürekli Debug yapmanız ve tek tek hata ayıklamanız gerekecektir bu da oldukça zahmetli ve yorucu bir iş anlamına gelir.
Assertte olduğu gibi birden fazla Mock Object kullanımından da kaçınmak gerekir. Herbir test için yalnızca bir Mock Object kullanılabilir.
Kötü İsimlendirme Olayından Kaçınmak Gerekir
Bütün yazılım dilllerinde olduğu gibi C# dilinde de reserved word bulunmaktadır. Yani bunlar bu dil tarafından ayrılmış kendi kütüphanesinde bulunan kullanıldığında bize sıkıntı olacak kelimelerdir. Mesele unit testing yaparken şu şekilde bir kullanımdan kaçınmak gerekir;
Mock/Stub/Fake Kullanımı
Eğer Mock, Stub ya da Fake'den herhangi birini kullanıyorsanız bunların ne olduğunu belirtmeniz gerekmektedir. Kullanılan çoğu Mock Object aslında bir Stub Objesidir, eğer ikisi beraber kullanılıyor ise bu artık Fake Object adını alır;
Assert'in Kullanım Amacını İyi Kavramak Gerekir
Assert kullanılırken karmaşıklıktan kaçınmak gerekir, assert'in amacı istenilen ile sahip olunanı karşılaştırmaktır. Bu sebeple assert içersinden metod yazmak ya da metod çağırmak işi zorlaştırmak anlamına gelir aynı zamanda görüntü hoş olmayacaktır. Assert ile tüm amaç okunabilirliği artırmaktır, eğer gerekli görülürse return kalıbı kullanılabilir.
Bu şekilde metod ifadesinin assert içersinde yer alması yanlış kullanımdır bunun yerine olması gereken aşağıdaki gibidir;
Girilen İnput Değerleri Birbirinden Farklı Olmalıdır
X.Divide(1,1)
X.Divide(1,2)
X.Check("1,1")
X.Check("1,2")
Yazımın sonuna gelmiş bulunmaktayım. Sizlerle birlikte 10 hafta boyunca Unit Test yapmanın sağladığı yararlardan, nasıl yapıldığından, yaparken nelere dikkat etmek gerektiğinden bahsettim. Küçük örnekler sayesinde teorik bilgiler ile beraber uygulama yapmayada çalıştım. Umarım Unit Testing(Birim Test) konulu bloğum sizlere faydalı olmuştur. Bir problem yaşar, çözemediğiniz konular olursa burdan bana yorum bırakabilirsiniz. Çalışmalarınızda başarılar dilerim hoşçakalın...