Junit 教程

Junit 教程

以下是一份簡單的教程,向您展示如何使用Junit編寫和組織測試程序。

 


一個簡單的測試用例。

您是怎樣編寫測試代碼的呢?

在調試器中使用表達式也許是最簡單的辦法。您可以不用重新編譯,就能改變調試器中的表達式,您甚至可以在您看到運行的對象實例後再決定如何改變;您也可以寫一些作爲測試的表達式將結果打印到標準輸出。以上風格的測試都有一些侷限,因爲它們都需要人爲的判斷來分析程序運行的結果;而且,呈現給您的也是一些不友好的輸出。您每次只能運行一個調試表達式,如果一個程序有太多的輸出語句將導致您很難找到您需要的結果。


Junit 教程

以下是一份簡單的教程,向您展示如何使用Junit編寫和組織測試程序。

 


一個簡單的測試用例。

您是怎樣編寫測試代碼的呢?

在調試器中使用表達式也許是最簡單的辦法。您可以不用重新編譯,就能改變調試器中的表達式,您甚至可以在您看到運行的對象實例後再決定如何改變;您也可以寫一些作爲測試的表達式將結果打印到標準輸出。以上風格的測試都有一些侷限,因爲它們都需要人爲的判斷來分析程序運行的結果;而且,呈現給您的也是一些不友好的輸出。您每次只能運行一個調試表達式,如果一個程序有太多的輸出語句將導致您很難找到您需要的結果。

JUnit Test不需要人的判斷去解釋,而且一次可以運行很多的測試。如果您需要測試某個東東的時候,您只要這麼做即可:

從TestCase繼承出一個子類。
重寫runTest()方法。
當您想檢查一個值時,調用assertTrue()方法,並傳入一個布爾量真值來代表測試通過。
例如:爲了測試同一貨幣單位的兩個錢數的和,我們包含了一個真實的值表示了這兩個錢數的和。如下:

public void testSimpleAdd()

{

Money m12CHF = new Money(12,"CHF");

Money m14CHF = new Money(14,"CHF");

Money expected= new Money(26,"CHF");

Money result = m12CHF.add(m14CHF)

assertTrue(expected.equals(result));

}

如果,您要寫的測試與以前寫過的有些類似,那就寫一個模板。如果,您想運行多個測試,那就建立一個組。

模板:

當您有兩個或多個測試需要操作對象的同一或相近部分,該怎麼辦?

測試需要運行在部分內容已經確定的對象上,這些已知的部分被稱作測試模板。當您在寫測試的時候,您通常會發現您構建測試環境(已知部分)的時間要比您真正比較測試結果的時間要長。

從某種程度上說,您如果仔細使用構造函數,您寫模板的時候也許更容易些。不管怎麼樣,許多的保存內容來自共享的模板。通常,您能夠將這個模板應用到一些不同的測試上。每個測試用例將傳遞相近的信息或參數給模板,然後檢查不同的結果。

當您寫一個通用的模板時,下面是您所要做的:

從TestCase生成子類。
給模板添加需要使用的實例變量。
覆寫setUp()方法來實例化變量。
覆寫tearDown()方法來釋放您在setUp()方法中建立的永久資源。
例如:爲了寫一些使用到 12瑞士法郎,14瑞士法郎,28美元不同組合的測試用例,那就首先寫一個模板:

public class MoneyTest extends TestCase

{

private Money f12CHF;

private Money f14CHF;

private Money f28USD;

protected void setUp()

{

f12CHF = new Money(12,"CHF");

f14CHF = new Money(14,"CHF");

f28USD = new Money(28,"USD");

}

}

一旦您寫完了模板,那麼,您就可以再寫隨意多的測試用例了。

測試用例

當您擁有了模板後,您是怎樣來寫和調用單獨的測試用例呢?

當沒有模板的時候,寫測試用例是簡單的--只需覆寫TestCase的匿名子類中的runTest方法。有模板後,生成TestCase的子類來寫設置的代碼。然後,爲單獨的測試用例寫匿名子類。然而,當寫過一些測試以後,您將注意到,很多的代碼行都浪費在語法上了。

JUnit提供了一個簡練的方法來利用模板寫測試,如下:

1,在包含模板的類中提供一個public void 方法,通常約定:方法名以test開頭。

例如:爲了測試Moeny 和MoneyBag的和,如下:

public void testMoneyMoneyBag()

{

//[12 CHF] +[14 CHF] +[28 USD] == {[26 CHF] [28 USD] }

Money bag[] = {f26CHF,f28USD};

MoneyBag expected = new MoneyBag(bag);

assertEquals(expected,f12CHF.add(f28USD.add(f14CHF)));

}

創建一個MoneyTest實例來運行這個用例的方法,如下:

new MoneyTest("testMoneyMoneyBag")

當這個測試運行時,這個參數名字被用來查找需要運行的方法。

當您有多個測試用例時,可以將他們組織成(套件)suite.

套件(suite)

您怎樣才能一次運行多個測試?

只要您有了兩個測試,您可能就希望一起運行他們。您當然可以每次只運行一個,但是很快您就會感到厭倦。JUnit提供了一個對象,TestSuite,以方便您一次完成任意多的測試一起運行。

例如:只運行一個測試用例,您可能會執行:

TestResult result = (new MoneyTest("testMoneyMoneyBag")).run();

運行兩個測試用例,可以先產生一個套件(Suite),然後將這兩個測試用例包含其中,如下:

TestSuite suite = new TestSuite();

suite.addTest(new MoneyTest("testMoneyMoneyBag"));

suite.addTest(new MoneyTest("testSimpleAdd"));

TestResult result = suite.run();

您可以採取另外的一種方式來一次運行多個測試用例,那就是讓JUnit自己從用例類(TestCase)中提取套件(Suite)。您可以通過將用例類(TestCase)的類名傳遞給套件(Suite)的構造函數來做到這點。

TestSuite suite = new TestSuite(MoneyTest.class);

TestResult result = suite.run();

使用手工方法的多數情況是,我們希望套件中只包含測試用例的一個子集。其他情況,推薦使用自動提取測試套件方法,它能夠避免當您在新添加了一個測試用例後,還需要更改TestSuite(套件)產生代碼。

TestSuites(套件)不僅可以包含測試用例,它還可以包含實現Test接口的任意對象。例如,您可以在您的代碼中產生一個套件,同時,我也產生一個,然後我們可以產生一個包含上述兩個套件的套件來一起運行。

TestSuite suite = new TestSuite();

suite.addTest(Kent.suite());

suite.addTest(Erich.suite());

TestResult result = suite.run();

TestRunner(測試執行器)

您怎樣運行測試,並收集執行後的結果?

當您有了一個測試套件的時候,您就想運行它。Juint提供了工具來定義這個套件運行並顯示測試結果,您需使您的套件能被TestRunner(測試運行器)訪問;您可以使用靜態方法suite(),並且返回一個suite(套件)來完成這項工作。

public static Test suite()

{

TestSuite suite = new TestSuite();

suite.addTest(new MoneyTest("testMoneyEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
return suite;


}

或則,採用自動提取的方式:

public static Test suite() {
return new TestSuite(MoneyTest.class);
}

如果,TestCase沒有定義suite方法,測試執行器將自動嘗試提取一個suite,並把以test開頭的方法裝入套件。

Juint提供了圖形和文本兩種方式的測試執行器,啓動方式分別是:java junit.awtui.TestRunner 或則 java junit.swingui.TestRunner.

圖形界面的執行方式提供了一個窗口,內容包括:

一個輸入文本框,用來鍵入包含suite方法的類的名字。
一個啓動測試的按鈕。
一個進度條,如果測試失敗,他將從綠色變爲紅色。
一個包含失敗的測試的列表。
當測試不通過時,juint在底部提供一個失敗測試的報表。juint區分失敗和錯誤。失敗是預期的,並且使用斷言assertions來做檢查的.錯誤是沒有預計到的,象數組索引越界。下圖包含了一個失敗的測試。

當您改變代碼後,您必須重新啓動圖形界面窗口,這是繁瑣和耗時的。爲了避免這種情況,JUnit 的AWT 和Swing UIs 可以利用junit.runner.LoadingTestCollector ,這個工具在測試的每次運行時都重新讀入您的類。如果您想關閉這個功能,去掉"reload classes"屬性選項即可。在幫助中您可以找到更詳細的信息。

有一個批處理來啓動Junit.您可以在命令行中鍵入java junit.textui.TestRunner ,後跟包含suite方法的類名。這個方式得到一些終端文本輸出。另外一種啓動的方式是在您的TestCase類中,包含如下定義的main方法。

例如:啓動MoneyTest的測試執行器,

public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}


當您定義了這個main方法後,您就可以在命令行中鍵入:java MoneyTest 來運行您的測試了。

無論是圖形方式還是文本方式,都要確認在您的classpath上是否包含了junit.jar.


在本文中,TestCase--測試用例,Suite--套件,TestRunner--測試執行器

來源:http://whhmily.bokee.com/834988.html

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章