Java’da en popüler test framework olarak JUnit kullanılmaktadır. JUnit dışında TestNG kullanılmaktadır. Fakat biz örneklerimizi JUnit üzerinden yapacağız.
JUnit bize;
Test sonrası edinilen sonuçların kontrolleri,
Ortak olan test verilerinin paylaşılması için test özellikleri,
Hazırlanmış test sınıflarını ortak olarak yürütmek için test suites,
Grafiksel ve metinsel test yürütmesini sağlar.
İlk olarak JUnit kütüphanesini maven projemize eklenmesini için pom.xml dosyasına aşağıda ki bölümü ekledik.
1 2 3 4 5 6 7 8 |
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> |
JUnit ile ilgili ilk örneğimizi yapmadan önce Hesaplama adında bir sınıf ve bu sınıfta üçgenin alanını hesaplayan bir metot hazırladık.
1 2 3 4 5 |
public class Hesaplama { public int hesaplaUcgenAlani(int taban, int yukseklik){ return taban * yukseklik / 2; } } |
Yukarıda ki sınıfın ardından aşağıda JUnit kullanarak ilk test metodumuzu yazdık. Test metotlarını tanımlamak için her metodun başına @Test annotation eklenmesi gerekmektedir.
1 2 3 4 5 6 7 8 9 10 11 |
public class HesaplamaTest { @Test public void testHesaplaUcgeninAlani(){ System.out.println("Start testHesaplaUcgeninAlani()... "); Hesaplama hesapla = new Hesaplama(); int sonuc=hesapla.hesaplaUcgenAlani(3, 2); Assert.assertEquals(sonuc, 3); System.out.println("Sonuç: " + sonuc); System.out.println("End testHesaplaUcgeninAlani()..."); } } |
Yukarıda ki metotda test metodu olduğu anlaşılması için isimlendirmelerde de metot isminin önüne “test” kelimesini ekliyoruz. Metot içersinde ilgili nesneleri çağırdıktan sonra metodumuza 3 ve 2 parametrelerini vererek sonuc isimli değişkene değerleri döndürüyoruz. Assert.assertEquals da ise elimizdeki sonucu 1. parametreye, beklediğimiz sonucu 2. parametreye ekliyoruz. Assert metodunda ki şart doğru olması durumunda ekrana sonucu ve test metodunun bittiğine dair çıktı verecektir.
1 2 3 |
Start testHesaplaUcgeninAlani()... Sonuç: 3 End testHesaplaUcgeninAlani()... |
Ekran çıktısı yukarıda ki beklediğimiz sonucu vermektedir.
Aşağıda ondlaıklı sonuc beklediğimizde test eden bir metotu yazalım.
1 2 3 4 5 6 7 8 9 |
@Test public void testHesaplaUcgeninAlaniOndalikliSonuc(){ System.out.println("Start testHesaplaUcgeninAlaniOndalikliSonuc()... "); Hesaplama hesapla = new Hesaplama(); double sonuc=hesapla.hesaplaUcgenAlani(3, 3); Assert.assertEquals(sonuc, 4.5); System.out.println("Sonuç: " + sonuc); System.out.println("End testHesaplaUcgeninAlaniOndalikliSonuc()..."); } |
1 |
Start testHesaplaUcgeninAlaniOndalikliSonuc()... |
Yukarı ki test metodunda, hesaplaUcgenAlani metodunda 3 ve 3 parametreleri sonucu 4.5 sonucu beklenmektedir. Fakat yukarıda ki ekran çıktısında beklediğimiz sonucu verememektedir. Bu beklenmedik durumdan sonra hesaplaUcgeninAlani isimli metodumuzu yeniden düzenliyoruz.
1 2 3 4 5 |
public class Hesaplama { public double hesaplaUcgenAlani(double taban, double yukseklik){ return taban * yukseklik / 2; } } |
Yukarı metodumuuzn aldığı parametreyi ve dönüş tipini int yerine double yaparak ondalıklı sayı almasını sağladık. Test metodumuzu çalıştırdıktan sonra aşağıda ki sonucu almaktayız.
1 2 3 |
Start testHesaplaUcgeninAlaniOndalikliSonuc()... Sonuç: 4.5 End testHesaplaUcgeninAlaniOndalikliSonuc()... |
Evet testimiz başarıyla çalıştı ve beklediğimiz sonucu yaptığımız refactoring sonrası bize verdi.
Kodları daha önce yazılmamış yazılımların testleri yazılırken, önce test sınıfları ve bu sınıflara ait metotlar hazırlanmaktadır. Daha sonrasında kodlar yazılarak test işlemleri gerçekleştirmektedir.
Çalıştığım projede hemen hemen her metotda kullanılan bir işlevin değiştirilmesine karar verilmesi sonucunda bug oluşacağı aşikardı. Bu yüzden yaptığım değişiklikleri daha önce yazdığım test metotları aracılığıyla çalıştırdım. Toplam 44 test metodunun yaklaşık 20 saniye gibi bir süre içersinde çalışmasını tamamlamasıyla bozulan yerleri tek seferde görmemi sağladı. Test metotları olmasaydı projeyi manuel olarak test etmem gerekecekti. Belkide birçok noktanın gözümden kaçmasına neden olacaktı. Bu yüzden en başta zorlansakda herkesin test metotlarını yazmasını tavsiye ediyorum.