JUnit 参数化测试
在JUnit 4中,Parameterized(参数化)的测试运行器允许你使用不同的参数多次运行同一个测试,如下代码是一个使用Parameterized运行器的实例:
1 import java.util.Arrays; 2 import java.util.Collection; 3 4 import junit.framework.Assert; 5 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.junit.runners.Parameterized; 9 import org.junit.runners.Parameterized.Parameters; 10 11 @RunWith(value=Parameterized.class) 12 public class ParameterizedTest { 13 14 private double expected; 15 private double valueOne; 16 private double valueTwo; 17 18 @Parameters 19 public static Collection<Integer[]> getTestParameters() { 20 return Arrays.asList(new Integer[][]{ 21 {2,1,1},//expected, valueOne, valueTwo 22 {3,2,1},//expected, valueOne, valueTwo 23 {4,2,3}//expected, valueOne, valueTwo 24 }); 25 } 26 27 public ParameterizedTest(double expected, double valueOne, double valueTwo) { 28 this.expected = expected; 29 this.valueOne = valueOne; 30 this.valueTwo = valueTwo; 31 } 32 33 @Test 34 public void sum(){ 35 Calculator calc = new Calculator(); 36 Assert.assertEquals(expected, calc.add(valueOne, valueTwo)); 37 } 38 39 }
要使用Parameterized的测试运行器来运行一个测试类,那就必须要满足以下要求。首先,测试类必须使用@RunWith注解,并且要将Parameterized类作为它的参数。其次,必须声明测试中所使用的实例变量,同时提供一个用@Parameters注解的方法,这里提供的是getTestParameters方法。此外,这个方法的签名必须是@Parameters public static java.util.Collection,无任何参数。Collection的元素必须是相同长度的数组,这个数组的长度必须和这个类中唯一的公共构造函数的参数数量相匹配。在上面的例子中,每个数组包含了3个元素,因为公共构造函数有3个参数,我们的示例使用这个方法来为测试提供输入值和预期的输出值。
运行这个测试,将会根据@Parameters 方法返回的Collection 的大小,进行相同数量的循环。执行这个单独的测试用例的效果等同于执行以下具有不同参数的测试用例:
sum:assertEquals(2,calc.add(1,1));
sum:assertEquals(3,calc.add(2,1));
sum:assertEquals(4,calc.add(3,1));
这里我们要逐步分析JUnit的运行过程,以充分理解这项功能:JUnit调用了静态方法getTestParameters。接下来,JUnit会迭代getTestParameters返回的集合。在迭代中,JUnit调用了唯一的公共构造函数(注:如果存在多个公共构造函数,JUnit就会抛出一个断言错误),并使用当前迭代的数组元素中的值作为构造函数的参数,这样就得到一个测试类的实例,然后再使用此实例调用@Test方法。如此,直至迭代完Collection中所有元素。
摘自《JUnit实战》

浙公网安备 33010602011771号