说说使用参数化测试运行器的优缺点
要进行参数化测试,需要在类上面指定如下的运行器:
@RunWith (Parameterized.class)
然后,在提供数据的方法上加上一个@Parameters注解,这个方法必须是静态static的,并且返回一个集合Collection。
优点:在测试类的构造方法中为各个参数赋值,(构造方法是由JUnit调用的),最后编写测试类,它会根据参数的组数来运行测试多次。
缺点:JUnit目前的参数化测试只支持一个@Parameters,要是支持多个就可以匹配多个构造函数,可以实现更多的用例。
例
TestDate1.java
import static org.junit.Assert.*;
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(value=Parameterized.class)
public class TestDate1 {
private int expected;//0表示假,1表示真
private int valueYear;
private int valueMoon;
private int valueDay;
public TestDate1(int e,int vy,int vm,int vd){
this.expected = e;
this.valueYear = vy;
this.valueMoon = vm;
this.valueDay = vd;
}
@Parameters
public static Collection<Integer[]> getTestParameters() {
return Arrays.asList(new Integer[][] {
{31, 2000, 1, 1},
{31, 2000, 3, 1},
{31, 2000, 5, 1},
{31, 2000, 7, 1},
{31, 2000, 8, 1},
{31, 2000, 10, 1},
{31, 2000, 12, 1},
{30, 2001, 4, 1},
{30, 2001, 6, 1},
{30, 2001, 9, 1},
{30, 2001, 11, 1},
{28, 2001, 2, 1},
{29, 2012, 2, 1},
{0, 2012, 13, 1}
});
}
@Test
public void testgetNumberOfDaysInMonth(){
Date d =new Date(valueYear,valueMoon,valueDay);
assertEquals(expected, d.getNumberOfDaysInMonth());
}
}
TestDate2.java
import static org.junit.Assert.*;
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(value=Parameterized.class)
public class TestDate2 {
private int expected;//0表示假,1表示真
private int valueYear;
private int valueMoon;
private int valueDay;
public TestDate2(int e,int vy,int vm,int vd){
this.expected = e;
this.valueYear = vy;
this.valueMoon = vm;
this.valueDay = vd;
}
@Parameters
public static Collection<Integer[]> getTestParameters() {
return Arrays.asList(new Integer[][] {
{1, 2000, 1, 1},
{0, 2001, 1, 1},
{1, 2012, 1, 1},
{0, 1800, 1, 1}
});
}
@Test
public void testisLeapYear(){
Date d =new Date(valueYear,valueMoon,valueDay);
boolean e;
//把0,1转换为boolean值
if(expected == 0)
e=false;
else
e=true;
assertEquals(e, d.isLeapYear());
}
}
TestSuite.java
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)// 指定运行器
@Suite.SuiteClasses({ TestDate1.class, TestDate2.class })// 指定要测试的类
public class TestSuite {
}