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/
相关文章
|
28天前
|
IDE Java 测试技术
Junit 单元测试
JUnit是Java常用的单元测试框架,简化了测试用例的编写和执行。其特点包括简单注解、自动化测试、可扩展性、灵活性及与IDE的集成。使用方法涉及创建测试类、利用注解如@Test、@BeforeEach等管理测试生命周期,以及使用各种断言方法验证结果。此外,JUnit支持参数化测试以覆盖更多输入组合,并能与Maven、Gradle等构建工具集成,提升测试效率和项目管理。
36 1
|
3月前
|
Java 测试技术
JUnit 4 单元测试
单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软件问题层出不穷。 线上出现的不少问题其实在有单元测试的情况下就可以及时发现和处理,因此培养自己在日常开发中写单元测试的能力是很有必要的。无论是对自己的编码能力的提高,还是项目质量的提升,都是大有好处,本文将介绍 Java 单元测试框架 JUnit 4 的基础认识和使用来编写单元测试,希望同样对你有所帮助。
|
5月前
|
Java 测试技术 数据库
Spring 单元测试(Junit)
Spring 单元测试(Junit)
|
4月前
|
测试技术
Junit单元测试 org.junit.jupiter.api.extension.ParameterResolutionException异常处理
Junit单元测试 org.junit.jupiter.api.extension.ParameterResolutionException异常处理
81 0
|
7天前
|
Java 测试技术 程序员
junit单元测试
junit单元测试
|
3月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
197 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
1月前
|
XML Java 测试技术
TestNG 与 JUnit 测试框架:哪个更好?
【2月更文挑战第16天】
44 1
TestNG 与 JUnit 测试框架:哪个更好?
|
2月前
|
测试技术 数据库
参数化单元测试
参数化单元测试
15 0
|
2月前
|
运维 Java 测试技术
spring 单元测试 Junit
spring 单元测试 Junit
42 2
|
2月前
|
存储 测试技术 数据库
数据驱动测试中的参数化
数据驱动测试中的参数化

热门文章

最新文章