用置换破坏您的JUnit5测试

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。

JUnit测试

在本文中,我将使用Java流ORM Speedment,因为它包含一个现成的Permutation类,从而帮助我节省了开发时间。 否则,加速可以将数据库表连接到标准Java流。 Speedment是一个开放源代码工具,也有免费版本供商业数据库使用。

测试流

考虑以下JUnit5测试:

@Test
void test() {List<String> actual = Stream.of("CCC", "A", "BB", "BB").filter(string -> string.length() > 1).sorted().distinct().collect(toList());List<String> expected = Arrays.asList("BB", "CCC");assertEquals(actual, expected);
}

如可以看到的,该测试将创建一个Stream与所述元素“CCC”,“A”,“B-B”和‘BB’,然后应用一个过滤器,将删除‘A’元素(因为它的长度是不大于1的)。 之后,对元素进行排序,以便流中具有元素“ BB”,“ BB”和“ CCC”。 然后,应用独特的操作,删除流中的所有重复项,在调用最终终止运算符之前保留元素“ BB”和“ CCC”,从而将这些其余元素收集到
List

经过一番考虑,可以理解,中间操作filter()sorted()distinct()的应用sorted()无关紧要。 因此,无论操作员应用程序的顺序如何,我们都期望得到相同的结果。

但是,我们如何才能找到一个JUnit5测试来证明该顺序对于所有排列都是无关紧要的,而无需手动为所有六个排列编写单独的测试用例?

使用TestFactory

除了编写单个测试,我们还可以使用TestFactory生成任意数量的DynamicTest对象。 这是演示该概念的简短示例:

@TestFactory
Stream<DynamicTest> testDynamicTestStream() {return Stream.of(DynamicTest.dynamicTest("A", () -> assertEquals("A", "A")),DynamicTest.dynamicTest("B", () -> assertEquals("B", "B")));
}

这将产生两个可能毫无意义的名为“ A”和“ B”的测试。 请注意,我们如何方便地返回DynamicTest对象Stream ,而无需先将它们收集到
诸如List Collection

使用排列

Permutation类可用于创建任何类型T所有可能组合。 这是带有类型的简单示例
String

Permutation.of("A", "B", "C").map(is -> is.collect(toList())).forEach(System.out::println);

因为Permutation创建了类型为TStreamStream ,所以我们添加了一个中间映射操作,将内部Stream收集到List 。 上面的代码将产生以下输出:

[A, B, C]
[A, C, B] 
[B, A, C] 
[B, C, A] 
[C, A, B] 
[C, B, A]

容易证明,这是将“ A”,“ B”和“ C”组合在一起的所有方式,每个要素应恰好发生一次。

创建运算符

在本文中,我选择为中间操作创建Java对象,而不是使用lambda,因为我想覆盖toString()方法并将其用于方法标识。 在其他情况下,直接使用lambda或方法引用就足够了:

UnaryOperator<Stream<String>> FILTER_OP = new UnaryOperator<Stream<String>>() {@Overridepublic Stream<String> apply(Stream<String> s) {return s.filter(string -> string.length() > 1);}@Overridepublic String toString() {return "filter";}};UnaryOperator<Stream<String>> DISTINCT_OP = new UnaryOperator<Stream<String>>() {@Overridepublic Stream<String> apply(Stream<String> s) {return s.distinct();}@Overridepublic String toString() {return "distinct";}
};UnaryOperator<Stream<String>> SORTED_OP = new UnaryOperator<Stream<String>>() {@Overridepublic Stream<String> apply(Stream<String> s) {return s.sorted();}@Overridepublic String toString() {return "sorted";}
};

测试排列

现在,我们可以轻松地在运算符上测试置换的工作方式:

void printAllPermutations() {Permutation.of(FILTER_OP,DISTINCT_OP,SORTED_OP).map(is -> is.collect(toList())).forEach(System.out::println);
}

这将产生以下输出:

[filter, distinct, sorted]
[filter, sorted, distinct]
[distinct, filter, sorted]
[distinct, sorted, filter]
[sorted, filter, distinct]
[sorted, distinct, filter]

可以看出,这些都是我们要测试的中间操作的置换。

拼接起来

通过结合以上学习,我们可以创建TestFactory ,以测试应用于初始流的中间操作的所有排列:

@TestFactory
Stream<DynamicTest> testAllPermutations() {List<String> expected = Arrays.asList("BB", "CCC");return Permutation.of(FILTER_OP,DISTINCT_OP,SORTED_OP).map(is -> is.collect(toList())).map(l -> DynamicTest.dynamicTest(l.toString(),() -> {List<String> actual = l.stream().reduce(Stream.of("CCC", "A", "BB", "BB"),(s, oper) -> oper.apply(s),(a, b) -> a).collect(toList());assertEquals(expected, actual);}));
}

请注意我们如何使用Stream::reduce方法将中间操作逐步应用于初始Stream.of("CCC", "A", "BB", "BB") 。 合路器lambda
(a, b) -> a只是一个虚拟对象,仅用于合并并行流(此处未使用)。

爆炸警告

最后,对置换的内在数学复杂性提出了警告。 根据定义,排列的复杂度为O(n!) ,例如,仅将一个元素添加到现有的八个元素的排列中,排列的数量将从40,320增加到362,880。

这是一把双刃剑。 我们几乎免费地获得了许多测试,但是我们必须付出在每个构建上执行每个测试的代价。

测试的源代码可以在这里找到。

可以在这里下载Speedment ORM

结论

PermutationDynamicTestTestFactory类是用于创建编程JUnit5测试的出色构建块。

注意不要在排列中使用太多元素。 “炸毁”可能意味着两件事……

翻译自: https://www.javacodegeeks.com/2018/10/blow-junit5-tests-permutations.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法

【Object.keys()】ES5 引入了Object.keys()方法&#xff0c;返回一个数组&#xff0c;成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名var obj { foo: bar, baz: 42 };console.log(Object.keys(obj));// ["foo", "baz"]ES2017 引入了跟…

servlet异步_如何使用异步Servlet来提高性能

servlet异步这篇文章将描述一种性能优化技术&#xff0c;该技术适用于与现代Web应用程序相关的常见问题。 如今的应用程序不再只是被动地等待浏览器发起请求&#xff0c;而是希望自己开始通信。 一个典型的示例可能涉及聊天应用程序&#xff0c;拍卖行等–共同点是这样一个事实…

mysql锁机制 php_MySQL锁机制和PHP锁机制

模拟准备--如何模拟高并发访问一个脚本&#xff1a;apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本例如&#xff1a;cmd&#xff1a; apache安装路径/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php【切入正题】MYSQ…

怎么安装红旗Linux5,如何用硬盘安装红旗LINUX5_0.doc

如何用硬盘安装红旗LINUX5_0如何用硬盘安装红旗LINUX5_0本文由xinbing9贡献红旗linux5.0安装教程相信大家都和我一样,在一开始知道linux的系统时充满了神秘感.习惯了windows的我们对另一种操作系统非常好奇.正是这种好奇心,我决定装linux.看看到底有什么东东.第一次装时,大略的…

企业应用程序开发框架的分类

如果您使用的是“最佳Java框架”&#xff0c;那么您很可能会迷失本文 &#xff0c;它对Java Enterprise世界中的情况进行了很好的概述。 但是&#xff0c;从我的角度来看&#xff0c;它缺少一件非常重要的事情–对上述框架进行分类。 让我们看看这个生态系统的另一个角度&…

投资最重要的事读后感_《投资最重要的事》读书笔记分享

1、学习第二层次思维。在投资的零和世界中参与竞争之前&#xff0c;你必须先问问自己是否具有处于上半部分的充分理由。要想取得超过一般投资者的成绩&#xff0c;你必须有比群体共识更加深入的思考。你具备这样的能力吗&#xff1f;是什么让你认为自己具有这样的能力&#xff…

Linux下社交平台,Linux 启动

> 1. 如启动失败请 查看[坑点概述](https://doc.fastadmin.net/wanlshop/299.html)## Linux运行IM即时通讯#### 1\. 远程连接Linux可以通过远程连接软件、VNC远程连接、Workbench或宝塔面板 > 软件商店 > 宝塔SSH终端进入SSH 终端cd命令 进入cd www/wwwroot/你的网站/…

vscode 取消拉去变基_GIT快速回忆

关于GIT和github&#xff1a;请搜索git下载安装&#xff0c;安装了git才能去github或码云(国内)观察自己上传的代码&#xff0c;github有个桌面版只是基于git的的图形工具&#xff0c;还是需要下载git。概念&#xff1a;1.提交、版本、commit&#xff0c;ID&#xff0c;差不多都…

java对象序列化去掉字段_使用序列化查找对象中的脏字段

java对象序列化去掉字段假设您正在开发一个将对象自动保存到数据库中的框架。 您需要检测两次保存之间所做的更改&#xff0c;以便仅保存已修改的字段。 如何检测脏场。 最简单的方法是遍历原始数据和当前数据&#xff0c;并分别比较每个字段。 代码如下&#xff1a; public s…

c语言中怎么定义的字符串,C语言中定义字符串的几种方式

1&#xff0c;什么是字符串&#xff1f;所谓字符串本质上就是以\0作为结尾的特殊字符数组&#xff1b;2&#xff0c;定义字符串的过程中有哪些注意点由于字符串本质上其实就是以\0作为结尾的特殊字符数组&#xff0c;所以定义字符串时&#xff0c;必须保证字符串存储的最后一个…

ios 不被遮挡 阴影_解决ios10导航栏底部阴影线条隐藏失效问题

2016.11.13 21:47* 字数 887 阅读 791评论 0喜欢 16一、置空阴影图片基于iOS9,在iOS10上不好使.[self.navigationController.navigationBar setShadowImage:[UIImage new]];二、剪裁navigationBar首先看看UIView的clipsToubounds属性在SDK中的描述&#xff1a;property(nonatom…

Java的未来项目:巴拿马,织布机,琥珀和瓦尔哈拉

新闻稿“ Oracle Code One Java主题演讲概述了Java的未来 ”在Oracle Code“突出未来项目” Valvala 项目&#xff0c;巴拿马 项目&#xff0c;Amber 项目和Loom 项目中描述了Java主旨。 这篇文章为不熟悉上述项目的人提供了每个项目的简要摘要以及与每个项目相关的一些最新工作…

c语言选择题答案在哪查,C语言选择题及答案

C语言选择题及答案成绩的取得离不开我们平时的努力&#xff0c;以下是百分网小编为大家整理的C语言选择题及答案&#xff0c;希望对大家的学习起到帮助!选择题1.在深度为5的满二叉树叶中&#xff0c;叶子结点的个数为( )。A.32B.31C.16D.152.软件生命周期中&#xff0c;花费最多…

vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)

在VS2015中创建Qt项目【VSQt项目开发系列】(二)发布时间&#xff1a;2018-04-20 22:44,浏览次数&#xff1a;1269, 标签&#xff1a;VSQt在上一篇【VSQt项目开发】(一)在VS2015中安装Qt环境中&#xff0c;我们完成了开发环境的安装&#xff0c;现在我们正式创建我们的项目。项目…

c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

2019/04/27 16:02 1.宏的定义&#xff1a;宏定义就是预处理命令的一种&#xff0c;它允许用一个标识符来表示一个字符串。格式如下&#xff1a;#define name(宏名) stuff(字符串)本质就是使用宏名去替代字符串的内容&#xff0c;注意是原封不动的替换&#xff0c;不要自己潜意识…

pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

效果简介仿抖音点赞手势&#xff0c;单击暂停&#xff0c;双击点赞&#xff0c;可连续点击添加多个爱心&#xff0c;特点如下全部效果为代码绘制(爱心图标来自Material Icon的图标)套上在目标Widget外即可使用提供单击与点赞的回调建议复制代码使用&#xff0c;动画可按需修改没…

java8 linq4j_Java 8仍然需要LINQ吗? 还是比LINQ更好?

java8 linq4j长期以来&#xff0c; LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monad &#xff0c;它使C&#xff03;语言跃居Java之前&#xff0c;Java在当时是版本6&#xff0c;但仍在讨论泛型类型擦除的优缺点。 这项…

printf sizeof c语言,你可能对 sizeof(i++) 有点误解。。。

原标题&#xff1a;你可能对 sizeof(i) 有点误解。。。各位&#xff0c;今天还是按照惯例给大家分享一个C语言容易出现的小错误&#xff0c;这也是跟sizeof有关的&#xff0c;问题虽小&#xff0c;却可管中窥豹&#xff0c;话不多说&#xff0c;代码先行&#xff1a;# includei…

mongodb上一篇下一篇_如何使用Microsoft office word—上一篇

从这一期开始&#xff0c;将会逐一介绍Microsoft office的几个常用的软件&#xff0c;例如word ppt excel等&#xff0c;每一个软件将分为几期介绍&#xff0c;这几期介绍word。注意&#xff1a;介绍软件版本是Microsoft office365。如何插入图片首先打开word&#xff0c;点击插…

Java:使用Mockito模拟ResultSet

这篇文章展示了如何使用Mockito模拟java.sql.ResultSet 。 它可用于帮助单元测试代码对ResultSet &#xff08;例如ResultSetExtractor &#xff09;执行操作&#xff0c;而无需依赖外部数据源。 您可以通过提供列名列表和2D数据数组来创建MockResultSet 。 例如&#xff1a; …