<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    內(nèi)蒙古java團(tuán)隊(duì)

    j2se,j2ee開發(fā)組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Junit 教程

    Posted on 2006-12-21 11:26 帥子 閱讀(3371) 評論(0)  編輯  收藏 所屬分類: j2se技術(shù)專區(qū)

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

    ?


    一個簡單的測試用例。

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

    在調(diào)試器中使用表達(dá)式也許是最簡單的辦法。您可以不用重新編譯,就能改變調(diào)試器中的表達(dá)式,您甚至可以在您看到運(yùn)行的對象實(shí)例后再決定如何改變;您也可以寫一些作為測試的表達(dá)式將結(jié)果打印到標(biāo)準(zhǔn)輸出。以上風(fēng)格的測試都有一些局限,因?yàn)樗鼈兌夹枰藶榈呐袛鄟矸治龀绦蜻\(yùn)行的結(jié)果;而且,呈現(xiàn)給您的也是一些不友好的輸出。您每次只能運(yùn)行一個調(diào)試表達(dá)式,如果一個程序有太多的輸出語句將導(dǎo)致您很難找到您需要的結(jié)果。


    Junit?教程

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

    ?


    一個簡單的測試用例。

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

    在調(diào)試器中使用表達(dá)式也許是最簡單的辦法。您可以不用重新編譯,就能改變調(diào)試器中的表達(dá)式,您甚至可以在您看到運(yùn)行的對象實(shí)例后再決定如何改變;您也可以寫一些作為測試的表達(dá)式將結(jié)果打印到標(biāo)準(zhǔn)輸出。以上風(fēng)格的測試都有一些局限,因?yàn)樗鼈兌夹枰藶榈呐袛鄟矸治龀绦蜻\(yùn)行的結(jié)果;而且,呈現(xiàn)給您的也是一些不友好的輸出。您每次只能運(yùn)行一個調(diào)試表達(dá)式,如果一個程序有太多的輸出語句將導(dǎo)致您很難找到您需要的結(jié)果。

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

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

    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));

    }

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

    模板:

    當(dāng)您有兩個或多個測試需要操作對象的同一或相近部分,該怎么辦?

    測試需要運(yùn)行在部分內(nèi)容已經(jīng)確定的對象上,這些已知的部分被稱作測試模板。當(dāng)您在寫測試的時候,您通常會發(fā)現(xiàn)您構(gòu)建測試環(huán)境(已知部分)的時間要比您真正比較測試結(jié)果的時間要長。

    從某種程度上說,您如果仔細(xì)使用構(gòu)造函數(shù),您寫模板的時候也許更容易些。不管怎么樣,許多的保存內(nèi)容來自共享的模板。通常,您能夠?qū)⑦@個模板應(yīng)用到一些不同的測試上。每個測試用例將傳遞相近的信息或參數(shù)給模板,然后檢查不同的結(jié)果。

    當(dāng)您寫一個通用的模板時,下面是您所要做的:

    從TestCase生成子類。
    給模板添加需要使用的實(shí)例變量。
    覆寫setUp()方法來實(shí)例化變量。
    覆寫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");

    }

    }

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

    測試用例

    當(dāng)您擁有了模板后,您是怎樣來寫和調(diào)用單獨(dú)的測試用例呢?

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

    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)));

    }

    創(chuàng)建一個MoneyTest實(shí)例來運(yùn)行這個用例的方法,如下:

    new MoneyTest("testMoneyMoneyBag")

    當(dāng)這個測試運(yùn)行時,這個參數(shù)名字被用來查找需要運(yùn)行的方法。

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

    套件(suite)

    您怎樣才能一次運(yùn)行多個測試?

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

    例如:只運(yùn)行一個測試用例,您可能會執(zhí)行:

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

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

    TestSuite suite = new TestSuite();

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

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

    TestResult result = suite.run();

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

    TestSuite suite = new TestSuite(MoneyTest.class);

    TestResult result = suite.run();

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

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

    TestSuite suite = new TestSuite();

    suite.addTest(Kent.suite());

    suite.addTest(Erich.suite());

    TestResult result = suite.run();

    TestRunner(測試執(zhí)行器)

    您怎樣運(yùn)行測試,并收集執(zhí)行后的結(jié)果?

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

    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方法,測試執(zhí)行器將自動嘗試提取一個suite,并把以test開頭的方法裝入套件。

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

    圖形界面的執(zhí)行方式提供了一個窗口,內(nèi)容包括:

    一個輸入文本框,用來鍵入包含suite方法的類的名字。
    一個啟動測試的按鈕。
    一個進(jìn)度條,如果測試失敗,他將從綠色變?yōu)榧t色。
    一個包含失敗的測試的列表。
    當(dāng)測試不通過時,juint在底部提供一個失敗測試的報表。juint區(qū)分失敗和錯誤。失敗是預(yù)期的,并且使用斷言assertions來做檢查的.錯誤是沒有預(yù)計到的,象數(shù)組索引越界。下圖包含了一個失敗的測試。

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

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

    例如:啟動MoneyTest的測試執(zhí)行器,

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


    當(dāng)您定義了這個main方法后,您就可以在命令行中鍵入:java MoneyTest 來運(yùn)行您的測試了。

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


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

    主站蜘蛛池模板: 四虎永久免费影院| 老色鬼久久亚洲AV综合| 成全视成人免费观看在线看| 亚洲av无码一区二区三区网站| 国产成人福利免费视频| 边摸边脱吃奶边高潮视频免费| 亚洲午夜国产精品无码| 91嫩草国产在线观看免费| 黄色免费网站在线看| 亚洲AV人无码综合在线观看| 永久免费毛片在线播放| 两个人看的www免费视频中文| 亚洲国产精品乱码在线观看97| 亚洲AV日韩精品一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区| 国产又黄又爽又猛的免费视频播放| 最好免费观看高清在线| 亚洲国产AV无码一区二区三区 | 中文字幕乱码免费视频| 一本久久A久久免费精品不卡| 亚洲国产精品成人久久久| 亚洲天堂在线视频| 岛国片在线免费观看| 久久午夜无码免费| 少妇亚洲免费精品| 天天爽亚洲中文字幕| 亚洲精品无码久久久久去q| 永久免费视频v片www| 在线a免费观看最新网站| 毛片基地看看成人免费| 亚洲AV无码成人网站在线观看| 久久久国产精品亚洲一区| 亚洲男人的天堂在线va拉文| 成年女人毛片免费播放人| 久久国产免费观看精品3| 亚洲一区二区三区免费| 亚洲AV成人无码网站| 亚洲午夜一区二区三区| 4480yy私人影院亚洲| 亚洲AV永久纯肉无码精品动漫| 亚洲精品一级无码鲁丝片 |