JUnit4教程(五):Theory(理论)测试

一、简介

JUnit4引入了Theory(理论)机制,在JUnit的官方介绍上(https://github.com/junit-team/junit/wiki/Theories)看了半天,发现其实这个概念类似于参数化测试。在参数化测试中,我们需要给定所有具体的测试数据组,而在理论测试中,用户只需给定了一些数据,JUnit自动利用这些数据组合出各种各种可能的组合来执行测试。

 

二、使用

要执行Theory测试,必须要使用org.junit.experimental.theories.Theories这个Test Runner。

Java代码   收藏代码
  1. @RunWith(Theories.class)  
  2. public class TheoryTest {  
  3.     //允许的最大误差  
  4.     private static final double DELTA = 0.01;  
  5.   
  6.     @DataPoint  
  7.     public static int ZERO = 0;  
  8.   
  9.     @DataPoint  
  10.     public static int TWO = 2;  
  11.   
  12.     @DataPoint  
  13.     public static int EIGHT = 8;  
  14.   
  15.     //标志这个测试为Theory测试  
  16.     @Theory  
  17.     public void testDivide(int dividend, int divisor) {  
  18.         //跳过除数为0的case  
  19.         assumeThat(divisor, not(0));  
  20.         //Calculator.divide(dividend, divisor)方法返回他们相除的结果  
  21.         assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);  
  22.         System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);  
  23.     }  
  24. }  

 在上面的测试中,@DataPoint用于注解静态变量,表示这个变量是个数据点。当执行testDivide这个Theory测试时,JUnit会把所有的DataPoint数据两两组合(JUnit会根据测试方法的参数决定数据的组合)形成一组组的测试数据(也就是9组)并用这些数据分别执行测试。执行上面的测试会输出以下信息:

 

Java代码   收藏代码
  1. Passed with: dividend=0, divisor=2  
  2. Passed with: dividend=0, divisor=8  
  3. Passed with: dividend=2, divisor=2  
  4. Passed with: dividend=2, divisor=8  
  5. Passed with: dividend=8, divisor=2  
  6. Passed with: dividend=8, divisor=8  

 

 

也可以使用@DataPoints注解一个静态方法以返回数据,下面的测试与上面的等价

 

Java代码   收藏代码
  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[]{028};  
  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. }  

 

上面两个例子都是方法的两个参数分别遍历DataPoint进行组合,如果需要限定某个参数,可以像下面的例子一样使用@TestOn注解:

Java代码   收藏代码
  1. @RunWith(Theories.class)  
  2. public class TheoryTest {  
  3.     //允许的最大误差  
  4.     private static final double DELTA = 0.01;  
  5.   
  6.     //标志这个测试为Theory测试  
  7.     @Theory  
  8.     public void testDivide(  
  9.             @TestedOn(ints = {028}) int dividend,  
  10.             @TestedOn(ints = {28}) int divisor  
  11.     ) {  
  12.         //Calculator.divide(dividend, divisor)方法返回他们相除的结果  
  13.         assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);  
  14.         System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);  
  15.     }  
  16. }  

 这样,JUnit就只会使用给定的数据进行组合测试,去掉了除数为0的情况,也就不必要对除数进行假设(assume)了。


原文链接:http://haibin369.iteye.com/blog/2089292

猜你喜欢

转载自blog.csdn.net/u013001763/article/details/80256933