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

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

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

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯(lián)系。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
    測試任何可能的錯誤。單元測試不是用來證明您是對的,而是為了證明您沒有錯

    2、單元測試代碼和被測試代碼使用一樣的包,不同的目錄。

    --junit4.0使用注意說明;

    3、測試方法必須按照規(guī)范書寫

       1. 測試方法必須使用注解 org.junit.Test 修飾。
       2. 測試方法必須使用 public void 修飾,而且不能帶有任何參數(shù)。
       @Test public void wordFormat4DBegin(){
           String target = "EmployeeInfo";
           String result = WordDealUtil.wordFormat4DB(target);
          
           assertEquals("employee_info", result);
       }

    4、同一測試類中的所有測試方法都可以共用它來初始化 Fixture 和注銷 Fixture。和編寫 JUnit 測試方法一樣,公共 Fixture 的設置也很簡單,您只需要:

       1. 使用注解 org,junit.Before 修飾用于初始化 Fixture 的方法。
       2. 使用注解 org.junit.After 修飾用于注銷 Fixture 的方法。
       3. 保證這兩種方法都使用 public void 修飾,而且不能帶有任何參數(shù)。
           //初始化Fixture方法
           @Before public void init(){……}
           //注銷Fixture方法
           @After public void destroy(){……}
        引入了類級別的 Fixture 設置方法,編寫規(guī)范如下:
        1. 使用注解 org,junit.BeforeClass 修飾用于初始化 Fixture 的方法。
        2. 使用注解 org.junit.AfterClass 修飾用于注銷 Fixture 的方法。
        3. 保證這兩種方法都使用 public static void 修飾,而且不能帶有任何參數(shù)
           //類級別Fixture初始化方法
           @BeforeClass public static void dbInit(){……}
           //類級別Fixture注銷方法
           @AfterClass public static void dbClose(){……}
        類級別的 Fixture 僅會在測試類中所有測試方法執(zhí)行之前執(zhí)行初始化,并在全部測試方法測試完畢之后執(zhí)行注銷方法。

    5、注解 org.junit.Test 中有兩個非常有用的參數(shù):expected 和 timeout。

       1、參數(shù) expected 代表測試方法期望拋出指定的異常,如果運行測試并沒有拋出這個異常,則 JUnit 會認為這個測試沒有通過。
           @Test(expected=UnsupportedDBVersionException.class)
           public void unsupportedDBCheck(){
               ……
           }
       2、參數(shù)timeout,指定被測試方法被允許運行的最長時間應該是多少,如果測試方法運行時間超過了指定的毫秒數(shù),則JUnit認為測試失敗。
           @Test(timeout=1000)
           public void selfXMLReader(){
               ……
           }

    6、org.junit.Ignore 用于暫時忽略某個測試方法,因為有時候由于測試環(huán)境受限,并不能保證每一個測試方法都能正確運行。

           @ Ignore(“db is down”)
           @Test(expected=UnsupportedDBVersionException.class)
           public void unsupportedDBCheck(){
               ……
           }

    7、新概念出現(xiàn)了——測試運行器

    JUnit 中所有的測試方法都是由它負責執(zhí)行的。JUnit 為單元測試提供了默認的測試運行器,但 JUnit 并沒有限制您必須使用默認的運行器。相反,您不僅可以定制自己的運行器(所有的運行器都繼承自 org.junit.runner.Runner),而且還可以為每一個測試類指定使用某個具體的運行器。指定方法也很簡單,使用注解 org.junit.runner.RunWith 在測試類上顯式的聲明要使用的運行器即可:

           @RunWith(CustomTestRunner.class)
           public class TestWordDealUtil {
               ……
           }

    8、

    在實際項目中,隨著項目進度的開展,單元測試類會越來越多,可是直到現(xiàn)在我們還只會一個一個的單獨運行測試類,這在實際項目實踐中肯定是不可行的。為了解 決這個問題,JUnit 提供了一種批量運行測試類的方法,叫做測試套件。這樣,每次需要驗證系統(tǒng)功能正確性時,只執(zhí)行一個或幾個測試套件便可以了。測試套件的寫法非常簡單,您只 需要遵循以下規(guī)則:
       1. 創(chuàng)建一個空類作為測試套件的入口。
       2. 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修飾這個空類。
       3. 將 org.junit.runners.Suite 作為參數(shù)傳入注解 RunWith,以提示 JUnit 為此類使用套件運行器執(zhí)行。
       4. 將需要放入此測試套件的測試類組成數(shù)組作為注解 SuiteClasses 的參數(shù)。
       5. 保證這個空類使用 public 修飾,而且存在公開的不帶有任何參數(shù)的構造函數(shù)。
           package com.ai92.cooljunit;
           import org.junit.runner.RunWith;
           import org.junit.runners.Suite;
           ……
           /**
           * 批量測試 工具包 中測試類
           * @author Ai92
           */
           @RunWith(Suite.class)
           @Suite.SuiteClasses({TestWordDealUtil.class,xxx.class})
           public class RunAllUtilTestsSuite {
           }
    上例代碼中,我們將前文提到的測試類 TestWordDealUtil 放入了測試套件 RunAllUtilTestsSuite 中,在 Eclipse 中運行測試套件,可以看到測試類 TestWordDealUtil 被調用執(zhí)行了。測試套件中不僅可以包含基本的測試類,而且可以包含其它的測試套件,這樣可以很方便的分層管理不同模塊的單元測試代碼。但是,您一定要保證 測試套件之間沒有循環(huán)包含關系,否則無盡的循環(huán)就會出現(xiàn)在您的面前……

    9、參數(shù)化測試

    為了保證單元測試的嚴謹性,我們模擬了不同類型的字符串來測試方法的處理能力,為此我們編寫大量的單元測試方法。可是這些測試方法都是大同小異:代碼結構 都是相同的,不同的僅僅是測試數(shù)據和期望值。有沒有更好的方法將測試方法中相同的代碼結構提取出來,提高代碼的重用度,減少復制粘貼代碼的煩惱?在以前的 JUnit 版本上,并沒有好的解決方法,而現(xiàn)在您可以使用 JUnit 提供的參數(shù)化測試方式應對這個問題。
    參數(shù)化測試的編寫稍微有點麻煩(當然這是相對于 JUnit 中其它特性而言):
       1. 為準備使用參數(shù)化測試的測試類指定特殊的運行器 org.junit.runners.Parameterized。
       2. 為測試類聲明幾個變量,分別用于存放期望值和測試所用數(shù)據。
       3. 為測試類聲明一個使用注解 org.junit.runners.Parameterized.Parameters 修飾的,返回值為 java.util.Collection 的公共靜態(tài)方法,并在此方法中初始化所有需要測試的參數(shù)對。
       4. 為測試類聲明一個帶有參數(shù)的公共構造函數(shù),并在其中為第二個環(huán)節(jié)中聲明的幾個變量賦值。
       5. 編寫測試方法,使用定義的變量作為參數(shù)進行測試。
    我們按照這個標準,重新改造一番我們的單元測試代碼:
           @RunWith(Parameterized.class)
           public class TestWordDealUtilWithParam {

                   private String expected;
      
                   private String target;
      
                   @Parameters
                   public static Collection words(){
                           return Arrays.asList(new Object[][]{
                       {"employee_info", "employeeInfo"},       //測試一般的處理情況
                       {null, null},                           //測試 null 時的處理情況
                       {"", ""},                               //測試空字符串時的處理情況
                       {"employee_info", "EmployeeInfo"},       //測試當首字母大寫時的情況
                       {"employee_info_a", "employeeInfoA"},   //測試當尾字母為大寫時的情況
                       {"employee_a_info", "employeeAInfo"}   //測試多個相連字母大寫時的情況
                           });
                   }
      
                  /**
                  * 參數(shù)化測試必須的構造函數(shù)
                  * @param expected   期望的測試結果,對應參數(shù)集中的第一個參數(shù)
                  * @param target   測試數(shù)據,對應參數(shù)集中的第二個參數(shù)
                  */
                   public TestWordDealUtilWithParam(String expected , String target){
                       this.expected = expected;
                       this.target = target;
                   }
      
                  /**
                  * 測試將 Java 對象名稱到數(shù)據庫名稱的轉換
                  */
                   @Test public void wordFormat4DB(){
                       assertEquals(expected, WordDealUtil.wordFormat4DB(target));
                   }
           }

    10、junit3兼容junit4可以在測試類中加入

           public static junit.framework.Test suite() {
              return new JUnit4TestAdapter(AssertionTest.class);  
           }

    11、JUnit 4 為比較數(shù)組添加了兩個 assert() 方法:

           public static void assertEquals(Object[] expected, Object[] actual)
           public static void assertEquals(String message, Object[] expected, Object[] actual)
    這兩個方法以最直接的方式比較數(shù)組:如果數(shù)組長度相同,且每個對應的元素相同,則兩個數(shù)組相等,否則不相等。數(shù)組為空的情況也作了考慮。

    12、需要補充的地方

    JUnit 4 基本上是一個新框架,而不是舊框架的升級版本。JUnit 3 開發(fā)人員可能會找到一些原來沒有的特性。
    最明顯的刪節(jié)就是 GUI 測試運行程序。如果您想在測試通過時看到賞心悅目的綠色波浪線,或者在測試失敗時看到令人焦慮的紅色波浪線,那么您需要一個具有集成 JUnit支持的 IDE,比如 Eclipse。不管是 Swing 還是 AWT 測試運行程序都不會被升級或捆綁到 JUnit 4 中。
    下一個驚喜是,失敗(assert 方法檢測到的預期的錯誤)與錯誤(異常指出的非預期的錯誤)之間不再有任何差別。盡管JUnit3測試運行程序仍然可以區(qū)別這些情況,而JUnit4運行程序將不再能夠區(qū)分。
    最后,JUnit 4沒有 suite()方法,這些方法用于從多個測試類構建一個測試套件。相反,可變長參數(shù)列表用于允許將不確定數(shù)量的測試傳遞給測試運行程序。
    posted on 2009-03-06 11:30 rogerfan 閱讀(841) 評論(0)  編輯  收藏 所屬分類: 【Java知識】【開源技術】
    主站蜘蛛池模板: 美女视频黄的全免费视频| 91情国产l精品国产亚洲区| 无码高潮少妇毛多水多水免费| 一区二区三区精品高清视频免费在线播放| 亚洲色av性色在线观无码| 精品亚洲成α人无码成α在线观看| 四虎国产精品免费久久| 久久九九AV免费精品| 久草免费福利在线| 深夜a级毛片免费无码| 亚洲永久网址在线观看| 4444亚洲国产成人精品| 亚洲处破女AV日韩精品| 久久精品国产亚洲7777| 免费观看午夜在线欧差毛片| 国产精品免费观看久久| 一二三四免费观看在线电影| 蜜臀98精品国产免费观看| 国产在线精品免费aaa片| 两个人看的www免费视频中文| 日韩在线一区二区三区免费视频| 亚洲精品乱码久久久久久蜜桃图片 | 国产精品成人四虎免费视频| 99精品国产免费久久久久久下载| 免费人成视频在线观看网站| 日本道免费精品一区二区| 中文字幕免费在线看| 羞羞视频免费网站在线看| 国产精品免费视频观看拍拍 | 国产女高清在线看免费观看| 国产精品视频永久免费播放| 最新中文字幕电影免费观看| 成人免费视频网址| 免费特级黄毛片在线成人观看| 无码高潮少妇毛多水多水免费| 香蕉高清免费永久在线视频| 日韩一级免费视频| www.亚洲精品| 亚洲中文字幕无码爆乳av中文| 怡红院亚洲怡红院首页| 久久精品国产亚洲香蕉|