一直以为TestNG才有参数化测试解决方案,不想在看了Parameterising JUnit tests 的文章以才知道JUnit4中也提供了参数化测试的功能,于是简单的学习了一下。
什么是参数化测试?
很多时候一个方法的实现需要支持多种Case或者说从测试的角度来看需要测试多种边际条件。例如一个字符串大小写转换的函数需要实现把employee_info这样以“_”分隔的字符串转换成相应的大写字母开头的字符串EmployeeInfo。针对这样的实现方法进行单元测试就需要考虑支持测试多种情况:
1.测试空字符串
2.测试一般处理情况
3.测试尾字母大写的情况.......
4.处理Null
5......
在不使用参数化测试方法的情况下,我们需要针对各种情况编写assert:
1. assertEquals(“”,“”);
2.assertEquals("EmployeeInfo","employee_info");
3. assertEquals("EmployeeInfoA","employee_info_a");
4.assertEquals(null,null);
5......
这种解决方式是不是感到有很多重复,而参数化测试就是解决这种情况的绝好方法。
下面来介绍一下参数化测试的开发方式
参数化测试实例
1. 为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
2. 为测试类声明几个变量,分别用于存放期望值和测试所用数据。
3. 为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
4. 为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
5. 编写测试方法,使用定义的变量作为参数进行测试。
/*********************************************************************************************/
@RunWith(Parameterized.class)
public class StringTransformerTest {
private String testData;
private String expectedData;
public StringTransformerTest(String testData, String expectedData) {
this.testData = testData;
this.expectedData = expectedData;
}
@Test
public void testTransfer() {
assertEquals(expectedData, StringTransformer.transfer(testData));
}
@Parameters
public static Collection getParameters() throws Exception {
return Arrays.asList(new Object[][] {
{ "employee_info", "employeeInfo" }, // 测试一般的处理情况
{ null, null }, // 测试 null 时的处理情况
{ "", "" }, // 测试空字符串 时的处理情况
{ "employee_info", "EmployeeInfo" }, // 测试当首字母大写时的情况
{ "employee_info_a", "employeeInfoA" }, // 测试当尾字母为大写时的情况
{ "employee_a_info", "employeeAInfo" } // 测试多个相连字母大写时的情况
});
}
}
/*********************************************************************************************/
运行效果如下图
![](https://i-blog.csdnimg.cn/blog_migrate/e0f8736e7e1765bad804e92c7e9d899a.bmp)