高效的企业测试–测试框架(5/6)

本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。

关于测试框架的思考

我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了一些语法上的便利性和便利性,但本质上并不能解决拥有可维护的测试代码的问题。 换句话说,如果没有特定的测试技术就无法维护您的测试套件,那么仅通过引入另一个测试框架就很难改善它。

我声称,具有可读的测试代码的最大影响是通过精心设计测试代码的API和组件以及适当的抽象和委托来引入的。 这不依赖任何技术,而是在纯Java中完成的,在可以由JUnit执行的测试用例中。 为了验证特定步骤, AssertJ已经证明自己很不错。 我们可以定义特定于我们的业务逻辑的自定义断言,从而进一步提高代码的可读性。 如果测试用例需要模拟超出范围的类,则Mockito可以出色地完成这一工作。

我声称这些测试技术已经足够。 尤其是JUnit 5的出现,进一步增强了如何设置动态或参数化测试套件的功能。

尽管如此,仍有一些测试框架值得研究。 我完全不反对引入进一步的测试技术,因为它们无疑可以提高测试期间的可读性和效率。 但是,我声称关注测试代码质量至关重要,其他测试框架是可选的。

Spock是随Groovy API一起提供的测试框架,该框架相当知名,并已在项目中使用,目的是提高可读性和可维护性。 但是,我仍然会问这个技术能带来多少好处。 如果开发人员对其语法和方法感到满意,那很好; 但是,如果该项目完全是用Java编写的,那么与其提供的好处相比,可能需要更多的精力来管理和配置其他依赖项。 根据经验,我们花了很多时间在所有开发机器,CI / CD环境上配置Groovy及其版本,以及配置Maven构建。 由于我声称最大的投资回报来自测试代码质量,而不管所使用的技术如何,因此在复杂项目中使用Spock这样的框架的实际好处是很小的。

Testcontainers是一项在测试生命周期内设置和管理Docker容器的技术。 它使开发人员能够编排本地测试环境,其中可能包括被测应用程序,外部系统,模拟服务器或数据库。 这个开源项目在后台使用Docker的Java包装器,并将容器生命周期绑定到测试运行时。

尽管这种方法可以非常方便地在我们的测试用例中定义整个环境,并将管理减少到一个入口点,即执行Java测试类,但我通常主张不要将测试方案与测试环境生命周期相结合。 。 在每个测试案例中重新启动和重新部署本地测试环境会花费大量时间,并会减少即时反馈。 为了最大程度地减少整个周转时间,开发人员应该使本地环境长时间运行,并针对该环境运行幂等测试方案。 如果测试用例不影响生命周期,则更易于管理该设置。 将来,Testcontainer可以使声明的容器运行超出测试用例。 但是,在我看来,通过外壳程序脚本,Docker compose或Kubernetes在外部定义生命周期更加清晰,容易定义,而无需使用其他抽象。 过去,Docker Java包装器存在一些小问题,例如,当config JSON文件的格式更改时。 在我看来,诸如将工具包装到Java API中这样的抽象的优点通常不是很大,但是它们在配置和维护方面需要付出一定的努力,并且我们常常最终围绕它们的局限性建立解决方法。

因此,我仍然认为它是使用(bash)脚本或单独执行的类似方法来设置本地测试环境的最简单解决方案。 因此,明确定义了管理环境,设置和拆卸的责任; 测试方案仅使用并验证本地环境,并且可以立即运行。 直接使用shell脚本或技术(例如Docker Compose)可能并不那么花哨,但与您可以花多少时间(基于Java的)抽象相比,与管理依赖项,配置运行时和整合生命周期。 理想情况下,我们定义一个动作来在开发过程中设置本地环境。 我们的CI / CD管道可以使用类似的方法,也可以使用更复杂的设置,例如无论如何将我们的应用程序部署到Kubernetes集群。

使用普通技术运行测试的另一个好处是,通常可以轻松地将测试方案重新用于其他测试范围。 例如,当我们使用JAX-RS客户端而不是Restassured在测试场景中连接到我们的应用程序时,我们可以轻松地提取这些场景并重用代码来驱动性能或压力测试。 通过简单地交换一些较低级别的组件来定义对多个测试范围有效的测试方案时,情况也是如此。 测试框架修改和影响测试生命周期的次数越多,重用就变得越困难。 通常,我主张将测试生命周期,方案以及方案中各个步骤的实现的关注点分开。

Cucumber是一项可以轻松在多个范围内重用测试场景的技术。 我喜欢以一种非常抽象的方式定义方案并分别实现执行的方法。 最好用人类语言的Gherkin定义测试用例,最好是从纯粹的业务角度出发,而不会出现技术漏洞。 测试用例的实现可以互换。 这有点迫使在这些层之间切割。 在某些项目中,已证明在黄瓜测试中使用Gherkin格式可以与缺乏编程经验或没有编程经验的业务领域专家或人们进行交流。 相反,我还看到领域专家和QA工程师,如果测试场景方法简短且在测试内容中表现力十足,则他们非常擅长阅读Java代码。 我们对方法和内部API的命名越清楚,其他人就越能像prose一样阅读代码。 这项经验肯定了这样一种想法,即在精心制作的Java代码之上不一定需要其他技术。

通常,项目越复杂,测试技术对生产率,可读性和可维护性的影响就越小,并且它变得越重要,我们关心测试代码的质量,正确设计的抽象层以及关注点的分离。 如果开发人员希望在此基础上使用其他技术,那很好,但是我们需要注意一些折衷,例如,配置替代的JVM语言需要花费多少时间,它的依赖项和版本以及附加的权重。与在某些层上使用语法糖相比,我们的堆栈具有另一种技术。 可读性和可维护性来自于精心设计适当的抽象层,分离关注点和命名。 清楚地说明断言失败时出错的原因主要来自断言技术,例如AssertJ,它在提供开发人员由于某种原因而导致断言失败方面做得很好,因为开发人员首先做了断言。

如果您观看有关测试的演示中的教程或演示,这是我经常看不到的。 如果我们看简单的,类似Hello World的示例,那么适当的测试代码质量和结构的重要性可能不会马上就变得显而易见,而在小情况下,添加的语法糖似乎会带来巨大的收益。

本系列的下一部分和最后一部分将简要介绍其他端到端测试。

翻译自: https://www.javacodegeeks.com/2019/10/efficient-enterprise-testing-test-frameworks.html

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

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

相关文章

linux 源码 目录,Linux系统主要目录及kernel源代码目录

1.在安装Linux后,先要了解清楚系统主要目录到底是干什么用的,避免以后再操作上的失误等。下面,就对Linux主要目录做一下简要说明:/boot:系统启动相关的文件,如内核、initrd,以及grub(bootloader…

[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)

通过超过62个小时的培训来掌握最流行的编程语言,从而树立良好的开发生涯 嘿,怪胎, 这一周,我们JCG促销专区 ,我们有另一个极端的报价 。我们正在提供一个巨大的96%off的完整2020 Python编程认证捆绑 。 立…

linux nc命令测试端口,Linux和Windows下的NC(Netcat)命令测试端口连通性

1、Linux OS 环境下(以Centos为例),使用nc命令分别测试TCP和UDP端口连通性:css安装方法:nginx在客户端和服务器端分别安装nc工具,安装命令以下:webyum install nc1. Linux OS下使用nc命令,实现TCP方式监听服…

javafx css颜色_JavaFX技巧7:使用CSS颜色常量/派生颜色

javafx css颜色在使用FlexCalendarFX时,我不得不定义一组颜色以可视化不同颜色的不同日历的控件。 每个日历不仅提供一种颜色,还提供几种:用于取消选择/选定/悬停状态的背景和文本颜色。 颜色曾在多个地方使用过,但为了简洁起见&…

rowspan不显示 wpf_wpf的datagrid绑定datatable列不自动更新解决方案

wpf的datagrid绑定datatable列不自动更新描述如下:想利用程序实现显示NORTHWND.MDF中的所有表。listbox显示数据库中的表清单,选中listbox里面的一项以后,在datagrid中显示表的内容。xaml如下:Grid.Column"1" ItemsSour…

linux 查看端口 程序,linux开发:Linux下查看端口占用

前段时间有学生问到,怎么查看linux系统中已经被占用的端口?下面就统一给大家解释一下。提到端口,那首先来回顾端口定义,为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别;我们…

十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...

先来看八进制如何转换成十进制。其方法与二进制转换成十进制差不多:按权相加法,即将八进制每位上的数乘以位权(如8,64,512….),然后将得出来的数再加在一起。如将72.45转换为十进制。如图1所示来看看十进制转八进制&am…

我两个月来对Quarkus的了解

又一年,另一个来临,我很荣幸再次开启围绕Java,语言,生态系统和朋友的24篇精彩博客文章的统治,这些博客文章将我们所有人带入了今年最安静的假期。 这已经是第五年了(我只错过了2016年)&#xff…

c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和

本篇的主题是将单元格内一串文本,找出所有数字并求和,如下图。难度较高,新手建议仅了解下,先学会数组运用,再研究此知识点。废话少说,步入正题。重点说明:本篇只针对文本内整数的数字进行提取并…

linux 网络端口全连接扫描,Linux系统下的网络端口扫描工具Nmap

Linux端口扫描工具nmap and nwatchPort scan简介port Scan的方法介绍 portScan就是一种通过检测对方服务器的开放端口,侦测对方服务器服务的方法。一般可分为主动式和被动式两种。主动式就是通过向对方服务器的特定端口发送数据包,根据应答来判断。以nma…

iphone已停用怎么解锁_两种无密码解锁iPhone锁屏密码的方法

现在很多手机都配备指纹解锁功能,大家平时用惯了指纹解锁,有时候在需要输入锁屏密码的时候反倒记不清密码是什么了。像是手机重启后就需要输入密码解锁,iPhone锁屏密码忘了怎么办?多次输入错误密码还可能导致手机被停用&#xff0…

elisa数据处理过程图解_ELISA原理示意图详解.ppt

ELISA原理示意图详解.ppt免疫酶技术及其应用——ELISA 一、实验目的 了解和掌握免疫酶技术的测定原理。 掌握酶联免疫吸附测定技术的操作步骤,学会利用竞争ELISA的方法,定量测定抗体或抗原。 了解免疫酶技术在生物学和医学研究的重要意义及应用价值。 二…

linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

postgresql某一个进程占用大量CPU,问题排查,目前服务器cpu为4核,内存8G1.查下是不是我们的业务SQLSELECTprocpid,START,now() - START AS lap,current_queryFROM (SELECTbackendid,pg_stat_get_backend_pid(S.backendid) AS procp…

华硕z9pa u8 bios下载_教程:图文教学,华硕M8H M8R硬破解支持intel 9代处理器

听说2020年,Intel将要上10代U了,10代U Comet Lake-S的参数整理规格如下:赛扬G5900:2核心2线程,3.4GHz奔腾G6600:2核心4线程,4.2GHz酷睿i3-10100:4核心8线程,3.6-?GHz酷睿i3-10100T&…

64位 regsrv win10_Win10 64位安装个人版SQL2000图文教程

默认Win10上是不允许安装SQL2000的,毕竟SQL2000已经是10多年前的老软件了,但是因为它成熟稳定,相比SQL2005,SQL2008R2,SQL2012,SQL2014,体积要小的多,所以还是很希望能在Win10环境下…

Java 13:切换表达式的增强功能

您可能还记得我以前的文章,在Java 12中,传统的switch语句得到了增强,因此可以用作表达式。 在Java 13中,对该功能进行了进一步的更改 。 break语句不再可以返回值。 相反,您必须使用新的yield语句,如下所示…

linux 硬盘转换gpt分区格式化吗,Linux下使用gpt给磁盘分区、格式化、挂载

GPT(GUID)分区(推荐使用)sudo parted # 进入parted工具,输入help可查看帮助select /dev/sda # 选择你要操作的设备,一定要注意,不要把默认设备误操作了mklabel gpt # 设定使用的分区类型, 如果要用MBR分区,输入msdos即可。mkpart …

苹果mp3软件_flac、WAV、m4a等音频格式转成MP3 ,一键搞定!

在工作生活中,有时我们需要处理各种音频格式转换,有些系统或者是软件不支持特殊的音频格式添加。比如说苹果手机录音格式是M4A的,flac、WAV无损音质格式或者au格式,这些都怎么转成常用的MP3格式呢?有一种快捷的方法就是…

kdj超卖_KDJ指标超卖区域划分及交易含义

超卖区,是指卖盘强盛并逐渐进人顶峰,在技术上存在反弹可能的区域。 通常情况下,将震荡区间的20线作为徘徊区和超卖区的分界线。也就是 说,当指标线的数值跌破20就算进人了超卖区。1.超卖信号的识别与超买区的划分相似,…

linux6.2 网络yum,配置RHEL6.2的YUM源

服务器端:1、 由于yum安装支持三种协议:file://、ftp://和http://,因此如果是使用本地文件作为源,则可直接使用file:\\协议,否则需要先准备好ftp或者http服务。这次测试的是ftp源,因此需要配置好ftp服务…