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

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

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

    隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
    數據加載中……

    單元測試-入門篇

    前面的一篇文章(單元測試-理論篇)討論了什么是單元測試、單元測試的優點并列舉了很多不寫單元測試的借口。如果你同意我們的觀點,認同單元測試確實是軟件開發中不可缺少的過程,那么我們就開始單元測試之旅吧!


    一個比較最大值的函數
      我們首先引入一個比較最大值的函數。我們傳入一個類型為int的數組參數,它將返回最大值的那個元素。代碼如下:
    public class Largest {
     public static int largest(int[] datas){
      int max = 0;
      
      for(int i = 0 ; i < datas.length ; i++){
       if(max < datas[i]){
        max = datas[i];
       }
      }
      return max;
     }
    }
      可是,如何寫我們的測試代碼呢?


    直接在Largest類中添加一個main方法,要么重新寫一個可運行的類來測試Largest。這樣的測試,同樣給我們帶來了很大的挑戰:
    1、 驗證困難。如何去驗證代碼的行為和我們的期望一致呢?使用很多的if…else再加上==或equals()來判斷?對異常的情況又如何處理呢?混亂的驗證,很容易給我們的測試代碼帶來BUG,讓我們對自己的測試不夠自信。
    2、 測試類無法管理。我們如何直觀的得到測試運行成功或失敗的消息?用原始的System.out.println()嗎?我們能一次運行多個單元測試嗎?如果前面的測試運行出現異常,后面的測試還能繼續運行嗎?如果測試類很多,上百個甚至更多,我們能方便的由控制臺輸出測試結果嗎?
    3、 無法統計測試代碼覆蓋情況。缺少統一的測試代碼編寫規范和約定,可讀性和維護性差。
    不過,面對這些挑戰不用沮喪。單元測試框架已經幫我們解決了這些問題,它提供了很多測試的基礎設施,讓我們能把更多的經歷投入到測試代碼的編寫中來。


    JUnit
    JUnit最初是由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驅之一)編寫的,它是一個開源的Java測試框架,用于編寫和運行可重復的測試。


    下面我們逐步介紹如何對Largest類測試:
    一、 JUnit的安裝。如果你使用的開發工具是Eclipse,不用做任何安裝,它已經提供了Junit的支持。否則,你需要去http://www.junit.org/ 下載Junit安裝包。安裝非常簡單,只要將junit.jar包設置到ClassPath中,讓你的Java代碼能夠找到它就可以了。
    二、 編寫測試代碼。代碼如下:
        public class LargestTest extends TestCase {
      public void testLargest(){
       int[] datas = {7,8,9};
       assertEquals(9,Largest.largest(datas));
      }
    }
    說明:
    1、 測試類一般要繼承抽象類TestCase。它實現了各種測試方法,并提供了一個測試過程的架構。
    2、 測試代碼通過斷言(Assert)來判斷某個被測試函數是否正常工作。JUnit提供了很多斷言函數,用來確定:某個條件是否為真;兩個數據是否相等,或者不等,或者其它的一些情況。
    3、 測試方法名以“test”開頭,這樣JUnit框架會自動發現這是一個測試方法。

    三、 運行測試類。
       運行測試成功。

    我們的單元測試這樣就算完成了嗎?不,上面的測試只能算是一次驗證而已。我們給的數據中,最大值9是數組的最后一個元素,如果9是第一個元素它還正確嗎?如果數據是負數呢?等等。我們的求最大值函數有著很多的邊界情況需要單元測試來驗證。
       因此,我們在寫單元測試之前,一定要對測試做一個周全的計劃,預先設置好要測試的內容,可能發生錯誤的邊界條件。
    下面是對Largest做的測試計劃:
    1、 數組元素的位置是否對最大值產生影響?
    l [7,8,9] – 9
    l [7,9,8] – 9
    l [9,8,7] – 9
    2、 如果有兩個相等的最大值,會出現什么情況呢?
    l [7,9,8,9] – 9
    3、如果數組中只有一個元素,結果會怎么樣?
    l [1] - 1
    4、 如果元素都是負數呢?
    l [-7,-8,-9] - -7
    完整的測試代碼應該如下:
    public class LargestTest extends TestCase {
     
     public void testSimple(){
      assertEquals(9,Largest.largest(new int[]{7,8,9}));
     }
     public void testOrder(){
      assertEquals(9,Largest.largest(new int[]{7,9,8}));
      assertEquals(9,Largest.largest(new int[]{9,8,7}));
     }
     public void testDups(){
      assertEquals(9,Largest.largest(new int[]{7,9,8,9}));
     }
     public void testOne(){
      assertEquals(1,Largest.largest(new int[]{1}));
     }
     public void testNegative(){
       assertEquals(-7,Largest.largest(new int[]{-7,-8,-9}));
     }
    }
    當然,你可以寫完一個測試方法就立即來運行它。這次并沒有那么幸運了,在運行最后一個測試方法testNegative()時出現了錯誤:
    junit.framework.AssertionFailedError: expected:<-7> but was:<0>
     at test.junit.LargestTest.testNegative(LargestTest.java:24)
    細心的你,也許在一開始就發現了Largest的這個Bug。原來我們的字段max初始化為0是不對的,應該改為Integer.MIN_VALUE。
    由此我們可以想到,使用單元測試確實可以盡早的發現隱藏的BUG,上一篇我們也說過,越早發現BUG就能節省更多的時間,降低更多的風險。
    這是,我們的單元測試已經完美結束了嗎?呵呵,也許你會想到,如果在largest()方法中傳入數組為空,又會怎么樣呢?這個問題留給我們的讀者思考吧。


    寫到這里,算是入門結束了吧!關于JUnit的詳細介紹,網上有非常多的文章,去google你可以找到一大堆。下面我提供幾個不錯的單元測試網站,希望能對你有所幫助:
    51Testing-無憂軟件測試網:http://www.51testing.com/
    測試時代:http://www.testage.net/
    UML軟件工程組織-軟件測試:http://www.uml.org.cn/Test/test.asp
    測試管理中心:http://www.testmanager.com.cn/
    軟件工程專家網:http://www.51cmm.com/
    開放軟件測試研究:http://www.opentest.net/

    posted on 2005-04-11 14:46 閱讀(229) 評論(0)  編輯  收藏 所屬分類: 測試

    主站蜘蛛池模板: 亚洲日本va中文字幕久久| 4399影视免费观看高清直播| 国产亚洲高清在线精品不卡| 亚洲乱码无人区卡1卡2卡3| 亚洲av永久无码天堂网| 麻豆精品成人免费国产片| 扒开双腿猛进入爽爽免费视频 | 男女交性永久免费视频播放| www.亚洲色图.com| 亚洲AV无码成人精品区蜜桃 | 黄色网页免费观看| 免费女人高潮流视频在线观看| 曰批全过程免费视频在线观看| 亚洲精品岛国片在线观看| 亚洲欧洲国产成人精品| 黑人粗长大战亚洲女2021国产精品成人免费视频 | a毛片在线看片免费| 手机在线免费视频| 亚洲av无码专区首页| 国产成人毛片亚洲精品| 亚洲中文字幕一区精品自拍| 暖暖日本免费中文字幕| 亚洲日本va午夜中文字幕久久| 中文字幕av无码不卡免费| 日韩成人在线免费视频| 亚洲精品国产福利在线观看| CAOPORN国产精品免费视频| 午夜两性色视频免费网站| 免费一区二区三区在线视频| 欧美三级在线电影免费| 亚洲精品一区二区三区四区乱码 | 亚洲成a人片77777kkkk| 国产男女爽爽爽免费视频| 亚洲AV日韩AV永久无码免下载| 成人福利在线观看免费视频| 国产男女猛烈无遮挡免费视频| 亚洲男人天堂2022| 蜜桃视频在线观看免费网址入口| 337P日本欧洲亚洲大胆艺术图| 亚洲日本乱码在线观看| 成人毛片免费在线观看|