Junit4的使用說明


之前在開發中一直在使用Junit3,身邊很多朋友都說Junit4很好用,今天終於有空在自己的配置環境中加入了Junit4,並根據這下面這篇文章簡單學習了一會。其中發現Junit4並不是在Junit3演化而來,它是一個全新的框架,不過它很容易上手。在這裏與新手共勉。

 
http://school.itzcn.com/special-spid-50.html

1、測試任何可能的錯誤。單元測試不是用來證明您是對的,而是爲了證明您沒有錯。

2、單元測試代碼和被測試代碼使用一樣的包,不同的目錄。
--junit4.0使用注意說明;

3、測試方法必須按照規範書寫
   1.  測試方法必須使用註解 org.junit.Test 修飾。
   2. 測試方法必須使用 public void 修飾,而且不能帶有任何參數。
    @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 修飾,而且不能帶有任何參數。
        //初始化Fixture方法
        @Before public void init(){……}
        //註銷Fixture方法
        @After public void destroy(){……}
    引入了類級別的 Fixture 設置方法,編寫規範如下:
       1. 使用註解 org,junit.BeforeClass 修飾用於初始化 Fixture 的方法。
       2. 使用註解 org.junit.AfterClass 修飾用於註銷 Fixture 的方法。
       3. 保證這兩種方法都使用 public static void 修飾,而且不能帶有任何參數
        //類級別Fixture初始化方法
        @BeforeClass public static void dbInit(){……}
        //類級別Fixture註銷方法
        @AfterClass public static void dbClose(){……}
    類級別的 Fixture 僅會在測試類中所有測試方法執行之前執行初始化,並在全部測試方法測試完畢之後執行註銷方法。

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

6、org.junit.Ignore 用於暫時忽略某個測試方法,因爲有時候由於測試環境受限,並不能保證每一個測試方法都能正確運行。
        @ Ignore(“db is down”)
        @Test(expected=UnsupportedDBVersionException.class)
        public void unsupportedDBCheck(){
            ……
        }

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

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

8、
在實際項目中,隨着項目進度的開展,單元測試類會越來越多,可是直到現在我們還只會一個一個的單獨運行測試類,這在實際項目實踐中肯定是不可行的。爲了解決這個問題,JUnit 提供了一種批量運行測試類的方法,叫做測試套件。這樣,每次需要驗證系統功能正確性時,只執行一個或幾個測試套件便可以了。測試套件的寫法非常簡單,您只需要遵循以下規則:
   1. 創建一個空類作爲測試套件的入口。
   2. 使用註解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修飾這個空類。
   3. 將 org.junit.runners.Suite 作爲參數傳入註解 RunWith,以提示 JUnit 爲此類使用套件運行器執行。
   4. 將需要放入此測試套件的測試類組成數組作爲註解 SuiteClasses 的參數。
   5. 保證這個空類使用 public 修飾,而且存在公開的不帶有任何參數的構造函數。
        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 被調用執行了。測試套件中不僅可以包含基本的測試類,而且可以包含其它的測試套件,這樣可以很方便的分層管理不同模塊的單元測試代碼。但是,您一定要保證測試套件之間沒有循環包含關係,否則無盡的循環就會出現在您的面前……

9、參數化測試
爲了保證單元測試的嚴謹性,我們模擬了不同類型的字符串來測試方法的處理能力,爲此我們編寫大量的單元測試方法。可是這些測試方法都是大同小異:代碼結構都是相同的,不同的僅僅是測試數據和期望值。有沒有更好的方法將測試方法中相同的代碼結構提取出來,提高代碼的重用度,減少複製粘貼代碼的煩惱?在以前的 JUnit 版本上,並沒有好的解決方法,而現在您可以使用 JUnit 提供的參數化測試方式應對這個問題。
參數化測試的編寫稍微有點麻煩(當然這是相對於 JUnit 中其它特性而言):
   1. 爲準備使用參數化測試的測試類指定特殊的運行器 org.junit.runners.Parameterized。
   2. 爲測試類聲明幾個變量,分別用於存放期望值和測試所用數據。
   3. 爲測試類聲明一個使用註解 org.junit.runners.Parameterized.Parameters 修飾的,返回值爲 java.util.Collection 的公共靜態方法,並在此方法中初始化所有需要測試的參數對。
   4. 爲測試類聲明一個帶有參數的公共構造函數,並在其中爲第二個環節中聲明的幾個變量賦值。
   5. 編寫測試方法,使用定義的變量作爲參數進行測試。
我們按照這個標準,重新改造一番我們的單元測試代碼:
        @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"}    //測試多個相連字母大寫時的情況
                        });
                }
   
                 /**
                 * 參數化測試必須的構造函數
                 * @param expected    期望的測試結果,對應參數集中的第一個參數
                 * @param target    測試數據,對應參數集中的第二個參數
                 */
                public TestWordDealUtilWithParam(String expected , String target){
                    this.expected = expected;
                    this.target = target;
                }
   
                 /**
                 * 測試將 Java 對象名稱到數據庫名稱的轉換
                 */
                @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 爲比較數組添加了兩個 assert() 方法:
        public static void assertEquals(Object[] expected, Object[] actual)
        public static void assertEquals(String message, Object[] expected, Object[] actual)
這兩個方法以最直接的方式比較數組:如果數組長度相同,且每個對應的元素相同,則兩個數組相等,否則不相等。數組爲空的情況也作了考慮。


12、需要補充的地方
JUnit 4 基本上是一個新框架,而不是舊框架的升級版本。JUnit 3 開發人員可能會找到一些原來沒有的特性。
最明顯的刪節就是 GUI 測試運行程序。如果您想在測試通過時看到賞心悅目的綠色波浪線,或者在測試失敗時看到令人焦慮的紅色波浪線,那麼您需要一個具有集成 JUnit支持的 IDE,比如 Eclipse。不管是 Swing 還是 AWT 測試運行程序都不會被升級或捆綁到 JUnit 4 中。
下一個驚喜是,失敗(assert 方法檢測到的預期的錯誤)與錯誤(異常指出的非預期的錯誤)之間不再有任何差別。儘管JUnit3測試運行程序仍然可以區別這些情況,而JUnit4運行程序將不再能夠區分。
最後,JUnit 4沒有 suite()方法,這些方法用於從多個測試類構建一個測試套件。相反,可變長參數列表用於允許將不確定數量的測試傳遞給測試運行程序。

 

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