tdd 单元测试_何时给定在单元测试和TDD中的重要性

tdd 单元测试

最近,我一直在写与自动测试有关的更高级的概念(主要与Spock有关)。 但是,在进行测试培训时,我清楚地看到,通常对特定工具的知识并不是主要问题。 即使使用Spock,也可以编写肿且难以维护的测试,从而破坏(或不了解)与编写单元测试有关的良好实践。 因此,我决定写一些更基本的东西来促进它们,并且在指导经验不足的同事时准备使用一些参考材料。

介绍

编写良好的单元测试应满足几个要求,这是整个系列的主题。 在这篇博客文章中,我想提出一个相当成熟的概念,即将单元测试划分为具有严格定义的功能的3个单独的块(依次是行为驱动开发的子集)。

单元测试通常集中于测试给定单元(通常是一个给定类)的某些特定行为。 与通过UI执行的验收测试相反,在每个测试中都将存根/模拟作为其协作者,从零开始设置一个要测试的类(测试中的类)比较便宜(快速)。 因此,性能应该不是问题。

样品测试

为了演示规则,我将使用一个小示例。 ShipDictionary是一个类,提供根据特定条件(按名称的一部分,生产年份等)搜索太空船的功能。 该词典由不同的船舶索引(在役,退役,在生产等中的船舶)提供动力。 在那个特定的测试中,它被测试了按其名称的一部分搜索飞船的能力。

private static final String ENTERPRISE_D = "USS Enterprise (NCC-1701-D)";@Test
public void shouldFindOwnShipByName() {
//given
ShipDatabase shipDatabase = new ShipDatabase(ownShipIndex, enemyShipIndex);
given(ownShipIndex.findByName("Enterprise")).willReturn(singletonList(ENTERPRISE_D));
//when
List foundShips = shipDatabase.findByName("Enterprise");
//then
assertThat(foundShips).contains(ENTERPRISE_D);
}

给定时间

测试驱动开发方法和行为驱动开发方法中都存在的良好习惯是“先验”知识,它将在特定测试用例中进行测试(认定)。 可以以更正式的方式(例如,用Cucumber/小Cucumber编写的用于验收测试的方案)或以自由形式(例如,特别注意的要点或只是下一步应该做什么的想法)来完成。 有了这些知识,就很容易确定整个测试将组成的三个关键部分(分开的部分)。

给定–准备

在单元测试的第一部分(称为given )中,需要创建一个实际对象实例,在该对象实例上将执行测试的操作。 在有重点的单元测试中,仅放置一类要测试的逻辑。 另外,执行测试所需的其他对象(称为协作者)应初始化为存根/模拟,并适当存根(如果需要)。 还必须将所有协作者注入到要测试的对象中,该对象通常与该对象创建结合在一起(因为构造函数注入应该是依赖注入的首选技术)。

//given
ShipDatabase shipDatabase = new ShipDatabase(ownShipIndex, enemyShipIndex);
given(ownShipIndex.findByName("Enterprise")).willReturn(singletonList(ENTERPRISE_D));

何时–执行

when部分中,将执行要测试的操作。 在我们的情况下,这是一个搜索请求,然后将结果存储在变量中以供进一步声明。

//when
List foundShips = shipDatabase.findByName("Enterprise");

在大多数情况下,在该部分中仅执行一项操作是一件好事。 更多的元素可能表明尝试测试多个操作(可能)可以分为多个测试。

然后–断言

-最后一节的责任, then -主要是先前接收到的结果的断言。 它应该等于期望值。

//then
assertThat(foundShips).contains(ENTERPRISE_D);

此外,可能有必要对声明的模拟执行方法执行的验证。 这不应该是一种常见的做法,因为在大多数情况下,对接收值的声明足以确认所测试的代码能够按预期工作(根据设置的边界)。 但是,特别是对于测试void方法,需要验证是否已使用预期参数执行了特定方法。

AAA aka 3A –一种替代语法

正如我已经提到的,BDD是一个更广泛的概念,它对于编写具有预先定义的需求(通常是非技术形式)的功能/验收测试特别方便。 一种替代的测试划分语法(对于各节而言,含义非常相似)是“ 配置行为声明”,通常缩写为AAA或3A。 如果您根本不使用BDD,并且三个字母比GWT更容易记住,那么使用它来创建相同的高质量单元测试就很好。

调整与优化

将实用工具和方法学与持续进行的技能获取过程(也称为Dreyfus模型 )进行匹配的过程已在《 实用思维与学习:重构您的湿软件 》一书中进行了很好的描述。 当然,在许多情况下,使用given节移至setup/init/before节或内联初始化的测试的简化变体可能很方便。 同样可以适用于whenthen部分,其可以被合并在一起(成expect部分,特别是在参数化测试)。 具有编写单元测试的经验和流利性,使用速记和优化(尤其是测试一些非平凡的案例)是完全有效的。 只要整个团队都了解约定,并且能够记住有关编写好的单元测试的基本假设。

摘要

根据我在软件开发方面的经验以及作为一名培训师,我清楚地看到,将(单元)测试划分为多个部分可以使它们更短,更易理解,尤其是团队中经验不足的人员。 与明确找出并立即将所有内容写入测试中相比,用明确定义的责任来填充3个部分更容易。 最后,特别是对于仅阅读本文第一部分和最后部分的人们,此处遵循以下简明规则:

  • given –测试中的对象初始化+存根/模拟的创建,存根和注入
  • when –在给定测试中进行测试的操作
  • then –收到结果声明+模拟验证(如果需要)

PS最好在IDE中设置一个测试模板,以保护编写每个测试所需的许多击键。
PSS,您发现本文很有用,您可以让我知道,以鼓励我将来写更多有关单元测试的基础知识。

图片来源:Tomas Sobek,Openclipart, https ://openclipart.org/detail/242959/old-scroll

自我提升 。 您想快速有效地提高您和您的团队的测试技能以及对Spock / JUnit / Mockito / AssertJ的了解吗? 我进行了浓缩(单元) 测试培训 ,您可能会觉得有用。

翻译自: https://www.javacodegeeks.com/2017/05/importance-given-unit-tests-tdd.html

tdd 单元测试

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

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

相关文章

java 设计模式_Java设计模式的常见应用场景

一、Java I/O中的设计模式1、适配器模式适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。通常被用在一个项目需要引用一些开源框架来一起工作时,这些框架的内部都有一些关于…

abaqus实例_使用Python在ABAQUS中创建XYData数据

这篇的正题是要讲一个愚蠢的小故事,无奈之举,恐成笑柄。但是从PythonAbaqus前后处理的角度讲,还是有点意义的,所以才敢拿出来献丑。三年航天器型号研制工作干下来,积累了不少陋习,但内心还是想努力克服的。…

java学习笔记_Java学习笔记day11

Map集合java.util.Map<k,v>集合 Map集合特点&#xff1a; 1.Map集合是一个双列集合&#xff0c;一个元素包含两个值(一个key&#xff0c;一个value) 2.Map集合中的元素&#xff0c;key和value的数据类型可以相同&#xff0c;也可以不同 3.Map集合中掉元素&#xff0c;key…

几点减几点怎么列算式_[股票一般几点可以买入]股票缩量怎么买 | 爱淘股吧

股票一般买入绝技——缩量调整突破买入股票缩量怎么买下面就来详细说说几个买入绝技&#xff1a;第一种&#xff1a;伴随着成交量的缩减。(2)在缩量调整到尾声之后&#xff0c;突然出现一根放量大阳线。(3)大阳线的出现伴随着成交量的放大。其下一个交易日如果股价继续放量上攻…

mqtt服务器数据存储位置,mqtt服务器 数据库

mqtt服务器 数据库 内容精选换一换云服务器备份&#xff1a;云服务器备份可以对普通服务器进行整机备份或部分磁盘备份&#xff0c;不适用于部署了数据库等应用的服务器。支持备份弹性云服务器ECS和裸金属服务器BMS&#xff0c;成本相对于VBS较高&#xff0c;适合对需要备份整个…

固体加热_干货分享| |固体氧化物燃料电池

固体氧化物燃料电池属于第三代燃料电池&#xff0c;是一种在中高温下直接将储存在燃料和氧化剂中的化学能高效、环境友好地转化成电能的全固态化学发电装置。被普遍认为是在未来会与质子交换膜燃料电池一样得到广泛普及应用的一种燃料电池。一般的固体氧化物燃料电池发电系统包…

poi设置列宽自适应_Sentinel 系统自适应限流原理剖析与实战指导

1、Sentinel 系统自适应概述从官方了解到 Sentienl 系统自适应限流是一个全局的概念&#xff0c;对应用入口流量统一进行统一控制&#xff0c;结合应用的机器负载、CPU 使用率&#xff0c;总体平均响应时间、入口 QPS 和并发线程数等几个维度的监控指标从而决定是否调用进行限流…

Hibernate架构概述

下图提供了Hibernate体系结构的高级视图&#xff1a; 最小的架构 “最小”架构使应用程序管理其自己的JDBC连接&#xff0c;并将这些连接提供给Hibernate&#xff1b; 此外&#xff0c;应用程序自行管理交易。 这种方法使用了最少的Hibernate API子集。 综合架构 Hibernate B…

一个服务器多个网站收录效果,8个优化小技巧快速提高网站收录

网站做好了&#xff0c;我们肯定是想要有更多的免费流量进入到我们的网站&#xff0c;那么我们就必须要了解如何快速提升网站收录。下面小编就来给大家分享一下SEO优化中快速提高网站收录的8个优化小技巧&#xff0c;希望对大家有所帮助。1、网站权重评级网站的权重是对于收录影…

铺铜过孔不要十字_谈谈商周青铜器上圈足的镂孔现象

在商代铜器和西周早期的铜器上&#xff0c;常常会看到带有圈足的器物&#xff0c;圈足有的会有一个孔洞&#xff0c;孔洞的形制有圆形的、十字形的、不规则圆形的等&#xff0c;如簋、觚、盘、豆、尊、罍、瓿、卣、觯、壶等&#xff0c;如下&#xff1a;最近&#xff0c;我们读…

gwt格式_GWT的渐进式Web应用程序配方

gwt格式渐进或不渐进… 如果您已经设计或开发Web应用程序已有一段时间&#xff0c;那么您可能会遇到无数次“渐进式Web应用程序”一词&#xff0c;并且可能会在未来几年内使用。 您可能想知道PWA的确切定义是什么&#xff0c;如何识别PWA&#xff0c;以及如何构建PWA。 根据字典…

光学定位与追踪技术_如何为射线光学仿真创建复杂的透镜几何结构

“射线光学模块”扩展了 COMSOL Multiphysics 软件的建模功能,允许用户引入射线追踪仿真。有了该模块&#xff0c;在集成软件环境中对复杂光学系统的热性能、结构及其他方面进行高阶研究不再是一个难题。创建几何模型是仿真成功的第一步。本文以 Petzval 透镜为例&#xff0c;探…

Java与Python:哪一个最适合您? [信息图]

通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 在软件开发中&#xff0c;很少有问题比选择编程语言更具分裂性或部落性。 软件开发人员经常以自己选择的工具来强烈地认同自己&#xff0c;将客观…

怎么把php查询到的值显示到下拉框中_RazorSQL for Mac(数据库工具查询)8.5.3

razorsql mac版更新日志变化 查询结果&#xff1a;如果有多个查询结果选项卡&#xff0c;则从查询结果选项卡中选择比较查询结果选项将填充比较工具中的两个查询 漏洞修补 不需要重新启动razorsql才能生效的首选项需要重新启动 自动更新程序不适用于Windows计算机 缺少HBase连接…

docker删除es数据_木杉入门Elasticsearch(4):安装ES

木杉入门本系列的目标是在本地搭建一个Elasticsearch的服务集群&#xff0c;通过在阿里云服务器搭建FRP通道对外提供服务&#xff0c;为小规模应用提供一种高性价比的解决思路。系列内容&#xff1a;木杉入门Elasticsearch(1)&#xff1a;ESXI虚拟机安装CentOS木杉入门Elastics…

将serversocket 写在按钮事件中连接不上_Java服务器的模型—TCP连接/流量优化

本文很长哦&#xff0c;但请给我一点时间。通常&#xff0c;我们的应用程序不需要并行处理成千上万的用户&#xff0c;也不需要在一秒钟内处理成千上万的消息。我们只需要应付数十或数百个并发连接的用户&#xff0c;就可以在内部应用程序或某些微服务应用程序中承受如此大的负…

ios 开发设置左滑退出_苹果铃声怎么设置自己的歌?教你用手机快速搞定!

苹果手机铃声怎么设置为自己喜欢的歌曲&#xff1f;由于iOS系统的封闭性&#xff0c;想要给苹果手机更换铃声不像在安卓手机一样那么方便&#xff0c;看到网上很多教程也是需要使用电脑才能完成铃声的设置&#xff0c;有没有不复杂的方法来直接帮我们更换手机铃声&#xff1f;别…

基于单片机步进电机ppt答辩_基于MCU和DSP的步进电机控制技术分析

来源 | 控制与传动步进电机已经渗透入我们生活的方方面面&#xff0c;本文介绍了一些重要的步进电机相关技术&#xff0c;为开发人员基本了解步进电机的工作原理提供了足够的信息&#xff0c;同时也介绍了用微控制器或数字信号处理器控制步进电机的方法。步进电机也叫步进器&am…

div获取第一个子节点jquery_【antd】Tree组件子节点不完全勾选获取父节点的值

注意⚠️&#xff1a;这篇文章适用于后台返回的树结构比较多的情况下&#xff0c;如果数据比较少的情况下&#xff0c;可以参考我的上一篇文章&#xff0c;操作起来比较简单我们在实际操作tree组件和后台交互的时候一般都是需要将父节点传过去&#xff0c;如图&#xff1a;点击…

修改value_Python | 快速修改或命名N个文件夹名称,你会吗?

#欢迎交流&#xff1a;shuilinggan163.com#工作中&#xff0c;经常会遇到需要修改或新建很多文件的文件命&#xff0c;是一件重复且头疼的事情&#xff0c;下面一组Python代码&#xff0c;轻松教你快速实现&#xff01;程序一&#xff1a;根据文件(SSSSSS)新建并命名空文件夹im…