用置换破坏您的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,一经查实,立即删除!

相关文章

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

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

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

1&#xff0c;什么是字符串&#xff1f;所谓字符串本质上就是以\0作为结尾的特殊字符数组&#xff1b;2&#xff0c;定义字符串的过程中有哪些注意点由于字符串本质上其实就是以\0作为结尾的特殊字符数组&#xff0c;所以定义字符串时&#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;但仍在讨论泛型类型擦除的优缺点。 这项…

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

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

Istio的零停机滚动更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术&#xff08;例如Istio&#xff09;通常与容器编排结合使用。 Istio以…

android 设置资源,Android 资源

Android 资源Android Resources02/01/2018本文内容本文介绍了 Xamarin 中 Android 资源的概念&#xff0c;并介绍了如何使用这些资源。其中介绍了如何使用 Android 应用程序中的资源来支持应用程序本地化和多个设备&#xff0c;包括不同的屏幕大小和密度。This article introdu…

仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?

摩拜单车通过车身携带的GPS而实现单车定位&#xff0c;但是我们知道ofo是没有安装GPS&#xff0c;它又是如何实现单车定位的呢&#xff1f;我居住的地方距离地铁站步行大约15分钟左右&#xff0c;距离最近的商场步行将近30分钟&#xff0c;距离周边的便利店,水果店,饭店等步行1…

gprs连接中断记录_请收好!脉搏波血压计连接天天血压APP使用指南

总有那么几个粗心的小伙伴丢失了说明书&#xff0c;在后台追问波哥如何连接“天天血压”&#xff0c;于是给大家安排了这篇使用指南。首先我们来了解下“天天血压”的功能&#xff1a;1.通过蓝牙或GPRS传输&#xff0c;同步记录每次测量结果&#xff1b;2. 血压趋势分析&#x…

使用Spring Boot,JHipster和React构建照片库PWA

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 从本质上讲&#xff0c;React只是一个UI工具包&#xff0c;即ala GWT&#xff0c;但是…

names文件和data文件_data.table让你的读取速度提升百倍

不知道大家有没有用read.table和read.csv读取过文件&#xff0c;当文件不大的时候你可能还感觉不出读取速度&#xff0c;但是当文件比较大的时候&#xff0c;比如有上万行的时候&#xff0c;你就会感觉到等待时间明显变长&#xff0c;甚至无法忍受。今天小编给大家安利一个实用…

差分放大电路差模共模公式_提高差分放大器的共模抑制比,电阻的选择很关键...

在各种应用领域&#xff0c;采用模拟技术时都需要使用差分放大器电路。例如测量技术&#xff0c;根据其应用的不同&#xff0c;可能需要极高的测量精度。为了达到这一精度&#xff0c;尽可能减少典型误差源(例如失调和增益误差&#xff0c;以及噪声、容差和漂移)至关重要。为此…

label标签 html5,HTML5 label 标签

实例HTML5 标签用于为 input 元素做出标记。带有两个输入字段和相关标记的简单 HTML 表单&#xff1a;MaleFemale尝试一下 浏览器支持目前大多数浏览器支持 标签。标签定义及使用说明标签为 input 元素定义标注(标记)。label 元素不会向用户呈现任何特殊效果。不过&#xff0c;…

me shy是什么歌 抖音make_抖音星河滚烫你是人间的理想下一句是什么歌 星河歌词完整版...

最近在抖音上听到一段话&#xff0c;这段话的开头是“星河滚烫&#xff0c;你是人间的理想……”。抖音星河滚烫你是人间的理想下一句是什么歌&#xff1f;星河歌词介绍&#xff1f;星河&#xff0c;是非常好听的一首歌曲&#xff0c;是很多人都喜欢的一首歌曲。抖音星河滚烫你…

修改使用计算机的名称,Windows 10中修改计算机名称的方法,你知道几种?

当用户新入手一台电脑时&#xff0c;通常做的第一件事就是做一些个性化设置。一般来说个性化的第一步就是给计算机起一个自己满意的名字&#xff0c;下面介绍几种修改计算机名字的方法。通过设置更改计算机名字按WinI键进入设置,在设置窗口中找到“系统”&#xff0c;点击它。在…

apollo 参数传递_使用Apollo通过WebSocket通过STOMP轻松进行消息传递

apollo 参数传递在我以前的文章中&#xff0c;我介绍了几个有趣的用例&#xff0c;这些用例使用著名的消息代理HornetQ和ActiveMQ通过Websockects实现STOMP消息传递。 但是我没有介绍的是Apollo&#xff0c;因为我个人认为它的API是冗长的&#xff0c;并且不像Java开发人员那样…

使用IntelliJ调试Java流

流功能非常强大&#xff0c;只需几行就可以捕获您预期功能的要点。 但是&#xff0c;就像它们在一切正常工作时一样平滑&#xff0c;就像它们在表现不正常时一样令人痛苦。 了解如何使用IntelliJ调试Java Streams并深入了解Stream的中间操作。 在本文中&#xff0c;我将在示例…

echart 饼图每一块间隙_花10分钟做酱香饼,简单方便又美味,酥脆咸香比买的还要好吃...

花10分钟做酱香饼&#xff0c;简单方便又美味&#xff0c;酥脆咸香比买的还要好吃前几年&#xff0c;在单位附近有一家只做酱香饼的小店&#xff0c;刚开张的时候排很长队&#xff0c;我为了一块酱香饼排队半小时。后来买酱香饼的人少了&#xff0c;我三天两头买一块酱香饼解馋…

404 单页应用 报错 路由_通过 Laravel 创建一个 Vue 单页面应用(五)

文章转发自专业的Laravel开发者社区&#xff0c;原始链接&#xff1a;https://learnku.com/laravel/t/34858我们在第4部分完成了编辑用户的功能&#xff0c;并且学习了如何使用 v-model 来监听视图组件中用户信息的更改。现在我们可以开始构思删除用户功能&#xff0c;以及删除…

使用计算机求解雷达方程,关于雷达方程

满意答案zjit99402014.01.27采纳率&#xff1a;41% 等级&#xff1a;12已帮助&#xff1a;2803人带宽校正系数是Co而不是Do.我们知道雷达接收到回波信号后&#xff0c;必须进行信号处理&#xff0c;使中频接收机的输出端(检波器的输入端)输出的信号和噪声功率比(简称信噪比)…

7500 cpuz跑分 i5_小米Pro笔记本亮相跑分网站:处理器包含AMD Zen3、11代酷睿

2020年已经接近尾声&#xff0c;随之而来的将会是一大波新品发布会&#xff0c;不仅是手机&#xff0c;笔记本电脑、显卡等产品也会有新品亮相。一年一度的CES 2021也即将开幕&#xff0c;届时英特尔、英伟达、AMD等知名厂商也都将出席活动。据悉&#xff0c;英特尔将推出11代酷…