1. 建立乙個工程,取名隨意。
2. 建立包(com.test.junit3),並建立乙個計算類(calculator),新增其相應的方法。完成後**如下:
public class calculator
public int minus(int a, int b)
public int multiply(int a, int b)
public int divide(int a, int b) throws exception
return a / b;
}}
這裡面的方法比較簡單,不在解釋。
3. 建立測試類。
a. 建立測試類的時候(我指的是使用eclipse或者myeclipse進行開發的時候),一般將測試類放到另外乙個源資料夾中。在專案上點右鍵,選擇new-->source folder。名字隨意,一般取名字test。
b. 建立測試包。包名一般與需要被測試的類的包名相同,在這裡,包名與calculator類的包名相同(com.test.junit3)。
c. 建立測試類。測試類命名一般是需要被測試的類名加上字尾「test」,這裡為calculatortest。
4. 測試類需要注意的方面。在這裡,也就是calculatortest需要遵守的規則。
a. 測試類必須繼承testcase類。
b. 測試方法必須為public型的,void的,沒有方法引數,且方法名必須以「test」為字首,即以test開頭(如果不以test開頭,那該方法需要手動啟動測試。執行測試類的時候,該方法是無法被自動進行測試的)。
5. 實際的測試類。
package com.test.junit3;
import junit.framework.assert;
import junit.framework.testcase;
public class calculatortest extends testcase
/*** 執行每乙個測試方法之後,執行teardown();
*/protected void teardown() throws exception
public void testadd()
public void testminus()
public void testmultiply()
public void testdivied() catch (exception e)
assert.assertequals(1, result); }
public void testdivied2() catch (exception e)
//斷言tx是否為空
assert.assertnotnull(tx);
//斷言兩個物件是否相同
assert.assertequals(exception.class,tx.getclass());
//斷言string是否相同
assert.assertequals("除數不能為0!", tx.getmessage());
}}
a. 如果被測試的方法絕對不會有異常丟擲(如:calculator中的add(int a,int b)),那麼在測試類(calculatortest)中可以像下面的**一樣,直接使用斷言assert類中的assertequals(int expected, int actual)方法直接斷言。該方法傳入兩個int引數,乙個表示期望值,即按照設計應該得到的結果expected,乙個表示實際值,即程式實際得到的結果actual。如果這兩個結果相同,則表示被測試的類即(calculator)中的該方法沒有錯誤。
public void testadd()
補充:assert中的assertequals()方法傳入的引數基本可以是所有的型別,包括string、int、char等等,具體的自己看。注意:預期值和實際值的型別必須一致。
b. 如果被測試的方法有異常丟擲(如:calculator中的divied(int a,int b)),那麼在測試類中如果直接使用斷言assert中的assertequals(int expected, int actual)方法時,傳入引數b為0的時候,如下:
public void testdivied() catch (exception e)
assert.assertequals(1, result);
}
無論你的**是否完善,是否已經正確無誤了,testbar顯示仍為紅條,表示該方法無法通過測試。正確的寫法應該如下:
public void testdivied2() catch (exception e)
//斷言tx是否為空
assert.assertnotnull(tx);
//斷言兩個物件是否相同
assert.assertequals(exception.class,tx.getclass());
//斷言異常資訊是否為指定異常資訊。tx.getmessage()獲取異常丟擲的資訊
assert.assertequals("除數不能為0!", tx.getmessage());
}
「assert.fail;」表示該方法測試失敗,它的目的是:假如它被執行到了,那麼表示divide(int a,int b)方法沒有丟擲異常,也就是方法中有bug。
「tx=e;」將異常e賦給tx,將區域性變數賦給全域性變數,以便進行下面操作。
「assert.assertnotnull(tx);」斷言tx是否為空,如果tx為空,則說明divide(int a,int b)方法沒有將異常丟擲,方法中存在bug。
「assert.assertequals(exception.class,tx.getclass());」。tx.getclass()可以得到tx,也就是這個異常是哪個類,然後斷言是否與你期望的異常類相同。如果不同,測試失敗,方法丟擲異常錯誤,方法中存在bug。其實到這裡可以結束了,而「assert.assertequals("除數不能為0!",tx.getmessage());」是為了通過斷言異常資訊,更進一步判斷該異常是否是你在方法中指定的異常。
這樣,通過這些斷言,可以保證你的方法目前沒有發現bug存在,測試的時候,該方法會通過,表現方式為testbar為綠色通過。
6. 在測試的時候,再testcase中有兩個方法,乙個為setup(),表示初始化。該方法在每個測試方法執行之前將被首先執行。比如如果要執行testadd()方法的時候,先要執行一遍setup()方法。因此該方法一般進行一些初始化操作,比如對被測試類的例項化,如:
protected void setup() throws exception
另乙個方法為teardown(),該方法在每個測試方法執行之後執行,因此該方法一般處理每個測試方法結束後的資源釋放操作。
總的來說:如果測試類中有3個測試方法test1(),test2(),test3(),那麼方法的執行順序為
setup()->test1()->teardown()->setup()->test2()->teardown()->setup()->test3()->teardown()
7. 測試的時候,一般要注意臨界值的測試。如除數不能為0,索引越界等問題。
8. 如果在沒有ide的情況下,可以通過使用testrunner類進行測試,如以下**所示
public static void main(string args)
需要注意的是:在junit.awtui、junit.swingui和junit.textui三個包下均有testrunner類,任何乙個類都可以執行測試任務。只是表現的方式不同,看你喜歡用哪個了!
9. 在執行多個測試類的時候,乙個乙個點執行,進行測試顯然是非常費時的事情。junit提供了乙個類testsuite可以將多個測試類一起執行,進行測試。示例**如下:
package com.test.junit3;
import junit.framework.test;
import junit.framework.testcase;
import junit.framework.testsuite;
public class testall extends testcase
}
如注釋所示,該靜態方法名稱必須為suite(),原因可以參看junit源**。另外該方法返回test物件。testsuite中有兩個方法很重要,乙個是addtestsuite(),可以直接新增測試類。另乙個方法為addtest(),可以新增testsuite物件,所以,上面也可以通過下面的**實現:
package com.test.junit3;
import junit.framework.test;
import junit.framework.testcase;
import junit.framework.testsuite;
public class testall extends testcase
}
這樣我們可以方便的對多個測試類進行測試了。 JUNIT3 8學習筆記(2)
2008年8月14號 天氣陰 周五 junit3.8學習筆記 2 執行testcase類的測試類,在執行每乙個測試類方法之前都會執行setup方法,因此可以將一些重複出現的程式碼寫到setup方法中,也可以將測試資料庫的程式碼連線程式碼寫到setup方法中。同樣,有初始化方法,就有銷毀方法teard...
junit3 8原始碼分析
首先在testsuite中的 public testsuite final class theclass catch nosuchmethodexception e object test try else catch instantiationexception e catch invocatio...
Junit3 8原始碼 核心類
好久沒畫圖了,看下這個序列圖,還算比較清晰的 以textui來分析 頂層介面。testsuite和testcase均實現此介面,在具體執行的時候面向此介面程式設計,弱化型別,實現各自的執行流程。testsuite中的run方法 public void run testresult result pu...