15 Aralık 2020

BİRİM TEST

Yazılım dünyasında bulunan hemen hemen herkesin bilmesi ve uygulamasının gerektiğini düşündüğüm “Unit Test” yani birim testin ne olduğunu ve nasıl yazıldığını anlatmaya çalışacağım.

Birim Test

Yazılım dünyasında bulunan hemen hemen herkesin bilmesi ve uygulamasının gerektiğini düşündüğüm “Unit Test” yani birim testin ne olduğunu ve nasıl yazıldığını anlatmaya çalışacağım. Tabi iyi bir yazılım için birim testlerin kaynak planlaması da doğru yapılması gerekiyor. Aksi takdirde yapmakta olduğumuz yazılımın zaman sıkışıklığından birim testler yazılamıyor. Aslında durum tam tersi olması lazım çünkü yazdığımız kodun birim testini ne kadar düzenli yaparsak ilerleyen aşamalarda fark edeceğimiz hataları yazılımın maliyeti büyümeden en başından halletmiş olacağız. Bu durumu aşağıdaki resim ile hata hangi safhada bulunması durumda maliyetinin ne kadar yüksek olduğunu görebiliriz.

Bug and Its Theory – untoldstory

Bu sonuçlar ışında birim test giriş yapmak gerekirse;

Birim Test, bir yazılımın en küçük test edilebilir bölümlerinin, tek tek ve bağımsız olarak doğru çalışması için incelendiği bir yazılım geliştirme sürecidir. Birim Test yazılım testinin ilk seviyesidir ve entegrasyon testinden önce gelir.

Bazı Unit Test Framework’ leri

 

Unit Test nasıl yazılır ?

Geliştireceğimiz yazılımları yazmadan önce Unit Test’ lerini yazmamız gerekiyor ve Unit Test yazmak için de bazı kurallara uymamız gerekiyor.

  • En küçük parçacığı test edilmelidir ve bağımsız çalışabilmelidir.
  • Sadece bir akış test edilmelidir. (Birden fazla akış olursa entegrasyon testi olabilir.)
  • Test method ismi test edilen senaryonun yansıması olmalıdır.(Baktığımızda hangi parçanın test edildiğini anlayabilmek için)
  • Testlerimiz tam otomatik şekilde çalışabilmelidir. (Böylece sürekli koşumlarda herhangi bir hata durumunda hangi testlerimizin çalışmadığını görerek kodlarımıza hızlı müdahale edebiliriz.)
  • Hızlı çalışabilmeli ve çabuk sonuçlar vermelidir. (Yazılımın sonlarına doğru birim test sayımız oldukça fazla olacağı için en başından performansına dikkat ederek yazmalıyız.)
  • Okunaklı, anlaşılabilir ve sürdürülebilir olmalıdır.
  • Test başarısız olduğunda durmalı ve iyi bir hata raporu döndürülmelidir. Buradaki kritik sorular
    •  Bu hata raporunda;
      •  neyi test ettin ?
      • ne yapmalı ?
      • beklenen çıktı neydi ve gerçekte ne yaptığıdır ?

JUnit ile birim test yazmayı ele alacak olursak burada kullanacağımız Annotation lardan bazıları aşağıda bahsetmek istiyorum.

 

@BeforeClass

BeforeClass notasyonu, tüm testler öncesi yapılması gereken işlemlerde kullanılır. Örneğin test metotları mız çalışmadan önce veritabanı bağlantısının yapılması gerekiyorsa bu notasyonun kullanıldığı bir metot oluşturmamız gerekmektedir.

 

@BeforeClass

public static void tumTestlerdenOnceCalistir(){

  System.out.println("@BeforeCLass- Tüm test metotlarından önce çalışır.");

}

 

@AfterClass

AfterClass notasyonu, tüm testler tamamlandıktan sonra yapılması gereken işlemlerde kullanılır. Örneğin @BeforeClass notasyonu ile açtığımız veritabanı bağlantısını @AfterClass notasyonlu bir metot içerisinde sonlandırabiliriz. Her iki metodunda oluşturulurken public static void olarak tanımlanması gerektiğini bilmemiz gerekmektedir.

 

@AfterClass

public static void tumTestlerdenSonraCalistir(){

  System.out.println("@AfterClass - Tüm test metotlarından sonra çalışır");

}

@Before

Before notasyonu, her test metodundan önce çalışır. Örneğin nesnelerimizin test süresince kullanacağı değerleri bu notasyonun bulunduğu metotlarda tanımlayabiliriz.

 

@Before

public void testMetodundanOnceCalistir(){

  System.out.println("@Before - Her test metodundan önce çalışır.");

}

 

@After

After notasyonu, her test metodundan sonra çalışmaktadır. Örneğin @Before notasyonunda tanımladığımız değerleri @After notasyonunda null değer vererek tüm değerleri boşaltabiliriz.

 

@After

public void testMetodundanSonraCalistir(){

  System.out.println("@After - Her test metodundan sonra çalışır.");

}

 

NOT: @BeforeClass ve @AfterClass notasyonları test sürecinde bir kere çalışırken, @Before ve @After notasyonları her test metodunun başında ve sonunda çalışmaktadır.

 

@Test

Birim test yazdığımız her en küçük parçacık için test metodunun başına @Test notasyonu eklememiz gerekmektedir. Bu notasyonu eklemezsek metot test sırasında çalıştırılamaz. Bunu ekleyip testimizi çalıştırdığımızda gelen kontrol sonucu bizim testimiz ile eşleşmiş ise testimiz başarılı bir şekilde sonuçlanmış demektir.

 

@Test

public void testHesaplaUcgeninAlani(){

  System.out.println("hesaplaUcgenAlanı testi başlıyor.");

  Hesaplama hesapla = new Hesaplama();

  int sonuc=(int) hesapla.hesaplaUcgenAlani(3, 2);

  Assert.assertEquals(sonuc, 3); // gelen sonuc ile beklediğimiz sonuç karşılaştırılıyor ve doğru ise devam ediyor.

  System.out.println("Sonuç: " + sonuc);

  System.out.println(" hesaplaUcgenAlanı testi bitti.");

}

 

Sonuç olarak Birim Test, test edilen özelliğin açık bir tanımını yapmalıdır. Testlerde yazılımın bir parçasıdır ve kod yazarken verdiğiniz önemi aynı şekilde test kodlarına da özen gösterelim ve okunabilir test kodu yazalım.

Selim YAVRU