一、简介
JUnit4引入了Theory(理论)机制,在JUnit的官方介绍上(https://github.com/junit-team/junit/wiki/Theories)看了半天,发现其实这个概念类似于参数化测试。在参数化测试中,我们需要给定所有具体的测试数据组,而在理论测试中,用户只需给定了一些数据,JUnit自动利用这些数据组合出各种各种可能的组合来执行测试。
二、使用
要执行Theory测试,必须要使用org.junit.experimental.theories.Theories这个Test Runner。
在上面的测试中,@DataPoint用于注解静态变量,表示这个变量是个数据点。当执行testDivide这个Theory测试时,JUnit会把所有的DataPoint数据两两组合(JUnit会根据测试方法的参数决定数据的组合)形成一组组的测试数据(也就是9组)并用这些数据分别执行测试。执行上面的测试会输出以下信息:
- Passed with: dividend=0, divisor=2
- Passed with: dividend=0, divisor=8
- Passed with: dividend=2, divisor=2
- Passed with: dividend=2, divisor=8
- Passed with: dividend=8, divisor=2
- Passed with: dividend=8, divisor=8
也可以使用@DataPoints注解一个静态方法以返回数据,下面的测试与上面的等价
1 @RunWith(Theories.class) 2 public class TheoryTest { 3 //允许的最大误差 4 private static final double DELTA = 0.01; 5 6 @DataPoints 7 public static int[] getTestData() { 8 return new int[]{0, 2, 8}; 9 } 10 11 //标志这个测试为Theory测试 12 @Theory 13 public void testDivide(Integer dividend, Integer divisor) { 14 //跳过除数为0的case 15 assumeThat(divisor, not(0)); 16 //Calculator.divide(dividend, divisor)方法返回他们相除的结果 17 assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA); 18 System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor); 19 } 20 } 21
上面两个例子都是方法的两个参数分别遍历DataPoint进行组合,如果需要限定某个参数,可以像下面的例子一样使用@TestOn注解: