|  | 
        
            | 
                    
                        | Mono' da NUnit Yardımıyla Kod Testi |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | Günümüzde object modellemeye bu kadar önem 
verilmesi, bu kadar çok kullanılması bir çok insanın hatta bir çok şirketin uzun 
soluklu projeler geliştirmesine olanak sağladı. Uzun soluklu bir projenin ortasında 
yapılan bir hata tekrar projenin başa dönmesine sebeb olabilir. Buda maliyeti iki 
katına çıkarır ve zaman kaybına yol açar. Bu yüzden günümüz modellemesinde 
yazılım geliştirmeyle test aşaması beraber yürütülerek zaman ve maliyet 
kazancı sağlanmaya çalışılıyor. Yazılımdaki yapılanmada kontrol etmediğimiz 
sınıfa hasta sınıf diyelim. Hasta sınıfımız tedavi olmadan yazılımın içine 
girerse hastalığını diğer sınıflara bulaştıracaktır. Buda yazılımımızın ölümcül 
bir tehlikeyle karşı karşıya kaldığını gösterir. Bu yüzden hasta bir sınıf varsa 
bir doktora götürmeliyiz. Doktorumuz NUnit, yaptığı testler sonucu bize bir reçete 
verir. Reçetedeki ilaçlar ise hatalı kodların düzeltilmesidir. Hasta sınıfın 
hastalığı geçmeden yazılıma sokmazsak, hastalık daha başındayken ölümü 
önleriz.Yani her adımı test ederek gitmeliyiz. 
 Piyasadaki bir çok programda çeşitli 
sebeblerden dolayı hatalar oluşabiliyor. Bunlara terimsel olarak programın bug ları 
deniyor.Bug ları gidermek için çeşitli programların, bug lı programa 
fixlenmesi gerekiyor. Fix leme terimiyle yapılan iş kısaca hatalı.dll lerin 
alınıp düzeltilmiş .dll lerle yerdeğiştirmesi. C#ta Dll lerin 
test edilmesi için Java da kullanılan JNuit(Java Unit testing Framework) in bir 
türevi olan NUnit yaratılmıştır. NUnit C# kodlarının NUnit attribues larına 
bakarak bir hata olup olmadığına karar verir. Oluşan hataları ekrana yazar ve 
testreport.xml adı altında bir rapor yaratır. Bu raporda teste tabii tutulan 
foksiyonların hata verip vermediği ile ilgili bilgiler ortaya çıkar.Test 
edeceğimiz programda NUnit.Frameworkün sınıflarını kullanacağımız için;
nunit-framework.dll ini programımıza referans olarak belirterek derlememiz 
gerekiyor. Aslında NUnit yapısına bakarsak 3 katmanlı yapıda 2.katmanda sıklıkla 
kullanılacak olan bir yapı. NUnit-console.exe default olarak mono-1.0 ve üstü 
versiyonlarla geliyor.
 
 NUnitte test aşaması 
attributes(niteliklerin) mantığı üzerine dayalı. Mesela bir class ın test 
edildiğini belirtmek için [TestFixture] niteliğini belirtmemiz gerekiyor. Aynı 
şekilde class ın içinde bulunan bir fonksiyonunda nasıl bir test özelliğine tabi 
tutulacağını belirtmemiz gerekiyor. Mesela [Test] niteliğini kazandırarak yada 
[Ignore] niteliğini kazandırarak ileride oluşacak hataların önüne geçmiş oluruz 
yani hata varsa vardır tabii ama ileride test aşamasında yakaladığımız zaman 
programımızın bug larıda o kadar az olur. Aşadaki örneğimizi incelersek;
 
 
 
	Bu programı bir kütüphane olarak derlememiz 
gerekiyor. Çünkü NUnit ile sadece .dll dosyaların testlerini 
gerçekleştirebiliyoruz. nunit.framework.dll in aynı dizinde olduğundan emin 
olun (GACye yüklemediyseniz tabii.)
		| //test1.cs
		using System; using NUnit.Framework;
 
 [TestFixture]
 public class testsinif
 {
 [Test]
 public void deneme()
 {
 int sayi1=5;
 int sayi2=6;
 Assertion.Assert("sayi1!=sayi2",sayi1==sayi2);
 }
 }
 
 |  
 Uyari: NUnit 
ile sadece .dllfoksiyonlar teste tabi tutulabilirler.
 
 
 
	Programda bilerek bir hata yaptık ve testimizin 
başarısız olması gerekiyor.bakalım nasıl olmuş...
		| C:\mcs -target:library -r:nunit.framework.dll 
		test.cs 
 C:\nunit-console test.dll
 |  
 
  
 Programımızı satır satır incelersek, ilk olarak
NUnit.Framework isim uzayını kullanacağımızı belirttik. Daha sonra ise 
class ımıza [TestFixture] niteliğini kazandırarak NUnit programına bir class ın 
test edileceğini belirtiyoruz. Daha sonra deneme() methoduna bir test uygulanacağını 
belirten niteliği yani [Test] niteliğini kazandırıyoruz. Eğerki biz 
fonksiyonumuza bu niteliği kazandırmazsak, NUnit te herhangi bir test işlemine 
uygulanmadan geçecektir. deneme methoduna bakarsak iki sayiya belirli değerler 
verilmiş. NUnit.Framework kütüphanesinin bir class ı olan Assertion ile 
yapacağımız testi daha spesifik hale getirebiliriz. Assertion ingilizcede 
"bildiri" demek, Assert ise "bildiri bildirmek" demek olduğuna göre geriye 
belirli bir koşul gerçekleşmiyorsa bir hata dönecektir.
 
 Assertion.Assert(string rapordakimesaj,bool 
kosul);
 
 Assertion.Assert(bool kosul);
 
 Eger ki Assert teki koşul parametresinin 
değeri false ise geriye 
önündeki string i geri döndürür ve rapora ilave eder. NUnit 
yaptığı işten sonra bulunan test sonuçlarını .xml formatındaki bir rapor 
dosyasında saklamaktadır.
 
 
  
 NUnit.Frameworkun niteliklerine bakarsak;
 
 Assert sınıfı;
 
 
 
	Assertion Sınıfı:  
Aslında assert sınıflarının toplandığı büyük bir duyuru sınıfıdır. Aradaki 
ilişki DataTable 
ile DataSet arasındakine ilişkiye benzetilebilir.
		| NUnit.Framework isim 
		uzayını Assert sınıfının  Methodları: |  
		| Assert.AreEqual(object 
		olası,object olay); |  
		| Assert.AreSame(object 
		olası,object olay); |  
		| Assert.Fail();// testin 
		fail olduğunu belirtmek için kullanılır. |  
		| Assert.IsFalse(bool 
		cevap);//cevap eğer false ise test olumsuz sonuçlanır. |  
		| Assert.IsTrue(bool 
		cevap);//cevap eğer true ise test olumsuzdur. |  
		| Assert.IsNull(object 
		o);//eğer o=null ise test olumsuz sonuçlanır. |  
		| Assert.IsNotNull(object 
		o);//eğer o!=null ise test olumsuz sonuçlanır |  
		| Assert.ReferanceEquals(object o1,object o2);//o1 ile o2nin referansları 
		eşit ise test olumsuz sonuçlanır. |  
 
 
	Nitelikler:
		| NUnit.Framework isim uzayını 
		Assertion sınıfının özellikleri ve Methodları |  
		| Assertion.Assert(bool olay);  
		//olay false ise test olumsuzdur.(yani olaydan kastım sayi1= =sayi2 gibi |  
		| Assertion.AssertEquals(string 
		mesaj,object gerekliolay,object olay); |  
		| Assertion.AssertNotNull(string  
		mesaj,object kontroledilenobje); |  
		| Assertion.AssertNull(string 
		mesaj,object kontroledilenobje); |  
		| Assertion.AssertSame(string 
		mesaj,object gerekliolay,object olay); |  
		| Assertion.Fail(string mesaj);// test 
		fail olduğu zaman yazıcak yazı.(artık ne yazarsınız bilmem..:)) |  
 
 
	Yukarıda anlattığımız nitelikleri ve bazı 
sınıfları örnekle açıklayalım;
		| Nitelik İsmi: | Kazandırdığı nitelik |  
		| [Setup] | setup niteliği teste başlamadan önce 
		yapılacak ayarları yapar. |  
		| [TearDown] | teste zarar verecek dataları temizleme 
		niteliği kazandırır. |  
		| [Test] | fonksiyonun teste tabi tutulacağını 
		belirleyen nitelik. |  
		| [TestFixture] | classın teste tabii tutulacağı 
		niteliği belirler. |  
		| [TestFixtureSetUp] | classın teste başlamadan önceki 
		ayarlarını yaptıran nitelik. |  
		| [TestFixtureTearDown] | classın teste başlamadan önceki zarar 
		verici dataları temizler. |  
		| [ExpectedException] | Açıklanmış hataları kazandıra nitelik |  
		| [Ignore(string mesaj)] | bu niteliği kazanmış method testete 
		önemsenmez. |  
 
 
	
		| //anatest.cs
		using System; using NUnit.Framework;
 
 [TestFixture]
 public class testsinif
 {
 int sayi1,sayi2;
 
 [SetUp]
 public void setup()
 {
 sayi1=5;
 sayi2=0;
 }
 [Test]
 public void esitlermi()
 {
 Assert.AreEqual("sayi1!=sayi2 olmadigi icin hata verdi",sayi1==sayi2);
 }
 
 [Test]
 public void nesnebosmu()
 {
 object o="caner";
 Assert.IsNull(o);
 }
 
 [Test]
 public void fail()
 {
 Assert.Fail("Test basarisiz 
		sonuclandi");
 }
 
 [Test]
 [Ignore("Notest fonksiyonu teste tabii 
		tutulmadi")]
 public void notest()
 {
 Assert.AreEqual("sayi1==sayi2mi testine tabii tutulmadi",sayi1==sayi2);
 }
 }
 
 
 
			
				| mcs -target:library 
				-r:nunit.framework.dll anatest.cs
				nunit-console anatest.dll |  |   
 Artık program yazarken test edebileceğimiz 
durumlarıda göz önünde tutmak gerektiğinin ne kadar yerinde bir davranış olduğu 
birkez daha ortaya çıkmış oldu.
 
 programdaki kodlar için
 
 Bir sonraki yazılarda görüşmek üzere.
 
 Caner ŞAHAN
 
 Kaynaklar:
 
 www.nunit.org
 
 www.junit.org
 
 http://msdn.microsoft.com/msdnmag/issues/04/04/default.aspx
 
 http://www.microsoft.com/MSPress/books/6778.asp
 
 
 
                Makale:Mono' da NUnit Yardımıyla Kod Testi Mono - Linux'ta .NET  Caner Şahan
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |