單元測試 。為建立一個有意義的測試實例,通常開始詢問您要使用何種類型的類,然后編寫代碼,進行單元測試" name="description" />
當我們建立了一個類時,我們可以為它建立一個javascript:;" onClick="javascript:tagshow(event, '%B5%A5%D4%AA%B2%E2%CA%D4');" target="_self">單元測試。為建立一個有意義的測試實例,通常開始詢問您要使用何種類型的類,然后編寫代碼,進行單元測試——回歸的獨立測試。
實際上有許多種方法使用新的money類,這里我們將執行兩個測試實例。我們討論的兩個測試(testAddMoney101()和testEquals())將足以演示如何建立單元測試。
1 JUnit
單元測試并不是新的概念。而新的是Borland JBuilder支持面向對象、開放源代碼的測試框架。測試框架的Java 版本是眾所周知的JUnit。
JUnit是編寫重復測試的簡單框架。它是單元測試框架中的一個xUnit框架的實例。您可以從
中了解更多關于該框架的信息。
在我們建立第一個測試實例前,我們需要了解所有測試實例都來自于TestCase類。為寫出正確的測試實例,您的類將需要以下代碼。
import junit.framework.* public class TestMoney101 extends TestCase { public TestMoney101(String s) { protected void setUp() { |
建立TestMoney101的構造函數(constructor)接受建立的參數,并把它傳到父類。setUp()和tearDown()成員函數的支持提供給您建立和取消所需建立一個成功的測試和報告的任何準備活動。我們將稍后展示如何使用這些成員函數建立一個可重用的測試框架。
2 增加特殊測試
一旦我們提供了一個基本的TestCase 簽名,我們就能建立我們的第一個測試實例。請增加以下代碼到TestMoney101。
public void testAddMoney101() { Money101 m12EUR = new Money101(12, "EUR"); // (1) Money101 m14EUR = new Money101(14, "EUR"); // (1) Money101 expected = new Money101(26, "EUR"); Money101 result = m12EUR.addMoney101(m14EUR); // (2) Assert.assertTrue(expected.equals(result)); // (3) } |
測試方法testAddMoney101() 將:
(1)建立被測試對象;
(2)調用一個測試的成員函數(addMoney101());
(3)調用另一個成員函數(equals()),并校驗結果(Assert.assertTrue())。
所有用戶指定的成員函數執行惟一的測試,且操作必須是public類型。
我們將在測試類中加入等式測試,相應的代碼如下:
public void testEquals() { Money101 m12EUR = new Money101(12, "EUR"); Money101 m14EUR = new Money101(14, "EUR"); Assert.assertTrue(!m12EUR.equals(null)); Assert.assertTrue(m12EUR.equals(m12EUR)); Assert.assertTrue(m12EUR.equals(new Money101(12, "EUR"))); Assert.assertTrue(!m12EUR.equals(m14EUR)); } |
我們再次依賴Assert 類來報告相關錯誤條件?,F在我們有時間來檢查Assert的能力。
3 使用斷言(Assert)
開發人員熟悉其他編程環境通常的斷言概念。例如,在C和C++中,assert()宏是常常用來測試一個正確的結論到一個潛在問題的操作。在JUnit中,您可以直接從測試實例中調用任何Assert方法,因為TestCase 是Assert的子類。
不像C和C++語言中assertion 宏的發現,Assert類–被定義和應用為junit.framework.Assert,具有的功能如下所示。
Assert.assertEquals
Assert.assertNotNull
Assert.assertNull
Assert.assertSame
Assert.assertTrue
Assert.fail
除fail成員函數外,上述所有其他符號重載的函數將執行一個測試,來決定是否產生錯誤信息。相反,直接調用fail將通過Assert.fail(String)或Assert.fail()通知Assert為fail。
在Assert類中有許多方法,每個設計執行一個斷言都有所不同。這些方法中的任何一個都觸發測試失敗。
為瀏覽junit.framework.Assert中的不同方法,在編輯器中打開一個測試實例,在結構面板上雙擊TestCase 父類,然后雙擊它的父類Assert。
4 使用setUp()和tearDown()
我們能在測試實例中使用setUp和tearDown方法,以減少重復代碼。在任何測試函數前后,setUp和tearDown方法都應被調用。測試類的代碼如下:
public class TestMoney extends TestCase { Money101 f12EUR; Money101 f14EUR; public TestMoney101(String s) { } |
5 測試集
測試實例可以被集成為測試集。頂層的測試集應該包含其他所有的測試實例和(或)測試集。
測試實例和測試集都是TestCase 的擴展并執行Test 接口。測試實例和測試集惟一的區別是測試實例包含單獨的測試方法,而測試集通常用來組織其他單元實例到一個邏輯的組中,并把它們作為組來運行。測試集可以調用任何測試實例或測試集。
有兩種方法執行測試集,分別為:靜態和動態。在靜態和動態測試中,您都必須提供一個靜態方法建立測試集。
5.1 建立動態測試
有兩種方法建立動態測試實例。第一種方法不僅允許您動態地實例化Test,也可以允許您動態地為正在運行的測試實例加入單獨的測試。相應的代碼如下:
public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new TestMoney101("testEquals")); suite.addTest(new TestMoney101("testAddMoney")); return suite; } |
suite()函數返回一個Test的接口,此接口是被動態建立的。每個測試方法都可以被單獨增加。
我們不僅可以單獨增加每個測試到動態實例,而且可以使用符合字符串的構造函數,相應的代碼如下:
public static Test suite() { return new testSuite(TestMoney101.class); } |
5.2 建立靜態測試
這是使用靜態Test建立同樣功能的代碼。
public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new TestMoney101("money equals") { protected void runTest() { testEquals(); } }); suite.addTest(new TestMoney101("money add") { protected void runTest() { testAddMoney101(); } }); return suite; } |
5.3 JBuilder界面
在JBuilder中使用Test Runner的這些測試輸出樣式如下圖所示。
JBuilder中提供了3種test runner 的類型。每個test runner 對應一個特定的用戶界面。
JUnit Text UI
JUnit Swing UI
JUnit Awt UI
您可以選擇【Project】→【Properties】命令或【Run】→【Configurations】命令中Run面板,在其中選擇Test Runner。每個Test Runner都由Borland JBuilder 集成到測試框架中。
如果測試失敗,將以一個紅色小球作為標記。在 JBuilder 中雙擊該測試方法,您可以直接看到其源代碼。
更多信息請查看《JBuilder精髓》一書。
原文轉自:http://www.anti-gravitydesign.com