Unit Test nedir ? Visual Studio 2012’de Unit Test Yazmak

Emre Eroğlu
3 min readDec 25, 2022

Önemli: Bu yazı 15 Ağustos 2013 Tarihinde yazılmıştır. Bazı bölümleri geçerliliğini yitirmiş olabilir.

Not :Yazı boyunca örnekler Visual Studio 2012 (Visual Studio 11) üzerinden C++ dili ile verilecektir.

Unit Test Nedir ? Neden Yazılır ?

Unit Test (Birim Testi) Bir yazılımın en küçük birimlerinin test edilmesi demektir.

Temel bir örnek vermek istersek verdiğimiz iki sayıyı toplayan Topla metodumuz olsun;

int topla(int sayi1 , int sayi2)
{
return sayi1 + sayi2;
}

Bu method için yazılacak unit test metodu yaklaşık olarak söyle olacaktır :

TEST_METHOD(toplaTest)
{
int geriDonenDeger;
int beklenenDeger;
geriDonenDeger = topla( 3 + 5 );
beklenenDeger = 8;
Assert::AreEqual( beklenenDeger , geriDonenDeger );
}

Ben bunu ilk gördüğümde bu kadar basit olamaz diye düşünmüştüm, ama öyleymiş. Yapmamız gereken, en basit metodumuz için bile giriş parametresini göndererek beklenen değerle metoddan geri dönen değeri karşılaştırmak.

Test sistemini çalıştırdığımızda yaptığımız testin çalıştığı yada çalışmadığı sonucunu alıyoruz.

Tek başına düşünüldüğünde gereksiz gözükebilecek bu işlemi kabaca açıklamak istersek :

Büyük bir projenin bütün birim testleri yazılırsa proje daha sonra elden geçirilmek istendiğinde yada değişiklik — ekleme yapılmak istendiğinde yaptığımız eklemenin değiştirdiğimiz yer dışında nerelere müdahale ettiğini görmek için, projede başka yerleri etkileyip etkilemediğini kontrol etmek için Unit Test’leri kullanabiliriz. Bütün testleri çalıştırıp sadece çalışmayan testlere bakarak nerelerde düzeltmeler yapmamız gerektiğini çok hızlı bir şekilde görebiliriz. Küçük çapta olmasına rağmen çalıştığım proje üzerinde çalıştırdığımız ilk testte oluşması ihtimalini farkedemediğim bir durumdan(if condition) dolayı hatam olduğunu farkettik. Normalde kullanıcının bile yapmayacağı belkide hiç sorun çıkarmayacak bir hata idi ama sonuçta orada bir hata vardı ve ilk Unit Test’im görevini yerine getirmişti.

Sonuç olarak :

– Sistemin en küçük birimlerini hızlı bir şekilde test ederiz.
– Kodda hata varsa, hatanın nerede oluştuğunu saptamak kolaylaşır.
– Yazdığımız kodun neredeyse tamamının test edilmiş olmasını — test sürekliliğini sağlar.

Microsoft Visual Studio’da Unit Test Yazmak

Visual Studio’da unit test yazmak için bir unit test projesi oluşturmamız gerekiyor.

Bu işlemin bir ön şartı var, Visual Studio sadece Statik Kütüphane (.lib) projeleri için test yazmaya izin veriyor. Eğer projemizi çalıştırabilir yapmak istiyorsak Solution’ımıza bir çalıştırılabilir proje ekleyerek .lib yaptığımız ana projemizi buradan çağırmak işleri epeyce kolaylaştıracaktır.

Statik Kütüphane yaptığımız projemize Unit Test eklemek için; Solition Explorer penceresinden sağ tıklayarak Add -> New Project , ya da FILE menüsünden Add -> New Project’i seçerek açılan pencerede soldan Test i seçiyoruz. Bende 2 çeşit test projesi çıkıyor. Birisi Managed Test Project diğeri Native Unit Test Project, Native olanı seçip projemizi isimlendirerek Solution’ımıza ekliyoruz. İsimlendirme işlemi anlaşılabilir olması için genellikle testini oluşturduğunuz projenizin adının sonuna “Test” kelimesini ekleyerek yapılıyor.

Oluşan test projemiz External Dependecies, Header Files, Resource Files ve Source Files bölümlerinden oluşuyor. Biz Source Files altına unit testlerimizi ekleyerek devam edeceğiz. Projeyi ilk oluşturduğumuzda, sources altında bize örnek bir unit test sınıfı da oluşuyor, ilk olarak onu kullanmaya başlayabiliriz.

Özellikle büyük projeler için oluşabilecek karışıklıkları önlemek adına güzel bir noktaya değinmek istiyorum. Eğer projemizde oluşturduğumuz her sınıf için bir test ayrı bir test sınıfı yazarsak, ileride baktığımızda ya da bizden sonra projede çalışacak kişi testlere baktığında projeyi anlaması çok daha kolay olacaktır. Burada unit testlerin neden önemli olduğunu gösteren 2. bir noktaya daha değinmiş oluyoruz. Daha sonra projemize bakan bir yazılımcı karışık bir metodun ne iş yaptığını anlamaya çalışmaktansa sadece test sınıfını çalıştırarak hızlıca sonuca ulaşabilir. Bu çok büyük bir zaman kaybını önleyecektir.

Her sınıf için ayrı test sınıfı yazmak demişken, test sınıflarının adlandırmalarını, testini yazdığımız sınıfın adının sonuna “test” kelimesini ekleyerek yaparsak işin raconuna uymuş oluyoruz. 🙂

Unit Test Sınıfı Nasıl Düzenlenir

Zor bir işlemden bahsetmiyoruz, tek olayımız çalışacağımız sınıfı, test sınıfımıza include etmek.

Muhtemelen

#include "../ProjeAdi/TestEdilecekSinif.h"

şeklinde olacaktır.

Test sınıfımız yaklaşık olarak aşağıdaki gibi gözükecektir.

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace ProjenizinAdiTest
{
TEST_CLASS(SinifinizinAdiTest)
{
public:
TEST_METHOD(MethodunuzunAdiTest)
{
SinifinizinAdi TestObject;
int actualValue;
int expectedValue;
expectedValue = 1;
string value = "000";
actualValue = TestObject.MethodunuzunAdi(value.c_str());
Assert::AreEqual(expectedValue, actualValue);
}
};
}

Her methodumuz ve metodumuzun içindeki her durum için TEST_METHOD’larımızı alt alta ekliyoruz.

Testlerimizi çalıştırmak için TEST menüsünden Run -> All Tests’i seçiyoruz. Test Explorer ekranından testlerimizin sonucunu kontrol edebiliriz.

Code Coverage

Unit test işlemimiz ile ilgili önemli bir kavram, yaztığımız testlerin kontrol ettiği kodun, yazdığımız koda oranı demek. Ben genelde % olarak baz alındığını gördüm. Code coverage’ımız ne kadar yüksekse unit testlerimizden faydalanma oranımız da o derece yüksektir. Başka bir deyişle bir kodumuzda bir hata olduğunda, hata cover etmediğimiz bir kod bölümüne denk gelmişse biz bunu unit testler ile bulamayacağız demektir. Daha başka bir deyişle “Code Coverage” önemli bir kavram…

Unit testlerle ilgili genel bir bilgilendirme yapmaya çalıştım, umarım işinize yarar.

--

--