junit junit

您读过数学理论吗?

它通常读取如下内容:

对于所有a,b> 0满足以下条件:a + b> a和a + b> b

通常,这些语句更难以理解。

这种陈述有一些有趣的地方:它适用于相当大(在这种情况下为无限)集合的每个元素(或元素组合)。

将其与典型测试的陈述进行比较:

@Testpublic void a_plus_b_is_greater_than_a_and_greater_than_b(){int a = 2;int b = 3;assertTrue(a + b > a);assertTrue(a + b > b);}

这仅是关于我们所讨论的大集合中单个元素的陈述。 不太令人印象深刻。 当然,我们可以通过遍历测试(或使用参数化测试 )来解决此问题:

@Testpublic void a_plus_b_is_greater_than_a_and_greater_than_b_multiple_values() {List<Integer> values = Arrays.asList(1, 2, 300, 400000);for (Integer a : values)for (Integer b : values) {assertTrue(a + b > a);assertTrue(a + b > b);}}

当然,这仍然仅测试了一些值,但是也变得非常难看。 我们正在使用9行代码来测试数学家在一行中写的内容! 这种关系对于任何值a,b都应保持的要点在翻译中完全消失了。

但是仍然有希望: JUnit理论 。 让我们看看使用该漂亮工具的测试情况:

import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;import static org.junit.Assert.assertTrue;@RunWith(Theories.class)
public class AdditionWithTheoriesTest {@DataPointspublic static int[] positiveIntegers() {return new int[]{1, 10, 1234567};}@Theorypublic void a_plus_b_is_greater_than_a_and_greater_than_b(Integer a, Integer b) {assertTrue(a + b > a);assertTrue(a + b > b);}
}

使用JUnit理论,测试分为两个独立部分:提供数据点(即用于测试的值)的方法以及理论本身。 该理论看起来几乎像是一个测试,但是它具有不同的注释(@Theory)并且需要参数。 类中的理论将与数据点的每种可能组合一起执行。

这意味着,如果我们对测试主题有一个以上的理论,则只需声明数据点一次。 因此,让我们添加以下理论,这对于加法而言应该是正确的:a + b = b + a因此,我们将以下理论添加到我们的类@Theory中public void add_is_commutative(Integer a,Integer b){assertTrue(a + b == b + a); }

这就像一种魅力,并且可以开始看到它实际上也节省了一些代码,因为我们不重复数据点。 但是,我们仅使用正整数进行测试,而可交换属性应适用于所有整数! 当然,我们的第一个理论仍然只适用于正数

也有一个解决方案: 假设 。 假设您可以检查理论的先决条件。 如果对于给定的参数集不正确,则该理论将被跳过。 所以我们的测试现在看起来像这样:

@RunWith(Theories.class)public class AdditionWithTheoriesTest {@DataPointspublic static int[] integers() {return new int[]{-1, -10, -1234567,1, 10, 1234567};}@Theorypublic void a_plus_b_is_greater_than_a_and_greater_than_b(Integer a, Integer b) {Assume.assumeTrue(a >0 && b > 0 );assertTrue(a + b > a);assertTrue(a + b > b);}@Theorypublic void addition_is_commutative(Integer a, Integer b) {assertTrue(a + b == b + a);}
}

这使测试表现力很好。

将测试数据与测试/理论实现分开,除了简洁以外,还可以带来另一个积极的效果:您可能会开始考虑与实际测试内容无关的测试数据。

让我们做到这一点。 如果要测试采用整数参数的方法,那么哪些整数可能会引起问题? 这是我的建议:

@DataPointspublic static int[] integers() {return new int[]{0, -1, -10, -1234567,1, 10, 1234567, Integer.MAX_VALUE, Integer.MIN_VALUE};}

在我们的示例中,哪个当然会导致测试失败。 如果在Integer.MAX_VALUE中添加一个正整数,则会溢出! 因此,我们刚刚得知我们目前的理论是错误的! 是的,我知道这很明显,但是请看一下当前项目中的测试。 使用整数的所有测试是否都以MIN_VALUE,MAX_VALUE,0,正值和负值测试? 是的,是这样。

那更复杂的对象呢? 琴弦? 日期? 收藏? 还是领域对象? 使用JUnit Theories,您可以设置测试数据生成器一次,以创建所有容易产生问题的场景,然后使用这些理论在所有测试中重用这些场景。 这将使您的测试更具表现力,并提高发现错误的可能性。

参考:来自Java出现日历博客的JCG合作伙伴 Jens Schauder 对JUnit理论的介绍 。

翻译自: https://www.javacodegeeks.com/2013/12/introduction-to-junit-theories.html

junit junit

junit junit_JUnit理论简介相关推荐

  1. nginx之 nginx-1.9.7 编译安装、理论简介

    nginx是一个web网站常用的高性能http和反向代理服务器,其具有较好的并发能力,被网易.百度.腾讯.新浪等网站广泛使用. 一. 理论简介 1.首先弄清楚正向代理和反向代理 正向代理:代理客户端, ...

  2. UA MATH565C 随机微分方程V 算子半群理论简介

    UA MATH565C 随机微分方程V 算子半群理论简介 Banach空间中的算子半群 Hille-Yosida定理 Shift Operator 上一讲提到Homogeneous Markov Fa ...

  3. 数据仓库简介、数据仓库的发展、数仓理论简介

    数仓理论简介 数据仓库解决方案诞生至今,也有2.30年的发展历史了,在这个过程中,数仓理论不断被更新和完善,逐步形成了目前大家普通遵守的数仓开发理论(概念). 数据仓库的发展 阶段1 以解决数据孤岛为 ...

  4. python机器学习——主成分分析理论简介

    主成分分析理论简介 一.特征降维 1.1什么是特征降维? 1.2为什么要进行特征降维? 1.3特征选择和特征抽取 二.主成分分析(PCA)理论 2.1 算法描述 2.2 PCA 在图像识别的应用 2. ...

  5. 如何用计算机画出分子轨道图,定性分子轨道理论简介

    自己写的分子轨道论文作业-- 定性分子轨道理论简介 文奇实验室 一.化学键与分子结构理论的比较 化学家们一直都想知道分子内化学键是如何形成,是什么样子的.从路易斯理论开始,理论考虑的越来越多,思考的越 ...

  6. 投票理论简介以及机器学习中的投票规则

    投票理论简介以及机器学习中的投票规则 政治市场 从个人需求到集体决策 自由的政治市场 投票理论简介 Arrow不可能定理 Majority Rule May定理 Condorcet赢家 中位投票者定理 ...

  7. 稳定状态模型 (一): 微分方程稳定性理论简介

    稳定状态模型系列博文: 稳定状态模型 (一): 微分方程稳定性理论简介 :自治系统.动力系统.相平面.相图.轨线 .  奇点.孤立奇点: 稳定状态模型 (二):再生资源的管理和开发:资源增长模型 .资 ...

  8. 视觉计算理论简介【转】

    一:视觉计算理论与算法研究( 由×××自动化研究所马颂德等完成) "视觉计算理论与算法研究"的目标主要是研究计算机视觉,以使计算机具有通过二维图像感知三维环境信息的能力,包括感知. ...

  9. 迁移学习之域自适应理论简介(Domain Adaptation Theory)

    ©作者 | 江俊广 单位 | 清华大学 研究方向 | 迁移学习 本文主要介绍域自适应(Domain Adaptation)最基本的学习理论,全文不涉及理论的证明,主要是对部分理论的发展脉络的梳理,以及 ...

最新文章

  1. TCP Cluster for mqtt 技术实施方案
  2. 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!
  3. 经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)
  4. Vue—核心概念—异步组件和路由懒加载
  5. Sublime Text添加插入带当前时间说明
  6. 通用apdu指令_8086微处理器中的通用指令格式
  7. 迷宫(AHOI2016初中组T3)
  8. 简单的Oracle触发器使用
  9. NPM安装依赖包,报错node-gyp rebuild...解决方法
  10. 斐讯K2 E1 刷老毛子Padavan中继图文教程(与主路由同网段)
  11. 一位五年工作经验架构师的感悟
  12. 浅谈CVPR2022的几个研究热点
  13. apk开发教程!了解Android架构组件后,构建APP超简单!先收藏了
  14. Excel转储mysql_小程序解析excel表格并存储到云数据库
  15. 使用spool导出数据
  16. 华为机试—字符串处理专题
  17. 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版
  18. 【华为诺亚方舟实验室】招聘:决策推理(强化学习)研究方向(实习、应届、社招、博后)均可以
  19. 有必要考一级建造师吗0603
  20. Coursera-吴恩达-自然语言处理(NLP)专项课-课程笔记与编程实战-汇总

热门文章

  1. 【DP】错排问题(ybtoj DP-1-1)
  2. NOIP2018-普及参赛总结
  3. 动态规划训练9 [Brackets POJ - 2955 ]
  4. vue组件自定义v-model
  5. 这 30 个常用的 Maven 命令你必须熟悉
  6. hashCode到底有什么用?
  7. spring boot使用注解的方式整合mybaits
  8. 利用bladex+avue实现下拉数据源展示
  9. MyBatis中多表查询(业务代码方式)
  10. 递归->记忆化搜索->严格表