|
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;
//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);
}
}
|
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.)
Uyari: NUnit
ile sadece .dllfoksiyonlar teste tabi tutulabilirler.
C:\mcs -target:library -r:nunit.framework.dll
test.cs
C:\nunit-console test.dll |
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);
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ı;
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. |
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..:)) |
Nitelikler:
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. |
Yukarıda anlattığımız nitelikleri ve bazı
sınıfları örnekle açıklayalım;
//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
|
|