您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
單元測(cè)試?yán)鱆Unit
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/3/29 14:59:08 ] 推薦標(biāo)簽:

    再次運(yùn)行測(cè)試。很遺憾,JUnit 運(yùn)行界面提示我們有兩個(gè)測(cè)試情況未通過測(cè)試(圖4)——當(dāng)首字母大寫時(shí)得到的處理結(jié)果與預(yù)期的有偏差,造成測(cè)試失敗(failure);而當(dāng)測(cè)試對(duì) null 的處理結(jié)果時(shí),則直接拋出了異常——測(cè)試錯(cuò)誤(error)。顯然,被測(cè)試代碼中并沒有對(duì)首字母大寫和 null 這兩種特殊情況進(jìn)行處理,修改如下:

Java代碼 復(fù)制代碼

    //修改后的方法wordFormat4DB  
    /** 
         * 將Java對(duì)象名稱(每個(gè)單詞的頭字母大寫)按照 
         * 數(shù)據(jù)庫命名的習(xí)慣進(jìn)行格式化 
         * 格式化后的數(shù)據(jù)為小寫字母,并且使用下劃線分割命名單詞 
         * 如果參數(shù)name為null,則返回null 
         *  
         * 例如:employeeInfo 經(jīng)過格式化之后變?yōu)?employee_info 
         *  
         * @param name Java對(duì)象名稱 
         */ 
        public static String wordFormat4DB(String name){  
              
            if(name == null){  
                return null;  
            }  
              
            Pattern p = Pattern.compile("[A-Z]");  
            Matcher m = p.matcher(name);  
            StringBuffer sb = new StringBuffer();  
              
            while(m.find()){  
                if(m.start() != 0)  
                    m.appendReplacement(sb, ("_"+m.group()).toLowerCase());  
            }  
            return m.appendTail(sb).toString().toLowerCase();  
        } 

 圖4 JUnit 運(yùn)行失敗界面

    JUnit 將測(cè)試失敗的情況分為兩種:failure 和 error。Failure 一般由單元測(cè)試使用的斷言方法判斷失敗引起,它表示在測(cè)試點(diǎn)發(fā)現(xiàn)了問題;而 error 則是由代碼異常引起,這是測(cè)試目的之外的發(fā)現(xiàn),它可能產(chǎn)生于測(cè)試代碼本身的錯(cuò)誤(測(cè)試代碼也是代碼,同樣無法保證完全沒有缺陷),也可能是被測(cè)試代碼中的一個(gè)隱藏的bug。

請(qǐng)牢記!

    請(qǐng)牢記這一條 JUnit 佳實(shí)踐:測(cè)試任何可能的錯(cuò)誤。單元測(cè)試不是用來證明您是對(duì)的,而是為了證明您沒有錯(cuò)。
 
    啊哈,再次運(yùn)行測(cè)試,綠條又重現(xiàn)眼前。通過對(duì) WordDealUtil.wordFormat4DB 比較全面的單元測(cè)試,現(xiàn)在的代碼已經(jīng)比較穩(wěn)定,可以作為 API 的一部分提供給其它模塊使用了。

    不知不覺中我們已經(jīng)使用 JUnit 漂亮的完成了一次單元測(cè)試。可以體會(huì)到 JUnit 是多么輕量級(jí),多么簡單,根本不需要花心思去研究,這可以把更多的注意力放在更有意義的事情上——編寫完整全面的單元測(cè)試。

JUnit 深入

    當(dāng)然,JUnit 提供的功能決不僅僅如此簡單,在接下來的內(nèi)容中,我們會(huì)看到 JUnit 中很多有用的特性,掌握它們對(duì)您靈活的編寫單元測(cè)試代碼非常有幫助。

Fixture

    何謂 Fixture?它是指在執(zhí)行一個(gè)或者多個(gè)測(cè)試方法時(shí)需要的一系列公共資源或者數(shù)據(jù),例如測(cè)試環(huán)境,測(cè)試數(shù)據(jù)等等。在編寫單元測(cè)試的過程中,您會(huì)發(fā)現(xiàn)在大部分的測(cè)試方法在進(jìn)行真正的測(cè)試之前都需要做大量的鋪墊——為設(shè)計(jì)準(zhǔn)備 Fixture 而忙碌。這些鋪墊過程占據(jù)的代碼往往比真正測(cè)試的代碼多得多,而且這個(gè)比率隨著測(cè)試的復(fù)雜程度的增加而遞增。當(dāng)多個(gè)測(cè)試方法都需要做同樣的鋪墊時(shí),重復(fù)代碼的“壞味道”便在測(cè)試代碼中彌漫開來。這股“壞味道”會(huì)弄臟您的代碼,還會(huì)因?yàn)槭韬鲈斐慑e(cuò)誤,應(yīng)該使用一些手段來根除它。

    JUnit 專門提供了設(shè)置公共 Fixture 的方法,同一測(cè)試類中的所有測(cè)試方法都可以共用它來初始化 Fixture 和注銷 Fixture。和編寫 JUnit 測(cè)試方法一樣,公共 Fixture 的設(shè)置也很簡單,您只需要:

使用注解 org,junit.Before 修飾用于初始化 Fixture 的方法。
使用注解 org.junit.After 修飾用于注銷 Fixture 的方法。
保證這兩種方法都使用 public void 修飾,而且不能帶有任何參數(shù)。
遵循上面的三條原則,編寫出的代碼大體是這個(gè)樣子:

引用
//初始化Fixture方法
@Before public void init(){……}

//注銷Fixture方法
@After public void destroy(){……}

 

    這樣,在每一個(gè)測(cè)試方法執(zhí)行之前,JUnit 會(huì)保證 init 方法已經(jīng)提前初始化測(cè)試環(huán)境,而當(dāng)此測(cè)試方法執(zhí)行完畢之后,JUnit 又會(huì)調(diào)用 destroy 方法注銷測(cè)試環(huán)境。注意是每一個(gè)測(cè)試方法的執(zhí)行都會(huì)觸發(fā)對(duì)公共 Fixture 的設(shè)置,也是說使用注解 Before 或者 After 修飾的公共 Fixture 設(shè)置方法是方法級(jí)別的(圖5)。這樣便可以保證各個(gè)獨(dú)立的測(cè)試之間互不干擾,以免其它測(cè)試代碼修改測(cè)試環(huán)境或者測(cè)試數(shù)據(jù)影響到其它測(cè)試代碼的準(zhǔn)確性。

圖5 方法級(jí)別 Fixture 執(zhí)行示意圖

上一頁123456下一頁
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd