package com.ai92.cooljunit; import org.junit.runner.RunWith; import org.junit.runners.Suite; …… /** * 批量測試 工具包 中測試類 * @author Ai92 */ @RunWith(Suite.class) @Suite.SuiteClasses({TestWordDealUtil.class}) public class RunAllUtilTestsSuite { }
上例代碼中,我們將前文提到的測試類 TestWordDealUtil 放入了測試套件 RunAllUtilTestsSuite 中,在 Eclipse 中運行測試套件,可以看到測試類 TestWordDealUtil 被調用執行了。測試套件中不僅可以包含基本的測試類,而且可以包含其它的測試套件,這樣可以很方便的分層管理不同模塊的單元測試代碼。但是,您一定要保證測試套件之間沒有循環包含關系,否則無盡的循環就會出現在您的面前……。
參數化測試
回顧一下我們在小節“JUnit 初體驗” 中舉的實例。為了保證單元測試的嚴謹性,我們模擬了不同類型的字符串來測試方法的處理能力,為此我們編寫大量的單元測試方法?墒沁@些測試方法都是大同小異:代碼結構都是相同的,不同的僅僅是測試數據和期望值。有沒有更好的方法將測試方法中相同的代碼結構提取出來,提高代碼的重用度,減少復制粘貼代碼的煩惱?在以前的 JUnit 版本上,并沒有好的解決方法,而現在您可以使用 JUnit 提供的參數化測試方式應對這個問題。
參數化測試的編寫稍微有點麻煩(當然這是相對于 JUnit 中其它特性而言):
1.
為準備使用參數化測試的測試類指定特殊的運行器 org.junit.runners.Parameterized。
2.
為測試類聲明幾個變量,分別用于存放期望值和測試所用數據。
3.
為測試類聲明一個使用注解 org.junit.runners.Parameterized.Parameters 修飾的,返回值為 java.util.Collection 的公共靜態方法,并在此方法中初始化所有需要測試的參數對。
4.
為測試類聲明一個帶有參數的公共構造函數,并在其中為第二個環節中聲明的幾個變量賦值。
5.
編寫測試方法,使用定義的變量作為參數進行測試。
我們按照這個標準,重新改造一番我們的單元測試代碼:
package com.ai92.cooljunit; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @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)); } }
文章來源于領測軟件測試網 http://www.kjueaiud.com/