NUnit ile Test Temelli Geliştirme
Ofise döndüğümde saat altıyı biraz geçmişti. Uzun süredir üzerinde düşündüğüm framework projesine bakmak geçti aklımdam, sonra sörf yapmanın cazibesine yenildim.
Nelere baksam diye çok düşünmedim, yoksa kahvem soğuyacaktı. O zaman ne yapardım ben? :) Hazır yeni bir projenin eşiğinde iken yeni birşeyler bulmalıydım, ama bunlar işe yarar şeyler olmalıydı. Evet buldum! Test dırivın developmıntı öğrenmeliydim, böylece kodlarımı değiştirdikçe hata çıkmasının önüne geçebilirdim...
Plastik bardağı kavradığımda biraz soğuduğunu farkettimse de, kahvemden bir yudum daha aldım. Ve avant bravzırın arama çubuğunda "test driven development" yazdım. İlk sıralarda gelen üç-dört link pek işime yaramadı böylece nunit.org un kendi sayfasına geçmeye karar verdim. Yoksa google a birşeyler mi oluyordu?...
Biraz araştırınca pek karışık bir şey olmadığına kanaat getirdim. Temel felsefe: herşeyden önce test yazmak, herşeyden yani kod yazmadan bile önce test yazmaktı, hayli şaşırmıştım! Sonra da testleri başarılı çalışır hale getirmekti. Bu yaklaşım çok radikal geldiğinden şöyle düşündüm, ben önce kod yazsam sonra test yazsam kim farkedecek :) hemen cıvıtmıştım ama öğrenmeye devam etmek için download bölümüne geçtim.
Kurulumu başlattıktan sonra, masada el yordamı ile aranırken bisküvilerin bittiğini anladım. Bu arada kurulum da bitivermişti. Nunit'in sitesinde kütüphanenin dotnet 2.0 versiyonunun çıktığından ve bu versiyonda köklü değişiklikler yaptıklarından bahsediyordu. Tüm kütüphaneyi attribute kullanarak çalışacak hale getirmişlerdi. Testlerimizi public sınıflar şeklinde yazıyor, ve hangi sınıfın test sınıfı olduğunu belirtmek için attribute kullanmamız gerekiyordu.
Örneğin:
using NUnit.Framework;
[TestFixture]
public class BazıTestler
{
[Test]
public void BirTest()
{
//birşeyleri test et!
Assertion.AsertEqual("deneme", "deneme");
}
}
Bu şekilde bir test yazmak kolaydı ve gereken sadece, parametre almayan ve değer döndürmeyen bir metod olması idi. Bu metodun üstünde [Test] attribute unu yazmak yeterliydi.
Peki her testten önce veritabanı bağlantısı açmak gibi işler yapmak gerektiğinde, sonrada testler bittiğinde bu bağlantıları kapatmak gerektiğinde ne olacaktı? Herhalde bunlar içinde attribute vardır diye aramaya devam edince bu işler için [SetUp] ve [TearDown] attributelarına ulaştım. Bunlarda yine parametre almayan ve değer döndürmeyen metodlar ile kullanılmalı.
Örneğin yukarıdaki sınıfa şu metodları ekleyelim:
[SetUp]
public void Başla()
{
this.db.connect("...");
}
[TearDown]
public void Bitir()
{
this.db.disconnect();
}
Bu değişiklikten sonra, "BirTest" metodunda db connection nesnesini kullanabilir hale gelmiştik.
Test yazdıktan sonra sıra çalıştırmaya gelmişti. Bunun komut satırıyla boğuşmak bir seçenekti, diğer seçenek ise nunit-gui.exe yi çalıştırmaktı. Ben gui yi seçtim ve file menüsünden open diyrek yazdığım exe yi açtım. Geriye run düğmesine basmak kalmıştı ki bastığım anda ortam yeşillendi, yani testler başarılı idi.