Mono' da NUnit Yardımıyla Kod Testi
İlgili etiketler: assert assertion baslamadan class? gerekiyor. kazandirarak mesaj object niteligi niteligini object olumsuz projenin public soluklu uzayini Mono ve .NET Caner Şahan
Yayınlanma Tarihi : 23.3.2005
Okunma Sayısı : 19606
Ana Sayfa / Makaleler / Mono ve .NET / Mono' da NUnit Yardımıyla Kod Testi
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.
NUnit'te 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;
//test1.cs using System;
public class testsinif
public void deneme()
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 (GAC'ye yüklemediyseniz tabii.)
Uyari: NUnit ile sadece .dll'foksiyonlar teste tabi tutulabilirler.
C:\mcs -target:library -r:nunit.framework.dll test.cs
Programda bilerek bir hata yaptık ve testimizin başarısız olması gerekiyor.bakalım nasıl olmuş...
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);
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;
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 o2'nin referansları eşit ise test olumsuz sonuçlanır.
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ı 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..:))
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 teste'te önemsenmez.
Yukarıda anlattığımız nitelikleri ve bazı sınıfları örnekle açıklayalım;
//anatest.cs using System;
public void esitlermi()
Assert.AreEqual("sayi1!=sayi2 olmadigi icin hata verdi",sayi1==sayi2);
public void nesnebosmu()
Assert.Fail("Test basarisiz sonuclandi");
[Ignore("Notest fonksiyonu teste tabii tutulmadi")]
public void notest()
Assert.AreEqual("sayi1==sayi2'mi 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
Mono' da NUnit Yardımıyla Kod Testi Mono - Linux'ta .NET Caner Şahan