java单元测试( Hamcrest 断言)

这篇具有很好参考价值的文章主要介绍了java单元测试( Hamcrest 断言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java单元测试( Hamcrest 断言)

单元测试特征:
1 范围狭窄
2 限于单一类或方法
3 体积小

为什么要编写单元测试?
为了防止错误(很明显!)
而且还可以提高开发人员的生产力,因为单元测试:
(1) 帮助实施——在编码的同时编写测试可以快速反馈正在编写的代码。
(2) 失败时应该易于理解——每个测试在概念上都应该简单,并专注于系统的特定部分。
(3) 作为工程师如何使用被测系统部分的文档和示例(因为书面文档很快就会无可救药地过时)。
在谷歌,80% 的测试都是单元测试。 编写测试的简便性和运行它们的速度意味着工程师每天要运行数千个单元测试。

可维护性的重要性
这个场景有两个关键问题:
(1) 单元测试很脆弱。 它们因无害且无关的更改而中断,该更改没有引入真正的错误。
(2) 单元测试不明确。 很难理解如何修复测试,因为一开始就不清楚测试在做什么。
当代码及其测试有多个贡献者时,这种情况很容易发生(现实生活中的软件项目往往会有很多人同时参与其中)。

争取不变的考验
防止脆弱测试的关键策略是努力编写不需要更改的测试,除非项目的
需求变更:
• 内部重构不应改变测试。
• 新功能应不影响现有功能。
• 错误修复不应要求更新测试。
• 行为改变:这些可能需要改变测试。

Testing Implementation:
java单元测试( Hamcrest 断言)
Verifies implementation using package-private method

Testing Behaviour:
java单元测试( Hamcrest 断言)
This test is using the public API, to the extent of almost
playing a game of Connect4.
The resulting behaviour (a change to the board) is checked using a public method

防止脆性测试
1 仅通过调用公共方法(public methods )进行测试。
2 核实结果是什么,而不是如何实现的。
通过以下方式争取不变的测试:
如果您专注于测试实现而不是行为,您将得到脆弱的测试。
所以总是喜欢针对行为进行测试。

编写清晰的单元测试:

Hamcrest 是一个用于在 Java 中编写富有表现力和可读性的断言的库。 它提供了一组匹配器对象,可以与 JUnit 或 TestNG 等测试框架一起使用,以创建更具描述性和灵活性的断言。

Hamcrest assertions 通过允许您以更流畅和自然的方式构建断言来增强测试的可读性。 您可以使用 Hamcrest 匹配器创建自定义断言,以清晰简洁的方式表达预期行为,而不是仅仅依赖测试框架提供的默认断言方法。

以下是 Hamcrest 断言的一些主要特性和优势:

  1. 流畅易读的语法: Hamcrest 断言使用流畅易读的语法,这使您可以编写非常类似于普通英语语句的断言。 这使得更容易理解断言的意图。

  2. 可扩展和可定制: Hamcrest 提供了一组丰富的内置匹配器,涵盖常见断言,如相等性、可空性、数字比较、集合内容等。 此外,它还允许您创建自定义匹配器来处理内置匹配器未涵盖的特定断言。

  3. 可组合性: Hamcrest 匹配器可以使用“and”、“or”和“not”等逻辑运算符进行组合和组合,使您能够从更简单的断言创建复杂的断言。 这允许更灵活和细粒度的断言。

  4. 诊断消息: Hamcrest 在断言失败时提供详细的诊断消息。 这些消息提供有关预期值和实际值的信息,有助于快速识别断言失败的原因。

下面是将 Hamcrest 断言与 JUnit 结合使用的示例:

导入 org.junit.jupiter.api.Test;
导入静态 org.hamcrest.MatcherAssert.assertThat;
导入静态 org.hamcrest.Matchers.*;

公开课 MyTest {

     @测试
     public void testStringLength() {
         String text = "你好,世界!";
        
         assertThat(文本,是(notNullValue()));
         assertThat(text, containsString("你好"));
         assertThat(文本,hasLength(13));
         assertThat(文本, anyOf(startsWith("H"), endsWith("!")));
     }
}

在此示例中,Hamcrest 匹配器用于对字符串执行各种断言。 assertThat 方法用于将匹配器应用于被测试的实际值(text)。 与默认的 JUnit 断言相比,匹配器(iscontainsStringhasLengthanyOf)提供了更具表现力和描述性的断言。

通过使用 Hamcrest 断言,您可以编写更具可读性和表达力的测试,从而更容易理解预期行为并提高测试代码的整体质量。

另一个示例:
java单元测试( Hamcrest 断言)

实际结果和预期结果之间的关系由匹配器指定,在本例中为 equalTo。

Hamcrest 匹配器
Hamcrest 有很多“匹配器”,比如 equalTo。
他们可以帮助编写涉及多种类型的断言,包括:
• 字符串——例如,可以检查字符串是否包含子字符串、忽略大小写等。
• 集合——元素是否在集合中; 集合包含什么,忽略顺序等。
如果没有合适的匹配器,很容易编写自己的匹配器。
请参阅 https://www.baeldung.com/java-junit-hamcrest-guide

使您的测试完整而简洁
确保测试包含读者了解它如何得出结果所需的所有信息。
确保它不包含其他不相关和分散注意力的信息。
当测试用例的主体包含读者理解它如何得出结果所需的所有信息时,测试用例就完成了。

当这两个测试用例的主体包含读者需要了解其如何得出结果的所有信息时,这两个测试用例就完成了。
java单元测试( Hamcrest 断言)
java单元测试( Hamcrest 断言)
枚举所有的动作使得方法更长并且防止将移动序列重新用作辅助方法,但更清楚发生了什么。 棋盘上增加了两列垂直棋子,红色在第 0 列获胜

不要DRY测试
DRY——不要重复自己:工程师需要更新一段代码而不是跟踪所有实例。
缺点:可以使代码不那么清晰,需要遵循引用链。
为了使代码更易于使用,这可能是一个很小的代价……但是成本/收益分析在测试中的表现不同:
• 我们希望测试在软件更改时中断
• 生产代码具有测试套件的优势,可确保在事情变得复杂时它仍能正常工作。 测试应该独立存在!(当测试需要测试时出了问题)

湿而不干(DAMP not DRY)
DAMP:描述性的和有意义的短语
DAMP 不能替代 DRY——它是补充。
“助手”方法可以通过使测试更简洁来帮助使测试更清晰——分解出重复的步骤,这些步骤的细节与被测试的行为无关。
但是重构应该着眼于使测试更具可读性和描述性,而不仅仅是为了减少重复。
不要包括清晰和简洁。

当测试用例不包含其他分散注意力或不相关的信息时,它就是简洁的。
java单元测试( Hamcrest 断言)
我们的测试现在包括很多不需要的动作在测试场景并使电路板更难可视化以及测试结果应该是什么。

不要测试方法——测试行为
但是一个方法可能有不止一种行为和/或一些需要更多测试的棘手的极端情况。
例如,makeMove 可以有多种行为,具体取决于棋盘的状态。
对该方法的一次测试没有任何意义,并且可能不是很清楚也不简洁。
更好的方法:为每个行为编写测试。

测试行为
行为是系统在特定状态下如何响应一系列输入的保证。
行为可以表示为“给定 X,当 Y,然后 Z”
例如:
给定一个 Connect4 棋盘,RED 首先开始,当 RED 下了一个棋子后,接下来就轮到 YELLOW 了。

编写行为驱动的测试
行为驱动的测试更倾向于阅读自然语言,因此相应地构建它们
java单元测试( Hamcrest 断言)
在被测试的行为之后命名测试.
一个好的名称描述了正在测试的动作(“何时”)和预期结果(“然后”),有时还描述了状态(“给定”)。
一个好的技巧是以“应该”开头的名称,例如
shouldInitializeCorrectly
shouldChangePieceAfterTurn
shouldEndGameWithWinnerWhenFourInARowHorizontally etc.

不要把逻辑放在测试中
不要在测试或逻辑操作中放置条件或循环。
测试应该读作简单的事实陈述,而不是同样需要测试的代码块!
java单元测试( Hamcrest 断言)
最好只初始化一个较小的 2x2 板并明确检查每个位置

Making Your Unit Tests Clear
1 Make your tests concise and complete (DAMP and not too DRY!)
2 Don’t structure tests around methods – instead structure around behaviours
3 Use the Given-When-Then pattern for testing behaviour
4 Name Tests after the Behaviour Being Tested
5 Don’t put logic in tests文章来源地址https://www.toymoban.com/news/detail-463749.html

到了这里,关于java单元测试( Hamcrest 断言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python单元测试框架之pytest -- 断言

    对于测试来讲,不管是功能测试,自动化测试,还是单元测试。一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果。测试的成功与否就是拿实际的结果与预期的结果进行比较。这个比的过程实际就是断言(assert)。 在unittest单元测试框架中提供

    2024年02月11日
    浏览(64)
  • 精进单元测试技能 —— Pytest断言的艺术!

    本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过  assert  语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如: 然而除此之外,Pyt

    2024年02月03日
    浏览(37)
  • 精进单元测试技能——Pytest断言的艺术

    本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过  assert  语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如: 然而除此之外,Pyt

    2024年01月20日
    浏览(82)
  • 白盒测试(单元测试使用assertThat中equalTo断言)

    题目1 :根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“a=x:”(x为2、3或4);其中变量x、y均须为整型。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试,测试类中设计最少的测试数据满足语句覆盖测试,每条测试数据需要在测试类中

    2024年02月13日
    浏览(40)
  • 【单元测试】Junit 4(三)--Junit4断言

    ​ **断言(assertion)**是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。 这里我们直接上例子 接下来我们

    2024年02月08日
    浏览(52)
  • C++中的断言机制与gtest单元测试

       这部分内容网上已经有很多人讲了,我就不做重复性工作,制造垃圾了,大家看看下面两个链接就可以了,因为我的专栏除了分享自己学习的知识,主要想为大家提供完整学习路线,让大家的知识体系更加完善! (1)参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (1)参考:

    2023年04月08日
    浏览(102)
  • 白盒测试(单元测试JUnit使用断言assertThat中startsWith、endsWith方法)

    目录 一、背景知识 二、assertThat-字符串相关匹配符 1、startsWith 2、endsWith 三、代码

    2024年02月07日
    浏览(41)
  • spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试

    spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试 本文基于spirng boot 2.7.11, 大家注意自己的版本 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖 源码地址:https://gitcode.net/qq_39339588/springboot.git 1.

    2024年02月11日
    浏览(49)
  • 【单元测试】一文读懂java单元测试

    单元测试 是软件开发中常用的一种测试方法,用于验证代码的单个功能单元是否按照预期工作。 测试方法: 白盒测试(White Box Testing):在白盒测试中,测试人员了解代码的内部结构和实现细节,编写测试用例来覆盖不同的代码路径和逻辑条件。 黑盒测试(Black Box Testing)

    2024年04月17日
    浏览(46)
  • 单元自测Java 单元测试规范

    目录 1、前言 1.1 定义 1.2 单元测试CheckList 1.3 测试模型 1.3.1 冰淇淋模型 1.3.2 金字塔模型 1.4 为什么要做单元测试 1.5单元测试编码规则 1.6 单元测试用例的设计要素  2、测试框架介绍 3、单元测试开发规范 3.1 注意事项 3.2 命名规范 3.3 输入数据规范 3.4 结果校验规范         单

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包