簡單的框架 JUnit是由Erich Gamma和Kent Beck開發的開源測試框架
JBuilder集成了這個框架並對此做了擴展
JUnit之所以流行並為廣大的開發人員所推崇
一是因為它實戰性強
功能強大
二是因為它實在簡單
一個產品或框架要能有生命力
最好都具備這樣的特點
簡單地講這個框架提供了許多斷言(assert)方法
允許你設置測試的規則
如
assertEquals()
assertNull()
assertNotSame()
assertTrue()等方法
一個測試用例包括了多個斷言
當運行測試用例後
JUnit運行器會報告哪些斷言沒有通過
開發人員就可順籐摸瓜搞個水落石出了
而傳統的測試方法需要將期望的結果用諸如System
out
println()等語句將過程信息打印到控制台或日志中
由開發人員觀察輸出信息以判斷是否正確
現在這種
觀察
的工作由JUnit的那些assertXxx()方法自動完成
JUnit的測試框架類結構很簡單
主要由
個類組成
其類圖關系如下圖所示
圖 錯誤!文檔中沒有指定樣式的文字
JUnit測試框架類結構
·junit
framework
Test
測試接口
·junit
framework
TestCase
測試用例類
業務類的測試用例類只需要承繼這個TestCase
根據情況編寫若干個public void testXxx()方法
在方法中通過assertYyy()定制若干測試規則就可以了
·junit
framework
TestSuite
測試套件類
它可以將多個測試用例類捆綁在一起運行
也可以捆綁另一個測試套件
測試固件(Fixture) 一個測試用例可以包含若干個testXxx()測試方法
測試用例測試一個或多個類API接口的正確性
當然在調用類API時
需要事先創建這個類的對象及一些關聯的對象
這組對象就稱為測試固件(Fixture)
相當於測試用例的
工作對象
我們在前面說過
一個測試用例類可以包含多個testXxx()方法
在運行時
每個測試方法都對應一個測試用例類的實例
當然
你可以在具體的testXxx()方法裡聲明並實例化業務類的實例
在測試完成後再銷毀它們
但是
這麼一來你就要在每個testXxx()方法中都重復這些代碼
因為TestCase實例被運行時
依照以下步驟運行
.創建測試用例的實例
.調用setUp()方法
執行一些初始化工作
.運行testXxx()測試方法
.調用tearDown()方法
執行銷毀對象的工作
如果測試用例類中有多個testXxx()方法
且它們都需要使用到相同的一組對象
我們可以在setUp()中實例化這組對象
並在tearDown()中銷毀它們
要編寫測試固件
依照以下步驟進行
.創建TestCase類的子類
.在子類中聲明若干個測試所用的對象
.覆蓋setUp()方法
在方法中實例化這些對象
.覆蓋tearDown()方法
釋放這些對象的資源
如下面即是一個簡單的測試固件
代碼清單 錯誤!文檔中沒有指定樣式的文字
測試固件
public class MoneyTest extends TestCase
{
private Money f
CHF;//
瑞士法郎
private Money f
CHF; //
瑞士法郎
private Money f
USD; //
美國美元
protected void setUp() {
f
CHF= new Money(
CHF
);
f
CHF= new Money(
CHF
);
f
USD= new Money(
USD
);
}
protected void tearDown(){}
}
第
~
行聲明了
個Money類對象(測試固件)
在setUp()方法中實例化這
個對象(第
~
行)
由於這些對象可以被垃圾進行直接回收
所以在tearDown()中不做任何操作
測試用例(TestCase) 有了測試固件
就可以開始編寫測試用例的測試方法了
當然你也可不需要測試固件而直接編寫測試用例方法
下面我們在測試固件的基礎上添加測試用例方法testMoneyBag()
代碼如下所示
代碼清單 錯誤!文檔中沒有指定樣式的文字
測試用例方法
public class MoneyTest extends TestCase
{
private Money f
CHF;//
瑞士法郎
private Money f
CHF; //
瑞士法郎
private Money f
USD; //
美國美元
protected void setUp() {
f
CHF= new Money(
CHF
);
f
CHF= new Money(
CHF
);
f
USD= new Money(
USD
);
}
public void testMoneyBag()
{
Money bag[]= { f
CHF
f
USD };
MoneyBag expected= new MoneyBag(bag);
assertEquals(expected
f
CHF
add(f
USD
add(f
CHF)));
}
protected void tearDown(){}
}
測試方法都必須以test為前綴
且必須是public void的
運行器以此為反射查找規則找到這些測試用例方法
在一個方法中可以包括多個assertYyy()方法
每個assertYyy()方法都是一個測試規則
像第
行的assertYyy()斷言方法即為測試Money的add()方法和MoneyBag類正確性的測試規則
你可以在MoneyTest中添加多個public void testXxx()方法
運行器為每個方法生成一個測試用例實例
分別運行
測試套件(TestSuite) 如果每次只能運行一個測試用例
那麼又陷入了我們前面所談到的傳統測試的窘境
手工去運行一個個測試用例
測試套件專門為解決這一問題而來
它通過TestSuite對象將多個測試用例組裝成到一個測試套件
則測試套件批量運行
需要特殊指出的是
可以把一個測試套件整個添加到另一個測試套件中
就象小筐裝進大筐裡變成一個箧一樣
測試套件類也通過承繼TestCase類實現
只不過它提供了一個public static Test suite()靜態方法
在該方法中將多個測試用例捆綁組裝在一起
一個典型的測試套件代碼如下所示
代碼清單 錯誤!文檔中沒有指定樣式的文字
測試套件
public class MoneyTestSuite extends TestCase
{
public TestSuite
(String s)
{
super(s);
}
public static Test suite()
{
TestSuite suite = new TestSuite();
suite
addTestSuite(MoneyTest
class);
suite
addTestSuite(MoneyBag
class);
return suite;
}
}
在第
行中聲明並實例化了一個TestSuite
在第
行分別加入一個測試用例
你可以通過suite
addTest(Test t)方法添加一個套件
這樣運行這個套件就可以自動運行所有測試用例的測試方法了
測試運行器 JUnit提供了
個標准的測試運行器運行這些測試用例或測試套件
這
個測試運行器分別是
·junit
textui
TestRunner
文本測試運行器
·junit
awtui
TestRunner
使用AWT組件界面的測試運行器
·junit
swingui
TestRunner
使用Swing組件界面的測試運行器
下面是基於AWT組件的測試運行器
如下圖所示
圖 錯誤!文檔中沒有指定樣式的文字
AWT測試運行器
·Test class name
指定測試用例類和測試套件類
·一個進度條
表示運行測試的執行進度
進度條下是正確
錯誤
失敗的測試統計數
·Error and Failures
列出了測試錯誤和失敗的列表
點選其中的一個選項時
JUnit在窗口底部列出錯誤跟蹤跡
提示 JBuilder提供了方便的運行測試用例和測試套件類的方法
你只須點擊鼠標右鍵就可直接調用了
此外
JBuilder提供了一個JBTestRunner測試運行器
在功能和易用性上非JUnit提供的測試運行器所能媲美
JBuilder支持JUnit所提供的兩個測試運行器
junit
textui
TestRunner和junit
swingui
TestRunner
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28708.html