Junit多參數測試

日前,爲測試一個傳入多參數的方法,使用了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);
    }
}
相關文章
相關標籤/搜索