这篇来学习一个新的注解,叫@Parameters, 参数化的意思。什么时候需要用到参数化呢,在selenium中这个例子很好,就是我有一个500个用户数据,我需要重复测试这500个用户的登录功能。我们肯定只需要写一个方法,然后调用这个方法500次,每次方法传入参数不一样,这样应该能够完成这个测试需求。在单元测试中,如果一个方法的用例,采用边界值划分,有时候会产生十几个测试用例,这个时候我们就需要使用参数化。
1.参数化的数据源
一般来说,参数化需要提供数据源数据源可以是数据库表,也可以是excel中一行行记录,也可以是代码中写死的一个列表的数据,或者数组数据。大概过程就是,我们提前准备好这个数据源,例如一个二元数组,里面有5组数据。然后在单元测试用例类中的具体方法,使用参数化注解,告诉Junit,执行这个方法,需要使用外部参数化提供的数据源进行多次测试这个方法。
在Junit中,参数化@Parameters里面写的是一个静态方法。
2.参数化测试举例
这里新建一个测试类,ParameterizedTests.java, 写入下面的代码。
package test;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.anthony.protein.TrackingService;
@RunWith(Parameterized.class)
public class ParametrizedTests {
private int input;
private int expected;
private static TrackingService ts = new TrackingService();
//构造方法
public ParametrizedTests(int input, int expected) {
this.input = input;
this.expected = expected;
}
@Parameters
public static List<Object[]> data() {
return Arrays.asList(new Object[][] {
{5, 5},
{5, 10},
{-12, 0},
{50, 50},
{1, 51}
});
}
@Test
public void test() {
if(input > 0) {
ts.addProtein(input);
}else {
ts.removeProtein(-input);
}
//断言,期待结果和total是不是相等
assertEquals(expected, ts.getTotal());
}
}
运行结果