1 Ağu 2008

JUnit Denemeleri (devam-2)

Test yazmanız debug işinizi hafifletiyor.Ama programda asıl işi yapacağınız testleri yazmanıza yardımı olmuyor.Çünkü onların içini doldurmak size kalıyor burada da işin içine algortima bilgisi giriyor.Program yazmanın en can alıcı noktalasıdır Algoritma oluşturmak.
Şimdi asıl işin yapıldığı yere gelecek olursak
-----sınıf başlangıcı-----
package org.calculator.models;

import java.util.StringTokenizer;
import java.util.Vector;

public class HesapMakinesi {

private int sayi = 0;

public void topla(int eklenen) {
sayi = sayi + (eklenen);
}

public void cikar(int cikarilan) {
sayi = sayi - (cikarilan);

}

public int getHafiza() {
return sayi;
}

public void stringToSonuc(String gelen) {
String islenen = gelen;
String aramaKarakteri = "+-";
Vector sayilar = new Vector();//sayilar parçalanmış halde stringler halinde verktörde tutluyor
StringTokenizer tokenizer = new StringTokenizer(islenen, aramaKarakteri);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
sayilar.add(token);
}
char isaret = ' ';//isaretine göre işlem yapıyor +(topla) veya -(cikar)
int degisken = 0;//hangi siradaki sayının işlem göreceğini belirtiyor
sayi = Integer.valueOf(sayilar.get(0));//ilk sayının ataması yapılıyor
for (int i = 0; i < islenen.length(); ++i) {

isaret = islenen.substring(i, i + 1).charAt(0);//işaretler char olarak değiştiriliyor.

if (isaret == '+') {
degisken++;
topla(Integer.valueOf(sayilar.get(degisken)));
}
if (isaret == '-') {
degisken++;
cikar(Integer.valueOf(sayilar.get(degisken)));
}
}

}

}
----sınıf bitişi----------

topla() metodu verilen sayıyı sayi değişkenine eklemize yarıyor.
cikar() metodu verilen sayıyı sayi değişkeninden çıkarmamıza yarıyor.
ama bunlar için algoritma yazmamıza bile gerek yok sayıyı değişene sadece sayıyı ekliyor ya da çıkarıyor.İşin zor tarafı bu kadar kolay halledilemeyecek ve sizin yazacağınız metodlar.
stringToSonuc(String gelen) metodu gelen string i StringTokenizer ile parçalar ayırıyor ve
elimizdeki sayıları bir vektöre atmamızı sağlıyor.
sonra for döngüsü ile her bir karakter kontrol edilerek işaretine göre topla() ya da cikar() metotlarına değişken gönderiliyor.işaret lerin char a çevrilmesi sadece if() in içinde Stringleri karşılaştırmamış olmam.Belki bir yol vardır ama string olarak gönderdiğim değişkenlerde hatalar ortaya çıktı if() blogunun içine girmedi o yüzden char a çevirip kontrol ettim.
Bir kaç söz daha ekleyecek olursam.
Algoritma yazmadan önce o işi yapabilecek bir yol mevcut olabilir bu da işiniz kolaylaştırır.
StringTokenizer işimi bayağı kolaylaştırdı.

JUnit Denemeleri (devam)

Örneğe geçmeden önce bir adres verelim.Eclipse ortamına JUnit kütüphanesi eklenmesini bir örnek üzerinde açıklamış.
http://open.ncsu.edu/se/tutorials/junit/

Şimdi benim yaptığım örneğe gelecek olursak.
JUnit Test mantığını kullanarak programda gerekli olacak metotların yazımı işlemi.
Unit testin mantığı basit ve işlevsel program parçaları geliştirmektir.
Örnekte verilecek bir string parçalanarak işaretten sonraki sayının toplanması yada çıkarılması işlemini yapmaktadır.(Basit hesapmakinesi çok çok basit oldu.)
Sadece toplama ve çıkarma yapıyor hata kontrolü bile yapmıyor.
Önce Test Sınıfımız:CalculatorTests.java
------sınıf başlangıcı---------
package org.calculator.tests;

import org.calculator.models.HesapMakinesi;

import junit.framework.TestCase;

public class CalculatorTests extends TestCase {
private HesapMakinesi hmak;

protected void setUp() {
hmak = new HesapMakinesi();
}

public void testTopla() throws Exception {
hmak.topla(new Integer(10));
hmak.topla(new Integer(5));
assertEquals(15, hmak.getHafiza());

}

public void testCikar() throws Exception {
hmak.topla(new Integer(10));
hmak.cikar(new Integer(3));
assertEquals(7, hmak.getHafiza());

}

public void testHesapYap() throws Exception {
hmak.stringToSonuc("3+5-7");
assertEquals(1, hmak.getHafiza());

}

}
-------sınıf bitişi-------
setUp() metodunda programda gerekecek ORTAK nesneler ve değişkenler yaratılıyor.
yazılan testlerin hepsinde kullanan kod parçacıkları varsa refactoring yapılarak setUp() metodunu içine yazılır.
testTopla() verilen sayıların toplanılıp sonuncunu doğru olup olmadığını kontrol ediyor.Doğru ise test başarıyla geçiyor.
testCikar() verilen iki sayılardan birinciden ikincinin çıkarılmasının doğru yapılıp yapılmadığını kontrol ediyor.Sonuç beklenen ile aynı çıktı ise test başarıyla tamamlanıyor.
testHesapYap() girilen string in parçalandığı zaman işaretlerine göre toplanması ve çıkarılması işlemine tabi tutulan değişkenlerin sonucunun doğru olup olmadığını kontrol ediyor.

Bu kodlara bakıp test yazmanın kolay olduğunu düşünebilirsiniz fakat işler ayrıntıda gizli.
Test yazarken assertEquals() metodunun değişkenlerine özenle dikkat etmelisiniz çünkü yazdığınız değişkenlerin hepsini kabul etmiyor aynı zamanda editor sıralamasına göre işlem yapılar assertEquals(boolean expected, boolean actual)şeklindekini seçip assertEquals(byte expected, byte actual) şekline döndüğünüz zaman assertEquals()'i yeniden yazmanız gerekecek cünkü editör değişiklikleri kabul etmiyor.
http://repository.ops4j.org/classic/junit/junit/3.8.1/api/junit/framework/Assert.html


sizinde göreceğiniz gibi 21 adet assertEquals metodu mevcut ve birbirinin yerine kullanılamıyor.

blogspotun bize verdiği yer yetmedi ikinci yazıda devam edeceğim.