转:JUnit中的测试套件和参数化测试

上一篇 / 下一篇  2014-03-27 13:40:39 / 个人分类:Junit

JUnit4.x的测试运行器
JUnit单元测试提供了默认的测试运行器,它的测试方法都是由它负责执行的
我们也可以定制自己的运行器,所有的运行器都继承自org.junit.runner.Runner 
还可以使用org.junit.runer.RunWith注解 为每个测试类指定使用具体的运行器
一般情况下,默认测试运行器可以应对绝大多数的单元测试要求
当使用JUnit提供的一些高级特性,或者针对特殊需求定制JUnit测试方式时
显式的声明测试运行就必不可少了


JUnit4.x测试套件的创建步骤
 创建一个空类作为测试套件的入口
 使用org.junit.runner.RunWith org.junit.runners.Suite.SuiteClasses注解 修饰该空类
 org.junit.runners.Suite 作为参数传入RunWith注解,即使用套件运行器执行此类
 将需要放入此测试套件的测试类组成数组,作为SuiteClasses注解的参数
 保证这个空类使用public 修饰,而且存在公开的不带有任何参数的构造函数


下面是JUnit4.x中创建测试套件类的示例代码
  1. package com.jadyer.junit4;  
  2.   
  3. import org.junit.runner.RunWith;  
  4. import org.junit.runners.Suite;  
  5. import org.junit.runners.Suite.SuiteClasses;  
  6.   
  7. /** 
  8.  * JUnit4.x测试套件的举例 
  9.  * @see 下面的CalculatorTest.class和ParameterTest.class均为我们自己编写的JUnit4单元测试类 
  10.  */  
  11. @RunWith(Suite.class)  
  12. @SuiteClasses({CalculatorTest.class, ParameterTest.class})  
  13. public class TestAll {}  

下面是JUnit3.8中创建测试套件类的示例代码

  1. package com.jadyer.junit3;  
  2.   
  3. import junit.framework.Test;  
  4. import junit.framework.TestCase;  
  5. import junit.framework.TestSuite;  
  6.   
  7. /** 
  8.  * JUnit3.8中批量运行所有的测试类。。直接在该类上Run As JUnit Test即可 
  9.  * @see 这里就用到了设计模式中典型的组合模式,即将不同的东西组合起来 
  10.  * @see 组合之后的东西,即可以包含本身,又可以包含组成它的某一部分 
  11.  * @see TestSuite本身是由TestCase来组成的,那么TestSuite里面就可以包含TestCase 
  12.  * @see 同时TestSuite里面还可以继续包含TestSuite,形成一种递归的关系 
  13.  * @see 这里就体现出来了,所以这是一种非常非常好的设计模式,一种好的策略 
  14.  */  
  15. public class TestAll extends TestCase {  
  16.     //方法名固定的,必须为public static Test suite()  
  17.     public static Test suite() {  
  18.         //TestSuite类实现了Test接口  
  19.         TestSuite suite = new TestSuite();  
  20.         //这里传递的是测试类的Class对象。该方法还可以接收TestSuite类型对象  
  21.         suite.addTestSuite(CalculatorTest.class);  
  22.         suite.addTestSuite(MyStackTest.class);  
  23.         return suite;  
  24.     }  
  25. }  


 

JUnit4.X的参数化测试
为保证单元测试的严谨性,通常会模拟不同的测试数据来测试方法的处理能力
为此我们需要编写大量的单元测试的方法,可是这些测试方法都是大同小异的
它们的代码结构都是相同的,不同的仅仅是测试数据和期望值
这时可以使用JUnit4的参数化测试,提取测试方法中相同代码 提高代码重用度 
而JUnit3.8对于此类问题,并没有很好的解决方法,JUnit4.x弥补了JUnit3.8的不足


参数化测试的要点
 准备使用参数化测试的测试类必须由org.junit.runners.Parameterized 运行器修饰
 准备数据。数据的准备需要在一个方法中进行,该方法需要满足的要求如下
           1) 该方法必须由org.junit.runners.Parameterized.Parameters注解 修饰
           2) 该方法必须为返回值是java.util.Collection 类型的public  static方法
           3) 该方法没有参数 方法名可随意 。并且该方法是在该类实例化之前执行的
 为测试类声明几个变量 ,分别用于存放期望值和测试所用的数据
 为测试类声明一个带有参数的公共构造函数 ,并在其中为 中声明的变量赋值
 编写测试方法,使用定义的变量作为参数进行测试


参数化测试的缺点
一般来说,在一个类里面只执行一个测试方法。因为所准备的数据是无法共用的
这就要求,所要测试的方法是大数据量的方法,所以才有必要写一个参数化测试
而在实际开发中,参数化测试用到的并不是特别多


下面是JUnit4.x中参数化测试的示例代码

首先是Calculator.java

  1. package com.jadyer.junit4;  
  2.   
  3. /** 
  4.  * 数学计算-->加法 
  5.  */  
  6. public class Calculator {  
  7.     public int add(int a, int b) {  
  8.         return a + b;  
  9.     }  
  10. }  

然后是JUnit4.x的参数化测试类ParameterTest.java

  1. package com.jadyer.junit4;  
  2.   
  3. import static org.junit.Assert.assertEquals; //静态导入  
  4.   
  5. import java.util.Arrays;  
  6. import java.util.Collection;  
  7.   
  8. import org.junit.Test;  
  9. import org.junit.runner.RunWith;  
  10. import org.junit.runners.Parameterized;  
  11. import org.junit.runners.Parameterized.Parameters;  
  12.   
  13. import com.jadyer.junit4.Calculator;  
  14.   
  15. /** 
  16.  * JUnit4的参数化测试 
  17.  */  
  18. @RunWith(Parameterized.class)  
  19. public class ParameterTest {  
  20.     private int expected;  
  21.     private int input11;  
  22.     private int input22;  

TAG:

 

评分:0

我来说两句

Open Toolbar