assertj_AssertJ的SoftAssertions –我们需要它们吗?

assertj

编写好的单元测试的规则之一是,它应该由于一种原因而失败,因此,单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则,我们可能在单个测试中每个对象具有多个断言。

但是,在一个测试中存在多个断言的问题在于,如果第一个断言由于任何原因而失败,我们实际上将不知道其他断言,因为它们将不会被执行。 并且您知道了演练:您检查断言失败原因,进行修复,然后重新运行测试。 也许您很幸运,测试会通过。 但是也许它将因另一个断言而失败。 对于真正快速的单元测试,这不是什么大问题,但是例如,在进行Selenium测试时,分析和故障检测可能会变得很麻烦并且肯定会很费时。

幸运的是,借助AssertJ的SoftAssertions ,我们可以重新考虑在测试中创建断言的SoftAssertions

一个宣称可以统治所有人的主张!

在假设的Dice游戏中,有一个Score对象,其中保存得分值,骰子组合和提醒。 在单元测试中,我们可能想验证不同骰子组合的分数是如何计算的。

在下面的示例中,验证了一个概念(分数对象):

@Test
public void verifiesScore() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();assertThat(score.getValue()).as("Has score").isEqualTo(8);assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));
}

如您所见,所有三个断言都失败了,但是由于第一个失败后测试的执行停止,因此我们只会看到第一个失败的结果:

org.junit.ComparisonFailure: [Has score] 
Expected :8
Actual   :11

引入

为了解决这个问题,我们可以使用SoftAssertions ,它将在调用assertAll()方法时立即收集所有断言的结果:

@Test
public void verifiesScoreSoftly() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();SoftAssertions softAssertions = new SoftAssertions();softAssertions.assertThat(score.getValue()).as("Has score").isEqualTo(8);softAssertions.assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));softAssertions.assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));softAssertions.assertAll();
}

现在我们可以验证测试中的所有断言失败:

org.assertj.core.api.SoftAssertionError: 
The following 3 assertions failed:
1) [Has score] expected:<[8]> but was:<[11]>
2) [Has combination] expected:<...alue=3}, Dice{value=[3]}]> but was:<...alue=3}, Dice{value=[4]}]>
3) [Has reminder] expected:<[Dice{value=[5]}]> but was:<[Dice{value=[6]}]>

JUnitSoftAssertions

代替手动创建SoftAssertions并调用其assertAll()我们可以使用JUnit @Rule

@Rule
public JUnitSoftAssertions softAssertions = new JUnitSoftAssertions();@Test
public void verifiesScoreSoftlyUsingRule() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();softAssertions.assertThat(score.getValue()).as("Has score").isEqualTo(8);softAssertions.assertThat(score.getCombination()).as("Has combination").isEqualTo(dice(1, 1, 3, 3));softAssertions.assertThat(score.getReminder()).as("Has reminder").isEqualTo(dice(5));
}

我们不仅不需要记住调用assertAll()而且还可以在IntelliJ的比较编辑器中看到潜在的失败:

0B0b09VuqaAG8WGxhUUhxdmZfa3M

自定义

为了提高分数验证的可读性和可重用性,我们可以创建一个自定义断言,以便可以按以下方式使用它:

@Test
public void verifiesScoreSoftlyWithCustomAssertion() {Score score = Score.scoreBuilder().withValue(11).withCombination(dice(1, 1, 3, 4)).withReminder(dice(6)).build();SoftScoreAssertion.assertThat(score).hasValue(8).hasCombination(dice(1, 1, 3, 3)).hasReminder(dice(5)).assertAll();
}

SoftScoreAssertion使用SoftAssertions ,因此我们仍然会立即看到所有断言错误。 和代码:

class SoftScoreAssertion extends AbstractAssert<SoftScoreAssertion, Score> {private SoftAssertions softAssertions = new SoftAssertions();protected SoftScoreAssertion(Score actual) {super(actual, SoftScoreAssertion.class);}public static SoftScoreAssertion assertThat(Score actual) {return new SoftScoreAssertion(actual);}public SoftScoreAssertion hasValue(int scoreValue) {isNotNull();softAssertions.assertThat(actual.getValue()).as("Has score").isEqualTo(scoreValue);return this;}public SoftScoreAssertion hasReminder(List<Dice> expected) {isNotNull();softAssertions.assertThat(actual.getReminder()).as("Has reminder").isEqualTo(expected);return this;}public SoftScoreAssertion hasCombination(List<Dice> expected) {isNotNull();softAssertions.assertThat(actual.getCombination()).as("Has combination").isEqualTo(expected);return this;}@Overridepublic SoftScoreAssertion isNotNull() {softAssertions.assertThat(actual).isNotNull();return this;}public void assertAll() {this.softAssertions.assertAll();}
}

资源资源

  • http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#soft-assertions
  • https://github.com/joel-costigliola/assertj-core/wiki/Creating-specific-assertions

源代码

  • 可以在我在GitHub上的unit-testing-demo项目中找到本文的源代码: https : //github.com/kolorobot/unit-testing-demo 。

翻译自: https://www.javacodegeeks.com/2015/09/assertjs-softassertions-do-we-need-them.html

assertj

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

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

相关文章

用C/C++语言代码实现一个虚拟机

点击蓝字关注我们本文将教你编写一个自己的虚拟机&#xff08;VM&#xff09;&#xff0c;这个虚拟机能够运行汇编语言编写的程序&#xff0c; 例如我朋友编写的 2048 或者我自己的 Roguelike。如果你会编程&#xff0c;但希望 更深入地了解计算机的内部原理以及编程语言是如何…

python对列表中的数值进行统计运算_python-从单词列表中计算元音并返回数字作......

您正在提供一个列表,但是您的逻辑仅适用于单个字符串&#xff1a; number_of_vowels(Bean) # [2] 您需要调整函数的输入,或者修改函数以计算列表中每个元素的元音数量.由于您希望输出为数字列表,因此我假设您正在寻找第二个选项. 为此,只需在列表理解中添加一个额外的for子句&a…

杜克大学_记录链接:与杜克一起玩

杜克大学最近&#xff0c;我在记录链接方面变得非常有趣&#xff0c;并遇到了Duke项目&#xff0c;该项目提供了一些工具来帮助解决此问题。 我以为我会尝试一下。 进行记录链接时的典型问题是&#xff0c;我们有两个来自不同数据集的记录&#xff0c;它们代表同一实体&#x…

嵩天python笔记_嵩天Python学习笔记-05

文件和数据格式化 文本文件和二进制文件 # 文本形式打开文件 tf open("f.txt", "rt") printf(tf.readline()) tf.close() 文件的打开和关闭 文件处理的步骤&#xff1a;打开->操作->关闭 a.open( <文件名>, <打开模式> ) # 打开文件 # …

web编程 端口分配_以编程方式衡量分配

web编程 端口分配我从Heinz Kabutz撰写的Java专家通讯中获得了这个技巧。 &#xff08;对于所有想要了解JDK内容的Java开发人员来说&#xff0c;这是绝对必要的&#xff01;&#xff09; 特别是对于编写低延迟代码的开发人员&#xff0c;即使对于普通的Java代码&#xff0c;分…

C++—vector的使用

点击蓝字关注我们一、vector的介绍说的简单点&#xff1a;vector是可以动态增长的数组容器vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。…

python词频统计完整步骤_Python中文文本分词、词频统计、词云绘制

本文主要从中文文本分词、词频统计、词云绘制方面介绍Python中文文本分词的使用。会使用到的中文文本处理包包括&#xff1a;wordcloud,jieba&#xff0c;re&#xff08;正则表达式&#xff09;,collections。 1 准备工作 导入相关的包&#xff0c;读取相关数据。 #导入包 impo…

现代 C++ 测试工具链

点击蓝字关注我们gtest的问题gtest需要安装有时候带来很多不方便&#xff0c;比如需要经常切换gcc和clang的时候就比较麻烦&#xff0c;安装的gtest可能在另一个编译器下编译不过, 编写跨平台程序的时候需要多次安装gtest&#xff0c;非常不便。另外一个问题是网络原因&#xf…

数据结构压缩_将数据压缩到数据结构中

数据结构压缩这个故事是关于我们最近在Plumbr进行的容量优化任务。 一切始于将无害的要求添加到现有组合中。 您可能知道&#xff0c;Plumbr监视解决方案作为连接到服务器的Java代理分发。 只需少量添加即可跟踪一段时间内所有已连接的代理&#xff0c;以便可以实时回答以下问…

python打开软件输入消息_用Python编写一个私人助理程序,为我们起草电子邮件!...

在你的工作中是否有一些你自己经常做重复的任务?这就是编程的乐趣所在。通过一些思考和编程&#xff0c;您可以使您的任务自动化&#xff0c;并为您节省大量时间。在本文中&#xff0c;我们将介绍一些Python工具和技巧&#xff0c;让你可以创建自己的Python个人助理。1. 助手功…

swing 状态视图分离_Java Swing模型视图适配器介体

swing 状态视图分离通常&#xff0c;我基于Spring Framework构建Java应用程序。 但是&#xff0c;最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序&#xff0c;因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续学习&…

超级炫酷的C语言技巧!

点击蓝字关注我们C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单&#xff0c;并且仍然有一些非常有用的语法技巧和功能&#xff0c;只是没有多少人知道罢了。一、指定的初始化很多人都知道像这样来静态地初始化数…

webgl 基础渲染demo_WebGL + ThreeJS 实现实时水下焦散 Part 1

知乎视频​www.zhihu.com采用 WebGL 和 ThreeJS 运行实时焦散运算&#xff0c;需要一点相关基础。本文主要介绍焦散的原理以及计算方法原作者https://github.com/martinRenou​github.com代码和原文https://github.com/martinRenou/threejs-caustics​github.com由于本人的笔电…

python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间

我正在编写一个简单的应用程序&#xff0c;它将大文本文件拆分为较小的文件&#xff0c;并且我已经编写了2个版本&#xff0c;一个使用列表&#xff0c;另一个使用生成器。我使用memory_profiler模块对这两个版本进行了概要分析&#xff0c;并清楚地显示了生成器版本的更好的内…

超硬核C++BestPractices翻译与阅读笔记

点击蓝字关注我们硬货开始这本书的副标题是&#xff1a;45ish Simple Rules with Specific Action items for better C ,这本书是由大佬推荐的&#xff0c; C学习有必要掌握一下这45条最佳实践&#xff0c; 可以很大程度上提升代码的可读性和健壮性&#xff0c; 而且这本书也不…

redis集成spring_将Redis集成到您的Spring项目中

redis集成spring本文介绍如何通过注释配置将Redis缓存集成到您的spring项目中。 我们将从Gradle配置开始。 我们将使用jedis驱动程序。 group com.gkatzioura.spring version 1.0-SNAPSHOTapply plugin: java apply plugin: eclipse apply plugin: idea apply plugin: spring…

Python3实现翻转二叉树问题

Python3实现翻转二叉树问题翻转一棵二叉树。# 二叉树的结构如下 class TreeNode:def __init__(self, x):self.val xself.left Noneself.right None# 解决方案 class Solution:# 从根节点开始递归翻转其左子树和右子树def invertTree(self, root: TreeNode) -> TreeNode:i…

diskgenius单文件专业版_金蝶KIS专业版系列——系统工具六(业务套打工具)

导读&#xff1a;&#xff08;一&#xff09;问一问1.1.套打的作用1.2.举例&#xff08;二&#xff09;怎么进入套打设计器2.1.入口12.2.入口2&#xff08;三&#xff09;怎么使用套打设计器打开套打模板3.1.打开系统标准套打模板3.2.新建一个空白的套打模板3.3.保存套打模板3.…

面试常问的16个C语言问题,你全会吗?

点击蓝字关注我们金三银四不少小伙伴在找工作&#xff0c;这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题&#xff0c;你看看能做到全会吗&#xff1f;1、用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09…

高性能 高可用 可弹性伸缩_性能,可伸缩性和活力

高性能 高可用 可弹性伸缩本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01;…