Ana içeriğe atla

.net C# ile Test Driven Development (TDD) nasıl uygulanır?

.net C# kullanacağım birkaç projede TDD yöntemini kullanmayı düşünüyorum. Bu yüzden .net ortamında TDD nin nasıl yapılacağıyla ilgili biraz araştırma yaptım ve işime yarayabilecek, bu alanda yaygın olarak kullanılan, iki tane açık kaynak kodlu test uygulaması buldum: csunit ve nunit.

Dokumanlar ve makaleleri karıştırınca nunit daha iyi anlatılmış gibi geldi, bu nedenle nunit ile çalışmaya karar verdim.TDD daha çok java dünyasında ve Junit egemenliğinde kullanıldığından .net için çok fazla Türkçe döküman bulunamıyor.

Nunit Test Ortamı

Nunit test ortamı .net dillerinin tümü ile kullanılabiliyor. Test sınıfında yapılan "test fixture", "test" metodları, "setup" metodu ve "teardown" metodu gibi özel tanımlar yoluyla test edilecek yapının belirlenmesi sağlanıyor.

TestFixture Tanımı

Kullanıldığı sınıfın içerisinde test metodları olduğunu belirtir.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{
}
}
TestFixture tanımı kullanan sınıfların erişilebilir(public) bir oluşturucu(constructor)
metodları olmalıdır(yada varsayılanı zaten erişilebilir olduğundan, oluşturucu metodları
olmamalıdır)

Test Tanımı

Test sınıfında, üzerinde tanımlandığı metodun Test Çalıştırıcısı(TestRunner) tarafından çalıştırılacağını belirtir. Metod erişilebilir olmalı(public), geriye parametre döndürmemeli(void) ve parametre almamalıdır.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
public void TestOne()
{
// // Do something...
}
}
}

SetUp ve Teardown Tanımları


Testler yapılırken, öncesinde ve sonrasında bazı işlemlerin yapılması gerekebilir. Bunun için özel(private) bir metod yaratılıp her metoddan önce/sonra çağrılabilir yada bunun yerine test ortamının sunduğu Setup ve Teardown tanımları kullanılır. Bu metodlar Textfixture içerisinde test edilemsi gereken her metoddan önce ve sonra çalıştırılır.En genel kullanımları bağımsız nesneler yaratılacağı zaman kullanılmalarıdır.


namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{
private int _someValue;

[SetUp]
public void Setup()
{
_someValue = 5;
}

[TearDown]
public void TearDown()
{
_someValue = 0;
}

[Test]
public void TestOne()
{
// Do something...
}
}
}

ExpectedException Tanımı


Testiniz çalışırken bir hata fırlatmasını bekliyorsanız bu tanımı kullanabilirsiniz.


namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]

public class SomeTests
{

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void TestOne()
{
// Do something that throws an InvalidOperationException
}
}
}

Bu kod çalıştığında, yalnız InvalidOperationException nın fırlatılması halinde test başarılı olacaktır. Burada dikkat edilmesi gereken bir nokta bu tanımın kalıtım özelliğini desteklememesi; yani test metodunuz, InvalidOperationException sınıfından kalıtımla yaratılmış bir hata fırlatırsa testiniz çökecektir.

Ignore Tanımı

Yazdığınız testlerden herhangi birinin o an gözardı edilmesini ve çalıştırılmamasını istiyorsanız bu tanımlayıcıyı kullanabilirsiniz. Yorum satırına almaktansa bunu kullanmanız, bu testin size hatırlatılmasını ve daha sonra bunu unutmanızı engelleyecektir.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
[Ignore("We're skipping this one for now.")]
public void TestOne()
{
// Do something...
}
}
}

NUnit Assertion Sınıfı

Metodları test ederken kullanılacak en iyi yöntemlerden bir diğeri de nunit in "assertion" sınıfı ve bu sınıfın sağladığı kontrol metodlarıdır.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
public void TestOne()
{
int i = 4;
Assertion.AssertEquals( 4, i );
}
}
}

Kaynaklar:
http://www.codeproject.com/dotnet/tdd_in_dotnet.asp
http://www.csunit.org/tutorials/tutorial7/index.html
http://www.nunit.org/




Yorumlar