Bu yazımda Java’ da test işlemlerine değinmeye çalışacağım. Öncellikle test işlemi nedir, bunu bir tarif etmeye çalışalım. Uygulamaların kodlama süreci boyunca birçok hata ile karşı karşıya kaldığımız ve hala da kalabileceğimiz kaçınılmaz bir gerçek. Peki bu hataları bulup düzeltme yöntemleri içerisinde en çok kullanılanları nelerdir diye soracak olursam herhalde genel cevap şu olur: debug, test kodları ve tabiki araya serpiştirilmiş System.out.println() kodları 😀 :D.

Öncelikle debug ile test arasında farka bakalım. Debug işleminde olaylar adım adım gider ve kullanıcı dönen değerleri kendi kontrol etmek zorundadır. Test işleminde ise kullanıcının kontrol etmesine gerek kalmadan karşılaştırmaları ve doğruluğu yanlışlığı JUnit yapar. Kullanıcıya sadece beklenen ve o anki değerleri verip ekranın altındaki çıktı bölümüne bakmak düşer :D. İsterseniz hemen bir örneğe göz atalım.

package com.farukbozan.junit;import java.util.Random;public class Test {

public int randomIntValue()
{
Random r = new Random();
return r.nextInt(3);
}

public String newString()
{
return new String();
}

}

Buradaki örnek oldukça basit ve mantığı açığa çıkarmak açısından verilmiştir. Sınıfımıza göz atarsak klasik Java sınıflarından herhangi bir farkı yok. Bir tane rastgele int tipinde değer dönderen metot ve bir tane de String tipinde değer dönderen metot var. Gelelim test işlemlerinin yapılacağı sınıfa, aşağıdaki gibi.

package com.farukbozan.junit;import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;public class MainTest {

com.farukbozan.junit.Test testClass;

public MainTest() {
testClass = new com.farukbozan.junit.Test();
}

@BeforeClass
public static void setUpClass() throws Exception {
System.out.println(“BeforeClass”);
}

@AfterClass
public static void tearDownClass() throws Exception {
System.out.println(“AfterClass”);
}

@Before
public void setUp() {
System.out.println(“Before”);
}

@After
public void tearDown() {
System.out.println(“After”);
}

@Test
public void testRandomIntValue()
{
assertEquals(1, testClass.randomIntValue());
}

@Test
public void testNewString()
{
assertNotNull(testClass.newString());
assertEquals(new String(), testClass.newString());
}

}

Yukarıdaki tabloda görmüş olduğunuz sınıf test işlemlerinin gerçekleştirileceği sınıf. Sınıfın adında main geçmesine rağmen dikkat etmenizi istediğim nokta sınıf içerisinde main metodunun olmaması. Yani test işlemleri için çalışabilir bir sınıfa ihtiyacımız yok. Sadece kullanılabilir kodların olması yeterli. Yapılandırıcı içerisinde metotlarını test edeceğimiz sınıfı oluşturuyoruz. @BeforeClass ile işaretlenmiş metot, test sınıfında test işlemlerinden önce bir defa çalışan metottur. Aynı şekilde @AfterClass ise sonra çalışır ve bir defa. @Before her test metodundan önce, @After her test metodundan sonra çalışır.

Sıra geldi test edilecek metotlara. Test işlemi için ayrı olarak metotlar yazıyoruz. Burada testi çalıştıracak olan metodun isminin önemi yok. Yani test edilecek metot isminden farklı olabilir. Yalnız muhtemelen fark ettiğiniz gibi test metotların üstünde @Test belirteci yer almaktadır. Böylece bu metotlar test işlemine tabi tutulacaktır. Bu belirtecin kullanılmadığı metotlar test işlemine tabi tutulmaz. Random değer üreten metodun testine baktığımızda şu ifade karşımıza çıkıyor.

assertEquals(1, testClass.randomIntValue());

Test işlemleri assert ön eki ile başlayan metotlarla yapılır. Burada parametre olarak verilen iki değerin eşitliğini test ediyoruz. 1 bizim istediğimiz değer, 2. parametre ise test edilecek değerdir. Metot random değerler ürettiği için test bazen başarılı olacak, bazen de başarısız olacaktır.

Diğer iki test metodu

assertNotNull(testClass.newString());
assertEquals(new String(), testClass.newString());

ise String ifadeler üzerinden test işlemi yapmaktadır. İlk olarak üretilen String ifadenin null olup olmadığına bakılmaktadır. Daha sonra yeni bir String ifade ile eşit olup olmadığına bakılmaktadır. Bunlara benzer onlarca assert ön eklie test metodu var. Size uygun olanını seçerek oldukça kolay hata bulma işlemleri sağlayabilirsiniz. Son olarak da  test işlemlerinin iki ekran çıktısına bakalım.

junit_basarisiz

junit_basarili

Bol Java’ lı günler dileğiyle…

Categories:

7 Responses

  1. Çok sağol Şampiyon… Bayağı güzel anlatmışsın…

  2. Peki Java Tester ‘lar ne iş yapar. Yani meslek olarak Tester ‘ın görevi nedir tam olarak. Yazılımı test ederken hangi yöntemleri kullanırlar?
    Teşekkürler

  3. Açıkçası bu konu hakkında detaylı teknik bilgim yok ama kendimce yorum yapacak olursam büyük projelerde bütün işi tek bir ekip yapmaz. Sonuçta sistem mimarisini çıkaran bir ekip, bu mimariyi kodlayan bir ekip, bu kodları test eden farklı bir ekip olur. Test ekibi yazılım ekibinin gönderdiği kodları belli değerler ile yukarıdaki gibi kontrol eder. Gördükleri sorunları geri bildirir ve üzerinde değişiklik yapılmalarını sağlarlar. Herhangi bir sorun olmaması durumunda ise release amaçlı ilgili birime iletirler. Aslında bu konuyu test konusunda uzman biri ile tartışmak daha faydalı olacaktır. Eğer bu yazıyı okuyan bir test uzmanı bizimle irtibata geçerse seviniriz. Bilgi paylaştıkça çoğalır. Bol Java’ lı günler dileğiyle…

  4. JUnit, yeni öğrenmeye çalışanlar için güzel bir yazı olmuş.

    teşekkürler,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.