2008年11月1日 星期六

JUnit4(一)

JUnit4已經發表有一段時間了,藉由JDK5之後的Annotation的幫助,在撰寫unit上面更加的容易了,先來看一個簡單計算機
public class caculator{
private int result;
public caculator(){
result=0;
}
public void add(int n){
result+=n;
}
public void multiply(int n){
}
public void divide(int n){
result/=n;
}
public void substract(int n){
result-=1;
}
public void clear(){
result=0;
}
public int getResult(){
return result;
}
}


上面有幾點要解說的,其中有幾個method是故意做錯的,好用於測試junit,接著看junit4所寫的程式碼

import static org.junit.Assert.*;
import static java.lang.System.out;
import org.junit.Before;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;

public class caculatorTest{
private caculator c;
@Before public void setUp(){
out.println("set up");
c=new caculator();
}
@After public void tearDown(){
out.println("tear down");
c=null;
}
@Test public void testAdd(){
out.println("test add");
c.add(5);
assertEquals(5,c.getResult());
}
@Ignore
@Test public void testMultiply(){
out.println("test multiply");
}
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(caculatorTest.class);
}
}
裡面可以看到out.println是故意加上去,可以用來觀察程式的運作方式,過去以往在每個測試的method前後會被呼叫的setUp跟tearDown可以直接被@Before跟@After所取代,這兩個方法的功能分別是來執行建構準備測試的物件跟把物件清除,這裡單純的只要建構caculator物件跟把他設定為null(即是"刪除"該物件),這樣做的目的確保在測試過程中不會"污染"物件,導致測試結果可能會依賴於測試方法呼叫的次序

@Test這個annotation表示我們要測試某個功能,裡面所要用到的物件分別在@Before跟@After這兩個annotation的方法被準備好了;@Ignore表示說這個方法尚且未被準備好來測試,可能是因為還沒實做,也可能是其他原因

裡面的static method可以回傳一個TestSuite物件,裡面只要加入要測試的class就可以了
將上面兩個檔案放在同一個目錄,並且從junit的官方網站下載junit4.jar放到相同的目錄,接著執行

java -cp %CLASSPATH%;./junit-4.5.jar;. org.junit.runner.JUnitCore caculatorTest

這裡org.junit.runner.JUnitCore這個類別包含了一個main method,他接受的參數為準備要接受測試的class,如果有多個要測試的class就都加入在後面即可
結果如下
JUnit version 4.5
.set up
test add
tear down

Time: 0.015

OK (1 test)

請注意那個紅色的點,每個點表示通過一項測試,後面可以看到在乎叫testadd之前會先呼叫setUp跟之後呼叫tearDown,其實junit4再引入annotation之後,那兩個方法的名稱已經可以隨意取,可是沿用過去junit3以前的慣例比較顯的有可讀性,這裡也有一個跟junit3不一樣的就是,class已經不用強制繼承TestCase這個class了

沒有留言: