5 Temmuz 2015 Pazar

Java Unit ile Test Yapma

      S.a. Arkadaşlar,
      Klasik bir cümle gibi olacak belki ama işlerin yoğunluğundan ve sonraki yorgunluktan bazen bırakın yazmayı, bilgisayarı açmaya bile üşeniyor insan. Hafta sonu girince araya biraz fırsat bulup dinlenebiliyor insan gerçekten. Bugünkü konumuz Junit ile test yapma olacak. Uzun süredir araştırdığım ve yazmak istediğim bir konuydu ama bugünlere kaldı. Nasip bugüneymiş diyelim ve başlayalım.



       Junit nedir, neden yapılır, faydaları nelerdir gibi sorular mevcut. Bunun üzerinde fazla durmayacağız ama kısaca bir şeyler söylemek isteriz. Junit aslında ilk başta programcıyı yavaşlatıyor gibi gösterse de daha sonraki faydalarını hesaba katınca aslında hızlandırdığını göreceksiniz. Daha önce hepimiz yapmışızdır, Bir sayfada bize sorulan soruları sorar ve tamam butonuna basarız. Eğer hatayla karşılaşmazsak ne ala, fakat hatayla karşılaşırsak her defasında bunları yeniden yapmamız gerekecek. Bu da bize ekstradan zaman kaybettirecektir. Aynı zamanda yaptığımız hataların kolayca görülmesini sağlar. Bu ve gibi faydalarını sıralayabiliriz. Şimdi gelelim kodumuza.

     Basit bir toplama çıkarma çarpma bölme işlemi yapacağız. Burada 3 farklı paket tanımladık. Birinin altında interfacemiz, birinin altında ana sınıfımız ve diğerinin altında test sınıfmız. En altta da projenin linkini altta vereceğim.

      Yeni bir Java projesi açıyoruz. New ile ekle kısmından interface ekliyoruz. interface nedir dersek buradaki yazıma bakabilirsiniz.

public interface MathTableModel {

public int  toplama();
public int  cikarma();
public int  carpma ();
public int  bolme ();
}

     Daha sonra da normal sınıfımızı yazalım. Burada biz sınıfımızı oluşturup arayüzümüzü implemete ettiğimiz anda, derleyici bir hata verecektir. Çünkü bu metodları override etmek zorundayız. Onun üzerine tıkladığımızda otomatik olarak oluşturacaktır, size sadece içlerini doldurmak kalıyor. Şimdi verelim sınıfımızı. Normal 4 işlem yapıyoruz o yüzden çok söylenecek bir şey yok aslında. Sadece override anotasyonlarıyla ilgili dediğimiz gibi arayüz tanımladığımız için o metotları ezmek zorundayız. Onu da derleyici otomatik hazırlıyor bizim için.

public class MathTable implements MathTableModel{

int a=0,b=0;
public MathTable(int a,int b){
this.a=a;
this.b=b;
}

@Override
public int toplama() {
return a+b;
}

@Override
public int cikarma() {
return a-b;
}

@Override
public int carpma() {
return a*b;
}

@Override
public int bolme() {
return a/b;
}


     Şimdi gelelim asıl yerimize, yani test sınıfımıza. Test sınıfımıza gelmeden önce test ile ilgili bazı kavram ve metotlara göz atmakta fayda olduğunu düşünüyoruz.

      Anotasyonlar
@Test:   Metodumuzun bir test metod olduğunu belirtir.
@Test(expected=Expection.Class)= beklediğimiz exceptioni eğer vermezse testimiz başarısız olmuş demektir.
@Test(timout=1000)= metodumuz belirtilen millisaniye’den fazla sürerse testimiz başarısız olmuş demektir.
@Before= her test metodundan önce çalışır.
@After= her test metodundan sonra çalışır.
@BeforeClass= tüm metodlardan önce sadece bir kere çalışır
@AfterClass= tüm metodlardan sonra bir kez çalışır.
@Ignore= Farklı sebeplerden dolayı çalışmasını istemediğimiz testi görmezden gelir.

   Bazı Assert Metotları
assertTrue= Verdiğimiz kuralın doğruluğunu test eder.
assertFalse= Verdiğmiz kuralın yanlışlığını test eder.
assertEquals= Verilen iki değerin birbirine olan eşitliğini denetler.
assertNotEquals= Verilen iki değerin birbirine eşitsizliğini denetler.
assertNull= Var değerin null değer taşıdığını 

assertNotNull= Verilen değerin null değer taşımadığını test eder.

     Şimdi de kodumuzu verelim ve onun üzerinden de söyleyeceklerimizi söyleyip yazımızı bitirelim.
package com.malik.test;



public class TestMathTable {
private MathTable mathTable= null;
       @Before
        // çıktımıza dikkat ederseniz her metottan önce çalışır
public void setUp(){
System.out.println("her metoddan once calisir");
int a=4,b=2;
mathTable= new  MathTable(a,b);
}
@After
        // her metottan sonra çalışır
public void tearDown(){
System.out.println("her metoddan sonra deger sıfırlanır");
mathTable=null;
}

 //4 işlem testlerini yapıyoruz
@Test
public void testToplama() {
int beklenenDeger=6;
int gercekDeger=mathTable.toplama();
Assert.assertEquals(beklenenDeger, gercekDeger);
}
@Test
public void testCikarma() {
int beklenenDeger=2;
int gercekDeger=mathTable.cikarma();
Assert.assertEquals(beklenenDeger, gercekDeger);
}
@Test
public void testCarpma() {
int beklenenDeger=8;
int gercekDeger=mathTable.carpma();
Assert.assertEquals(beklenenDeger, gercekDeger);
}
@Test
public void testBolme() {
int beklenenDeger=2;
int gercekDeger=mathTable.bolme();
Assert.assertEquals(beklenenDeger, gercekDeger);
}

@Test(expected=Exception.class)
        //Bölmede farklı olarak 0'a bölünmeme kuralını ele alıyoruz
        //0 bölünde exception fırlatmalı diye yukarıda belirtiyoruz
        //exception fırlatmazsa ters giden birşeyler var anlamına gelir
public void testBolmeException(){
//exception bölme için
int hataliDeger=4/0;
int herHangiDeger=0;
Assert.assertEquals(herHangiDeger , hataliDeger);
}
}

   Tüm sınıflarımızı oluşturduk. Kodlarımızı yazdık. Şimdi testlerimizin üzerine gelip sağ tıklıyoruz. Run as/ Junit seçeneğini seçiyoruz. Alt+Shift+X, T tuş kombinasyonuyla da çalıştırabilirsiniz. Sağ tarafta veya altta eğer her hangi bir hata yapılmadıysa yeşil renkte bir görüntü ekrana gelecektir. Siz de bilgilerinizi test etmek istiyorsanız rakam dışında bir karakter girildiğinde hata vermesini sağlayan testi yazınız. Faydasını göreceğinizi düşünüyoruz. Daha sonra belki ben de yayınlarım.
Proje Linki
 İyi çalışmalar.





2 yorum: