Junit 参数化测试的五个步骤
(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据
(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值
(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters
修饰的,返回值为 java.util.Collection
的公共静态方法,并在此方法中初始化所有需要测试的参数对
(5)编写测试方法,使用定义的变量作为参数进行测试
代码示例
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// 测试类指定特殊的运行器 org.junit.runners.Parameterized
// 表示该类将不使用 Junit 内建的运行器运行,而使用参数化运行器运行
@RunWith(Parameterized.class)
public class CalculatorTest {
// 为测试类声明几个变量,分别用于存放期望值和测试所用数据
private int a;
private int b;
private int expected;
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
}
// 为测试类声明一个带有参数的公共构造函数,并在其中为变量赋值
public CalculatorTest(int a, int b, int expected) {
this.a = a;
this.b = b;
this.expected = expected;
}
// 为测试类声明一个使用注解,org.junit.runners.Parameterized.Parameters 修饰的,返回值为
// java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对
@Parameters
public static Collection<Integer[]> prepareData() {
Integer[][] object = {{2, 1, 3}, {-3, -1, -4}, {5, 0, 5}};
return Arrays.asList(object);
}
// 编写测试方法,使用定义的变量作为参数进行测试。
@Test
public void testAdd() {
// 注意是调用的成员变量
assertEquals(this.expected, calculator.add(a, b));
}
}
Junit Rule
如果需要检测测试方法是否正确返回异常,或者必须在要求的时间内返回,可以使用 Junit 提供的 Rule:
Verifier: 验证测试执行结果的正确性
ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败
ExpectedException: 提供灵活的异常验证功能
Timeout: 用于测试超时的 Rule
ExternalResource: 外部资源管理
TemporaryFolder: 在 Junit 的测试执行前后,创建和删除新的临时目录
TestWatcher: 监视测试方法生命周期的各个阶段
TestName: 在测试方法执行过程中提供获取测试名字的能力
如果需要检查返回的异常,可参考如下代码:
@Test(expected = CalculateExeption.class)
public void testAddExeption() throws CalculateExeption {
assertEquals(this.expected, calculator.add(a, b));
}
多函数参数化测试
默认的 Junit 参数化测试对多个函数同时测试不大友好,我们可以通过变通的方法达到目的,代码如下:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int minus(int a, int b) {
return a - b;
}
}
@RunWith(Parameterized.class)
public class CalculatorTest {
enum Type {
ADD, MINUS
}
private Type type;
private int a;
private int b;
private int expected;
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
}
public CalculatorTest(Type type, int a, int b, int expected) {
this.type = type;
this.a = a;
this.b = b;
this.expected = expected;
}
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(
new Object[][] {
{Type.ADD, 2, 1, 3},
{Type.ADD, 2, 1, 3},
{Type.ADD, 5, 0, 5},
{Type.MINUS, 5, 2, 3},
{Type.MINUS, 7, 1, 6},
{Type.MINUS, -3, -4, 1}});
}
@Test
public void testAdd() {
Assume.assumeTrue(type == Type.ADD);
assertEquals(this.expected, calculator.add(a, b));
}
@Test
public void testMinus() {
Assume.assumeTrue(type == Type.MINUS);
assertEquals(this.expected, calculator.minus(a, b));
}
}
作者 Github : tojohnonly , 博客 : EnskDeCode