http://blog.csdn.net/jadyer/article/details/6013743

来源:互联网 发布:电子仿真软件列表 编辑:程序博客网 时间:2024/05/22 03:30

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中创建测试套件类的示例代码
[java] view plaincopyprint?
  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中创建测试套件类的示例代码

[java] view plaincopyprint?
  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

[java] view plaincopyprint?
  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

[java] view plaincopyprint?
  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;  
  23.       
  24.     public ParameterTest(int expected, int input11, int input22){  
  25.         this.expected = expected;  
  26.         this.input11 = input11;  
  27.         this.input22 = input22;  
  28.     }  
  29.       
  30.     @Parameters  
  31.     public static Collection prepareData(){  
  32.         //该二维数组的类型必须是Object类型的  
  33.         //该二维数组中的数据是为测试Calculator中的add()方法而准备的  
  34.         //该二维数组中的每一个元素中的数据都对应着构造方法ParameterTest()中的参数的位置  
  35.         //所以依据构造方法的参数位置判断,该二维数组中的第一个元素里面的第一个数据等于后两个数据的和  
  36.         //有关这种具体的使用规则,请参考JUnit4的API文档中的org.junit.runners.Parameterized类的说明  
  37.         Object[][] object = {{3,1,2}, {0,0,0}, {-4,-1,-3}, {6,-3,9}};  
  38.         return Arrays.asList(object);  
  39.     }  
  40.       
  41.     @Test  
  42.     public void testAdd(){  
  43.         Calculator cal = new Calculator();  
  44.         assertEquals(expected, cal.add(input11, input22));  
  45.     }  
  46. }  
  47. /********************【该测试的执行流程】************************************************************************/  
  48. //1..首先会执行prepareData()方法,将准备好的数据作为一个Collection返回  
  49. //2..接下来根据准备好的数据调用构造方法。Collection中有几个元素,该构造方法就会被调用几次  
  50. //   我们这里Collection中有4个元素,所以ParameterTest()构造方法会被调用4次,于是会产生4个该测试类的对象  
  51. //   对于每一个测试类的对象,都会去执行testAdd()方法  
  52. //   而Collection中的数据是由JUnit传给ParameterTest(int expected, int input11, int input22)构造方法的  
  53. //   于是testAdd()用到的三个私有参数,就被ParameterTest()构造方法设置好值了,而它们三个的值就来自于Collection  
  54. /************************************************************************************************************/  

0 0
原创粉丝点击