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中创建测试套件类的示例代码


package com.jadyer.junit4;

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

import org.junit.runners.Suite.SuiteClasses;

/**

* JUnit4.x测试套件的举例

* @see 下面的CalculatorTest.class和ParameterTest.class均为我们自己编写的JUnit4单元测试类

*/

@RunWith(Suite.class)

@SuiteClasses({CalculatorTest.class, ParameterTest.class})

public class TestAll {}

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

package com.jadyer.junit3;

import junit.framework.Test;

import junit.framework.TestCase;

import junit.framework.TestSuite;

/**

* JUnit3.8中批量运行所有的测试类。。直接在该类上Run As JUnit Test即可

* @see 这里就用到了设计模式中典型的组合模式,即将不同的东西组合起来

* @see 组合之后的东西,即可以包含本身,又可以包含组成它的某一部分

* @see TestSuite本身是由TestCase来组成的,那么TestSuite里面就可以包含TestCase

* @see 同时TestSuite里面还可以继续包含TestSuite,形成一种递归的关系

* @see 这里就体现出来了,所以这是一种非常非常好的设计模式,一种好的策略

*/

public class TestAll extends TestCase {

//方法名固定的,必须为public static Test suite()

public static Test suite() {

//TestSuite类实现了Test接口

TestSuite suite = new TestSuite();

//这里传递的是测试类的Class对象。该方法还可以接收TestSuite类型对象

suite.addTestSuite(CalculatorTest.class);

suite.addTestSuite(MyStackTest.class);

return suite;

}

}

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


package com.jadyer.junit4;

/**

* 数学计算-->加法

*/

public class Calculator {

public int add(int a, int b) {

return a + b;

}

}

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


package com.jadyer.junit4;

import static org.junit.Assert.assertEquals; //静态导入

import java.util.Arrays;

import java.util.Collection;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import com.jadyer.junit4.Calculator;

/**

* JUnit4的参数化测试

*/

@RunWith(Parameterized.class)

public class ParameterTest {

private int expected;

private int input11;

private int input22;

public ParameterTest(int expected, int input11, int input22){

this.expected = expected;

this.input11 = input11;

this.input22 = input22;

}

@Parameters

public static Collection prepareData(){

//该二维数组的类型必须是Object类型的

//该二维数组中的数据是为测试Calculator中的add()方法而准备的

//该二维数组中的每一个元素中的数据都对应着构造方法ParameterTest()中的参数的位置

//所以依据构造方法的参数位置判断,该二维数组中的第一个元素里面的第一个数据等于后两个数据的和

//有关这种具体的使用规则,请参考JUnit4的API文档中的org.junit.runners.Parameterized类的说明

Object[][] object = {{3,1,2}, {0,0,0}, {-4,-1,-3}, {6,-3,9}};

return Arrays.asList(object);

}

@Test

public void testAdd(){

Calculator cal = new Calculator();

assertEquals(expected, cal.add(input11, input22));

}

}

/********************【该测试的执行流程】************************************************************************/

//1..首先会执行prepareData()方法,将准备好的数据作为一个Collection返回

//2..接下来根据准备好的数据调用构造方法。Collection中有几个元素,该构造方法就会被调用几次

//   我们这里Collection中有4个元素,所以ParameterTest()构造方法会被调用4次,于是会产生4个该测试类的对象

//   对于每一个测试类的对象,都会去执行testAdd()方法

//   而Collection中的数据是由JUnit传给ParameterTest(int expected, int input11, int input22)构造方法的

//   于是testAdd()用到的三个私有参数,就被ParameterTest()构造方法设置好值了,而它们三个的值就来自于Collection

/************************************************************************************************************/

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-20 03:28:05

JUnit中的测试套件和参数化测试的相关文章

《JavaScript忍者秘籍》——2.4 测试套件基础知识

2.4 测试套件基础知识 测试套件的主要目的是聚合代码中的所有单个测试,将其组合成为一个单位,这样它们可以批量运行,提供一个可以轻松反复运行的单一资源. 为了更好地理解测试套件的工作原理,我们有必要了解如何构建一个测试套件.或许有些出人意料,构建JavaScript测试套件确实很容易.大约只需要40行代码就可以构建好一个功能. 人们可能会问"为什么要创建一个新的测试套件?",大多数情况下,可能没有必要编写自己的JavaScript测试套件.目前已经有大量的高质量测试套件可供选择.但是,

junit参数化测试的使用方法

  JUnit参数化测试的五个步骤:(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized.(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据.(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值.(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在

《JUnit实战(第2版)》—— 2.2 运行参数化测试

2.2 运行参数化测试 JUnit实战(第2版) Parameterized(参数化)的测试运行器允许你使用不同的参数多次运行同一个测试.代码2.2给出一个Parameterized运行器的实例(你可以在第1章的源代码示例中找到这个测试). 代码2.2 参数化测试 要使用Parameterized的测试运行器来运行一个测试类,那就必须要满足以下要求.首先,测试类必须使用@RunWith注释,并且要将Parameterized类作为它的参数..\Lucene实战\1.tif.其次,你必须声明测试中

Feed4JUnit 1.0发布 JUnit参数化测试工具

Feed4Jhttp://www.aliyun.com/zixun/aggregation/29926.html">Unit可以让编写JUnit框架的参数化测试变得更容易,并提供预定义或随机生成的测试数据.测试案例数据可以从Excel或CSV文件.数据库或自定义数据源中读取,并且等价类测试可以轻松地自定义.基于Java注释的安装程序易于学习.应用和维护.JSR303.Java 7和Benerator的定义注释可自动识别和生成的通烟测试数据,将匹配约束条件.通过连接Benerator,你可以

Feed4JUnit 0.6.6发布 JUnit参数化测试工具

Feed4Jhttp://www.aliyun.com/zixun/aggregation/29926.html">Unit能够让编写JUnit的参数化测试变得简便,并为这些测试提供预定义或随机测试数据.它能够从业务分析人员定义好的CVS或Excel文件读取测试用例数据并在构建/单元测试框架中报告测试成功.利用Feed4JUnit能够很方便用随机但校验过的数据执行冒烟测试来提高代码代码覆盖率和发现由非常特殊的数据结构产生的Bug.此外还可以利用Feed4JUnit轻松定义等价类测试. 示例

《JUnit实战(第2版)》—第2章2.2节运行参数化测试

2.2 运行参数化测试JUnit实战(第2版)Parameterized(参数化)的测试运行器允许你使用不同的参数多次运行同一个测试.代码2.2给出一个Parameterized运行器的实例(你可以在第1章的源代码示例中找到这个测试). 代码2.2 参数化测试 要使用Parameterized的测试运行器来运行一个测试类,那就必须要满足以下要求.首先,测试类必须使用@RunWith注释,并且要将Parameterized类作为它的参数..Lucene实战1.tif.其次,你必须声明测试中所使用的

JUnit中获取测试类及方法的名称实现方法_java

在JUnit的测试中,有时候需要获得所属的类(Class)或者方法(Method)的名称,以方便记录日志什么的. 在JUnit中提供了TestName类来做到这一点,在org.junit.rules中: public class TestName extends TestWatcher { private String fName; @Override protected void starting(Description d) { fName = d.getMethodName(); } /*

《软件功能测试自动化实战教程》—第6章6.3节参数化测试

6.3 参数化测试软件功能测试自动化实战教程在UFT中可以通过把测试脚本中固定的值替换成参数的方式来扩展测试脚本,这个过程也叫参数化测试,能有效地提高测试的灵活性. 6.3.1 通过参数化测试来提高测试的灵活性可以通过参数化的方式,从外部数据源或数据产生器读取测试数据,从而扩大测试的覆盖面,提高测试的灵活性. 在UFT中,可以使用多种方式来对测试脚本进行参数化,数据表参数化(Data Table Parameters)是其中一种重要的方式,还有环境变量参数化(Environment Variab

《软件功能测试自动化实战教程》—第6章6.4节Action测试输入的参数化

6.4 Action测试输入的参数化软件功能测试自动化实战教程对于重复使用的测试用例,可以转换成公共用例,适当参数化后,可被其他测试用例调用.可以把Action的输入适当参数化,转换成可重用的测试步骤. 6.4.1 编辑Action的属性对"Flight"程序中的登录模块的测试步骤是在执行其他测试步骤之前都要经过的测试步骤,因此,有"潜力"成为一个可重用的Action.对于如图6-17所示的测试步骤,可以进一步参数化后,成为可重用的测试步骤,被其他Action调用.