日前,爲測試一個傳入多參數的方法,使用了junit進行單元測試,因爲接觸單元測試不久,不少不熟悉的地方,弄了挺久的。java
這裏試用了兩種方法進行測試,因爲是新手,不少須要改善學習。數組
示例方法:函數
public void add(Long a,Long b,String c,String d,Date date1,Date 2){...}
假設a和b的取值範圍爲{-1,0,1,2},c和d的取值爲{null,"123","sdfsdf"},data1和data2的取值爲{null,new Data(),new Date(new Date.getTime()-24*3600),new Date(new Date.getTime()+24*3600)}單元測試
爲了覆蓋每一種狀況須要每個參數取一種可能組合,共有4*4*3*3*4*4=2304種可能,須要遍歷 學習
一、參數化測試 測試
JUnit參數化測試的五個步驟:
(1)爲準備使用參數化測試的測試類指定特殊的運行器 org.junit.runners.Parameterized。
(2)爲測試類聲明幾個變量,分別用於存放指望值和測試所用數據。
(3)爲測試類聲明一個帶有參數的公共構造函數,並在其中爲第二個環節中聲明的幾個變量賦值。
(4)爲測試類聲明一個使用註解 org.junit.runners.Parameterized.Parameters 修飾的,返回值爲 java.util.Collection 的公共靜態方法,
並在此方法中初始化全部須要測試的參數對。
(5)編寫測試方法,使用定義的變量做爲參數進行測試。 ui
import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; 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 parTest { Long a; Long b; String c; String d; Date date1; Date date2; // 帶參數的構造函數 public parTest(Long a, Long b, String c, String d, Date date1, Date date2) { super(); this.a = a; this.b = b; this.c = c; this.d = d; this.date1 = date1; this.date2 = date2; } @Parameters public static Collection<?> prepareData() { return Ptest.filled(); } @Test public void test() { // 調用方法 add(a, b, c, d, date1, date2); } }
參數組合: this
import java.util.ArrayList; import java.util.Date; import java.util.List; public class Ptest { public static void main(String[] args) { filled(); } public static List<Object[]> filled() { Long a[] = { -1l, 0l, 1l, 2l }; Long b[] = { -1l, 0l, 1l, 2l }; String[] c = { null, "123", "sfsfdsf" }; String[] d = { null, "123", "sfsfdsf" }; Date[] date1 = { null, new Date(), new Date(new Date().getTime() - 24 * 3600) }; Date[] date2 = { null, new Date(), new Date(new Date().getTime() + 24 * 3600) }; List<Object[]> resultList = diff(a, b, c, d, date1, date2); return resultList; } public static List<Object[]> diff(Object[]... a) { List<List<Object>> f = getFirstList(a[0]); for (int i = 1; i < a.length; i++) { f = diff(f, a[i]); } List<Object[]> resultList = new ArrayList<Object[]>(); for (int i = 0; i < f.size(); i++) { Object[] o = new Object[f.get(i).size()]; for (int j = 0; j < f.get(i).size(); j++) { o[j] = f.get(i).get(j); } resultList.add(o); } return resultList; } public static List<List<Object>> getFirstList(Object[] first) { List<List<Object>> result = new ArrayList<List<Object>>(); for (Object i : first) { List<Object> b = new ArrayList<Object>(); b.add(i); result.add(b); } return result; } public static List<List<Object>> diff(List<List<Object>> array, Object[] a) { List<List<Object>> result = new ArrayList<List<Object>>(); for (List<Object> as : array) { for (Object i : a) { List<Object> b = new ArrayList<Object>(); b.addAll(as); b.add(i); result.add(b); } } return result; } }
二、打包傳參 spa
package Suite; import junit.framework.JUnit4TestAdapter; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class TestCaseSuit { public static Test suite() { TestSuite suite = new TestSuite();//建立一個測試套件 suite.addTest(new JUnit4TestAdapter(TestParam.class));// 增長測試類的class對象 for (int i = 0; i < 10; i++) {//測試次數 TestParam tp = new TestParam("add");//構造時指定測試方法,執行一次默認參數的測試 tp.setParam(a, b, c, d, date1, date2);//測試入參 suite.addTest(tp);//執行測試入參的測試 } return suite; } }
package Suite; import java.util.ArrayList; import java.util.Date; import org.junit.Test; import junit.framework.TestCase; public class TestParam extends TestCase { // 測試的數據參數 Long a; Long b; String c; String d; Date date1; Date date2; // 帶參數的構造函數 public parTest(Long a, Long b, String c, String d, Date date1, Date date2) { super(); this.a = a; this.b = b; this.c = c; this.d = d; this.date1 = date1; this.date2 = date2; } public TestParam(String name) { // TODO Auto-generated constructor stub super(name); } @Test public void test() { // 調用方法 add(a, b, c, d, date1, date2); } }