JUnit3 8的初步學習

2021-08-23 14:47:55 字數 4543 閱讀 9946

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...