一、一个简单的测试

编写一个只有一种运算的计算器:

1 public class Calculator {
2     public static double divide(int dividend, int divisor) {
3         return dividend / divisor;
4     }
5 }  

为这个方法编写测试:

1 public class CalculatorTest {
2     //允许误差
3     private static final double DELTA = 0.01;
4
5     @Test
6     public void testAdd() throws Exception {
7         assertEquals(3, Calculator.divide(9, 3), DELTA);
8     }
9 }  

这个测试中使用9除以3测试了方法,但是我们希望使用多组数据进行测试,并且不需要编写多个方法,这时候可以使用JUnit的参数化测试。

二、参数化测试

在JUnit中,参数化测试有两种形式,第一种形式是构造函数形式,即JUnit遍历所提供的所有参数调用构造函数并执行测试方法:

 1 //使用Parameterized Runner执行参数化测试
 2 @RunWith(Parameterized.class)
 3 public class CalculatorTest {
 4     //允许误差
 5     private static final double DELTA = 0.01;
 6
 7     private int dividend;
 8     private int divisor;
 9     private int result;
10
11     public CalculatorTest(int dividend, int divisor, int result) {
12         this.dividend = dividend;
13         this.divisor = divisor;
14         this.result = result;
15     }
16
17     // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
18     // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
19     // 每组参数(数组)调用构造函数并执行测试。
20     @Parameterized.Parameters
21     public static Iterable<Object[]> getParameters() {
22         return Arrays.asList(new Object[][]{
23                 {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
24         });
25     }
26
27     //当执行测试后,该方法会运行3次
28     @Test
29     public void testDevide throws Exception {
30         assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
31     }
32 }
33  

第二种是变量注入形式,变量的值不通过构造函数初始化,而是通过JUnit注入:

 1 //使用Parameterized Runner执行参数化测试
 2 @RunWith(Parameterized.class)
 3 public class CalculatorTest {
 4     //允许误差
 5     private static final double DELTA = 0.01;
 6
 7     //使用@Parameter标注public变量,JUnit会遍历每组参数进行注入
 8     //注解中的整数参数表示注入参数组中的第几个参数
 9     @Parameter(0)
10     public int dividend;
11     @Parameter(1)
12     public int divisor;
13     @Parameter(2)
14     public int result;
15
16     // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
17     // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
18     // 每组参数(数组)调用构造函数并执行测试。
19     @Parameterized.Parameters
20     public static Iterable<Object[]> getParameters() {
21         return Arrays.asList(new Object[][]{
22                 {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
23         });
24     }
25
26     //当执行测试后,该方法会运行3次
27     @Test
28     public void testDivide() throws Exception {
29         assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
30     }
31 }  

三、Assumption

在上面参数化的例子中,如果我们提供的参数为{9, 3, 3}, {15, 0, 0}, {12, 4, 3},那第二组参数则会导致测试失败(15除以0会抛出异常),但是在参数化测试中并不应该使用0为除数作为测试,所以应该是测试数据的问题,不应该导致测试失败。使用org.junit.Assume下的各种assume方法能对测试的数据或者环境做出假设,当这种假设不满足时跳过该测试,这样就可以保证在正确的测试环境下执行测试。

1 @Test
2 public void testDivide() throws Exception {
3     //假定除数不为0,若为0跳过该测试
4     assumeTrue("Divisor can't be 0", divisor != 0);
5     assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
6 }  

使用上述参数执行该测试,第二组参数所对应的测试会被忽略,而不是失败。

此文转载,如有版权限制,愿意自动放弃

转载于:https://www.cnblogs.com/johnson-blog/p/3890507.html

JUnit4学习笔记(二):参数化测试与假定(Assumption)相关推荐

  1. 中国大学MOOC实用Python程序设计学习笔记和课后测试1-3周(北京大学)

    中国大学MOOC实用Python程序设计学习笔记和课后测试1-3周(北京大学) 第1周 Python初探 为project设置解释器 保留字 第1周课后测试题 第2周 基本运算.条件分支和输出格式控制 ...

  2. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  3. MATLAB学习笔记——二维和三维绘图

    MATLAB学习笔记--二维和三维绘图 近期练习matlab的二维和三维绘图,整理一下,以防忘记. 文章目录 MATLAB学习笔记--二维和三维绘图 一.二维绘图 1.plot命令 2.fplot 命 ...

  4. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  5. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

  6. Greedy Match学习笔记二 —— 安慰剂检验与置信区间计算

    Greedy Match学习笔记二 -- 安慰剂检验与置信区间计算 上一节我们介绍了Greedy Match的基本原理.本节中,我们将在不同样本量的情况下分别进行安慰剂检验,以验证Greedy Mat ...

  7. python学习笔记(二) 基本运算

    python学习笔记(二) 基本运算 1. 条件运算 基本语法 if condition1: do somethings1elif condition2: do somethings2else: do ...

  8. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  9. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

  10. Netty学习笔记二网络编程

    Netty学习笔记二 二. 网络编程 1. 阻塞模式 阻塞主要表现为: 连接时阻塞 读取数据时阻塞 缺点: 阻塞单线程在没有连接时会阻塞等待连接的到达,连接到了以后,要进行读取数据,如果没有数据,还要 ...

最新文章

  1. 1099 Build A Binary Search Tree
  2. C# AppDomain
  3. 【AI初识境】近20年深度学习在图像领域的重要进展节点
  4. Helm部署ElasticSearch Kibana 7 集群
  5. SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理...
  6. 10W 赞的程序员高薪职业建议
  7. 使用jfreechart来创建一个简单的柱状图
  8. vs2008 jQuery 智能提示失败可能是Jquery版本问题
  9. 222.完全二叉树的节点个数
  10. Unix操作系统常用命令
  11. nodejs下载 安装 配置环境
  12. stm32f072--定时器17使用CH1N通道输出pwm时没有波形的原因
  13. 【预测模型】基于粒子群优化宽度学习实现预测matlab代码
  14. EPLAN2022程序安装及注意事项
  15. GPC规范--安全域基础概念
  16. Element-UI(一) 表格table中实现“加载更多”的功能
  17. MySQL数据库的SQL语句
  18. C++中stack的用法(超详细,入门必看)
  19. iOS代码混淆安全加固
  20. Java---从键盘输入一位整数,当输入1-7时,输出星期一~星期日

热门文章

  1. com.alibaba.fastjson.JSONException: not close json text, token : :
  2. hadoop初始化(hdfs格式化)+简单测试(转载+自己整理)
  3. ubuntu16.04+Virtualenv+python2.7+Caffe安装(CPU版本,无opencv)
  4. 判断元素是否在ndarray_专业文章 | 如何判断是否构成有“一定影响”的包装装潢...
  5. java正则表达式笔记
  6. 利用zookeeper实现分布式服务故障自动剔除/服务自动注册的思路
  7. 浙江省经信委与新华三签署战略合作协议
  8. modelsim显示状态机名称的方法
  9. ansible命令参数介绍
  10. bash參考手冊之六(Bash特性)