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前后处理的角度讲,还是有点意义的,所以才敢拿出来献丑。三年航天器型号研制工作干下来,积累了不少陋习,但内心还是想努力克服的。…

常量和字面量的区别

字面量 是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值,如:int a123这里的a为左值,123为右值。 常量 常量和变量都属于变量,只不过常量是赋过值后不能…

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…

slice_Spring Boot Web Slice测试–示例

sliceSpring Boot 引入了一段时间的测试切片 &#xff0c;花了我一些时间来研究它并探索它的一些细微差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping("/u…

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

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

Java关键字和标识符

public class HelloWorld { // public、class 是关键字&#xff0c;HelloWorld是标识符public static void main(String[] args) { // public、static、void是关键字&#xff0c;main、String、args是标识符System.out.println("Hello,World!"); // System、out、pri…

python可视化水平双向箭头_python数据可视化第二弹

代码模板&#xff1a;最前面importpandas as pdpd.plotting.register_matplotlib_converters()importmatplotlib.pyplot as plt%matplotlib inlineimportseaborn as snsprint("Setup Complete")View Code一、折线图Line chartsplt.figure(figsize(14,6))#Add titlepl…

扩展 junit 框架_JUnit 5扩展模型的生命周期

扩展 junit 框架JUnit5最终版本即将来临 &#xff08;当前是M4&#xff09;&#xff0c;我已经开始尝试如何编写扩展了。 在JUnit5中 &#xff0c;您没有使用Runners &#xff0c; Rules &#xff0c; ClassRules等&#xff0c;而是只有一个Extension API来实现自己的扩展。 …

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

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

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

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

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

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

路径和目录的区别

路径&#xff1a; 终点是目标文件&#xff0c;才叫路径&#xff0c;举例&#xff1a;/Users/liaowenxiong/Downloads/SoftWare for Mac/liaowenxiong.txt 这里的终点就是txt文件&#xff0c;这叫路径&#xff0c;路径是可以直接找到目标文件的。 目录&#xff1a; 终点是文件夹…

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;我们读…

解决eclipse中出现Resource is out of sync with the file system问题

在eclipse中搜索时&#xff0c;搜索完之后有时候会弹出错误对话框&#xff0c;错误摘录如下&#xff1a; Resource is out of sync with the file system… 分析&#xff1a; 有时候因为时间紧迫的原因&#xff0c;所以就没去管它&#xff0c;今天再次遇到它&#xff0c;实在看…

python 字体_python docx字体设置

首先引入依赖包from docx import Documentfrom docx.oxml.ns import qnfrom docx.shared import Pt,RGBColor如果不进行字体手动设置的话&#xff0c;生成的文字字体格式就会千奇百怪&#xff0c;如下图Doc Document()Doc.add_heading("刚来csdn&#xff0c;这就是博客么…

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

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

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

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