为Java + STANDARD值引入Cucumber

作为软件开发人员,我们都有最喜欢的工具来使我们成功。 许多人在上手时就很适合这份工作,但很快就不见了。 其他人则需要太多的设置和培训才能“将脚趾浸入水中”,只是为了找出自己是否是正确的工具即可。

Cucumber JVM是一个测试框架,它增强了JUnit ,以便提供一种更轻松的方式来开始进行行为驱动开发(BDD)。 Gherkin语言 (Cucumber理解的语言)使软件或质量工程师可以更轻松地用文字描述有关软件应用程序中预期行为的方案。

对我而言,Cucumber允许表达哪些方案是自动化的,而无需“深入了解”并阅读Java代码。 这个简短的博客描述了我为什么使用它,以及使用方法的提示,这些提示可能与大多数情况有所不同。

应用程序演变和需求变更

我认为,软件需求规范更多是一种艺术形式。 如果我们可以询问业务主题专家(SME),他们希望应用程序做什么,并让他们抽象地提供所有必要的细节,那就太好了。 不幸的是,过去30多年来我从事的每个试图预先收集需求的项目都不可避免地遇到了在开发过程中更改或误解需求的情况,这使所有需求都尚未实现。

作为敏捷方法论的支持者,我相信最好的应用会不断发展。 需求必须随着时间而成形。 这个概念使僵化的项目经理甚至利益相关者发疯。 “如果我不确切知道每个版本的要求,我该如何计划三年?”

该主题可以提供其自己的博客,但现在让我们简单地期望在项目的所有阶段都将发生需求变更。 能够快速有效地做出反应是敏捷开发的全部意义所在。

因此,如果将12个月的项目中的5个月进行了改进,这是5个月的工作前提,那么如何确保对已编写和测试的代码所做的更改不会引起回归问题?

为什么要使用黄瓜?

Cucumber和JUnit是使我能够自动化应用程序的重要功能和使用场景的工具。 作为一个敏捷的开发人员,我必须期望我将重构代码和设计以响应需求变化。 我编写的单元测试和集成测试使我有信心,过去测试过的方案仍然有效。 这就是为什么我们要进行单元测试,但是仍然存在为什么要使用黄瓜的问题?

对我来说,当我领导的一个项目决定转向JEE6,CDI和Interceptors时,Cucumber出现在了现场。 这些概念全部重用服务,并使用面向方面的编程将业务规则行为插入服务方法。 也就是说,我们决定使用Java拦截器来确保在每次服务方法调用开始之前都满足业务规则。

那么,您到底如何测试这样的概念? 我不仅需要正确测试我的业务逻辑,还需要一个测试环境来模拟我的容器行为,以便对适当的集成测试进行编码。

那时,实际上只有一套可以处理这种环境的工具:Cucumber和Arquillian。 Arquillian是Redhat的测试框架,可让您“收缩包装”可在测试容器中使用的可部署资源,从而使集成测试真正在容器中运行。 如何设置它并使其起作用是比我在这里要讲的更高级的主题,但是从Arquillian Cucumber测试环境开始并不是要把脚趾浸入水中。 它更像是在漂着水母。

无论如何,该测试都需要我驱使我更多地研究Cucumber作为测试工具,这使我对BDD环境的多种可能性大开眼界。

现在就举一个很好的例子。

到目前为止,这听起来像是一个推销活动,但让我演示一下黄瓜测试的外观。 让我们以1040EZ表格为例。

Java黄瓜实例

如果我们正在为此编写应用程序,则可能需要以下方案:

Feature: Form 1040EZScenario: Too much taxable interestGiven standard error messagesAnd Form line 1 contains $30,000.00And Form line 2 contains $1,501.00When Form is submittedThen an error message with id F1040EZ-1 is shown

因此,让我们剖析这种情况。 Feature and Scenario语言只是用于帮助描述我们正在测试的内容以及特定情况的文本。 给定“何时”和“然后”语法是一种常见的按规范测试的术语,用于区分方案的不同部分。

  • “给出”用于描述测试的设置。
  • “何时”通常描述您正在测试的Java方法以及提供给它的参数。 我们的示例没有参数。
  • “然后”用于描述执行该方法的结果。 有时有消息; 其他时间则有预期的特定数据; 其他情况只是测试没有破裂或更改。

如果您采用这种简单的纳税表,则可能会发现许多其他情况,例如:

  • 未指定所需值
  • 矛盾的输入
  • 无效数据,例如负数或期望数字的文本
  • 有效方案,例如退款和付款

在这个简单的税收示例中,有很多情况。 对于更复杂的形式,可能要测试数百种可能的方案。 测试的技巧是找到合适的,可管理的测试数量来编写。

对于我们的简单场景,Given-When-Then文本将作为“ .feature”文件存储在Java代码的资源中。 通常将所有功能文件一起存储在一组模仿Java包结构的文件夹中。 实际上,为了简化测试,您可以在与该文件夹结构匹配的程序包中创建Java类来测试此功能。

Java类在Cucumber中被称为Steps文件,它定义了要为每个Step运行的Java代码,它们简单地是Given,When或Then。 使用@ Given,@ When和@Then批注的步骤与功能步骤匹配,这些批注具有用于进行匹配的正则表达式参数。

请参阅黄瓜文档,以获取更好的示例以及有关如何将它们组合在一起的更多详细信息。

使用标准值编写黄瓜脚本的技巧

如上面的示例所述,“给定”步骤设置了方案。 在我们的简单场景中,第一个Given似乎隐藏了一些重要数据。 具体来说,该应用程序的标准消息是什么? 更复杂的场景可能依赖于大量的预定义数据。

Cucumber提供了在表中列出给定数据的方法,因此您可以在每个“给定”步骤中非常明确地显示相关的设置数据。 但是,这甚至会使最简单的场景变得如此冗长,以至于没有人会尝试阅读它们。

在我当前的项目中,我们已经进行了集成测试,以至于有数百行设置数据。 因此,我们大多数情况都始于:

Given STANDARD values for …..

“……” 替换为列出应该为标准对象提供哪些对象类别的关键字。 这使每个方案简洁明了,但是如果非开发人员正在查看该方案,他们如何知道标准值是什么?

我们对此的解决方案是提供一个StandardObjects.feature文件。 该文件与所有其他文件一样,以“给...提供标准值”开头,但是每个方案都有一个“然后”步骤,该步骤显示该标准对象的期望值表。

在上面的示例中,我们有:

Given standard error messages

使用这种STANDARD值功能方法,我们将重用Given并提供一个Then,如下所示:

Then standard error messages would include exactly the following:| id		| message						 		                          |
| F1040EZ-1	|If taxable interest is greater than $1500, you cannot use 1040EZ | 
| F1040EZ-2	|Line X is required							                      |
| F1040EZ-3	|Value on line X is not valid						              |

将标准值期望值分离到一个单独的功能可以使功能方案变得混乱,但仍可以看到标准值是什么。 但是,请注意,随着标准值的更改或添加,必须更新功能文件。 但是我认为这是一件好事。

最后的想法

能够快速有效地做出反应是敏捷开发的全部意义所在。 Cucumber是使我能够自动执行应用程序的重要功能和使用场景的工具。 该博客描述了为什么我使用Cucumber来帮助实现该目标,以及如何使用它的技巧。 您也可以在此处查看有关此主题的另一个Keyhole博客。

需求的变更将在项目的所有阶段发生,但是如果您拥有正确的工具,就可以避免痛苦。

翻译自: https://www.javacodegeeks.com/2016/01/introducing-cucumber-java-standard-values.html

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

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

相关文章

一个逼格很低的appium自动化测试框架

Github地址: https://github.com/wuranxu 使用说明 1. 安装配置Mongo数据库 下载地址 mongo是用来存放元素定位的,截图如下: 通过case_id区分每个case的元素定位 里面提供了value, method和text字段,分别作用是定位的值,定位的方法和要输入的…

Port already in use: 1099;

Port already in use: 1099;1.使用命令:netstat -aon|findstr 1099 找出占用1099端口的进程; 2.关闭占用该端口的进程:taskkill -f -pid 9336;

一款好用且免费的语句分析工具Plan Explorer

在调优过程中的查询语句优化阶段,分析语句的执行计划是必经之路,一款好的执行计划分析工具确实可以帮助我们事半功倍 小贴士:Plan Explorer是将Plan Explorer 专业版与免费版整合在一起发布的全新、完全免费版。微软的数据库专家和开发人员也…

前端如何发ModelAndView的请求

前端如何发ModelAndView的请求1.在Web.xml指定用作工具的跳转页面

带有Gluon Ignite和Dagger的JavaFX中的依赖注入

依赖注入抽象框架Gluon Ignite在几个流行的依赖注入框架(例如Spring,Dagger和Guice)上创建了一个通用抽象。 目前,Gluon 页面仅包含一个示例,该示例使用Gluon Ignite和Google Guice作为依赖注入框架,我想尝…

checkbox对齐排列

checkbox对齐排列<span style"width: 120px;display: inline-block"><lable><input type"checkbox"/></lable> </span>常用的 display 可能的值&#xff1a;

动态增删表单

动态增删表单1.实现效果 2.两种方式&#xff0c;推荐第二种&#xff08;不管是第一种还是第二种&#xff0c;想要序列化都必须&#xff0c;id不同&#xff09; &#xff08;1&#xff09;表单clone的方式&#xff08;简单演示&#xff0c;道理相通&#xff09; <div id&quo…

策略模式(组件协作模式)

策略模式&#xff08;组件协作模式&#xff09; 策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现代码的复用&…

java11+osgi_错误学习:Java + OSGi

java11osgi最近&#xff0c;我致力于在OSGi环境中使Apache Hive工作。 虽然没有被证明是小菜一碟&#xff08;软件对吗&#xff1f;。。为什么我不感到惊讶&#xff1f; &#xff09;&#xff0c;它引导我解决了各种Java和OSGi错误。 在这里&#xff0c;我列出了其中一些让我有…

集群没有leader_ZooKeeper 集群中 Leader 与 Follower 的4种数据同步策略

首先要声明一点&#xff0c;zk集群中&#xff0c;leader服务器有着比较重要的存在&#xff0c;Follower 服务器只是处理非事务性请求&#xff0c;leader服务器主要负责事务性请求&#xff0c;Follower 服务器在遇到事务性请求以后还是会转发给leader服务器处理&#xff0c;所以…

JavaOne 2015:高级模块化开发

JavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总结一下&…

action怎么获得 ajax date参数_ajax()gt;load()事件的新用法!!!

load()函数用于从服务器加载数据&#xff0c;并使用返回的html内容替换当前匹配元素的内容。load()函数默认使用GET方式&#xff0c;如果提供了对象形式的数据&#xff0c;则自动转为POST方式。load()函数只会替换每个匹配元素的内部内容(innerHTML)。你还可以在URL字符串后面追…

无显示器u盘安装centos_最新版 CentOS 8.1.1911 安装教程及常见问题图文详解

基于笔记本(华硕)操作&#xff0c;使用软碟通(UltraISO)制作的系统启动盘(U盘&#xff0c;内存大于8G)操作可自行百度&#xff0c;非常简单(或可留言&#xff0c;择情况出一期U盘制作启动盘教程)。a、登录 centos 官网下载镜像文件官网地址&#xff1a;https://www.centos.org阿…

bom实现方块移动_从0开始实现一个俄罗斯方块

写在前面得话&#xff1a;这篇文章主要记录了我是怎么一步一步写出俄罗斯方块&#xff0c;整个代码用的函数编程&#xff0c;主要是为了让一些不熟悉es6, 面向对象写法得 新手能更容易看明白&#xff0c;全部得代码中都是一些js的基础知识&#xff0c;很容易理解。要说有点麻烦…

cli3解决 ie11语法错误 vue_基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册...

项目地址&#xff1a;https://github.com/caochangkui/vue-element-responsive-demo/tree/login-register通过 vue-cli3.0 Element 构建项目前端&#xff0c;Node.js Koa2 MongoDB Redis 实现数据库和接口设计&#xff0c;包括邮箱验证码、用户注册、用户登录、查看删除用户…

gwt 嵌入html_GWT和HTML5画布演示

gwt 嵌入html这是我对GWT和HTML5 Canvas的第一个实验。 我的第一个尝试是创建矩形&#xff0c;仅用几行代码就得出了这样的内容&#xff1a; 码&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";sta…

tez什么意思_传统数仓和大数据数仓的区别是什么?

概念与容器为什么先说这个&#xff0c;其实很简单&#xff1a;因为绝大多数人都把这两个概念混为一谈。然后就会出现各种各样的问题&#xff1a;oracle不是数据库么&#xff0c;怎么又是数据仓库&#xff1f;Hive不是数据仓库么&#xff1f;怎么又是数据库&#xff1f;数据仓库…

华为M2平板打不开云课堂_能运行PC应用的安卓生产力平板:华为MatePad Pro 5G登场...

当手机屏幕无法承担更复杂的工作任务&#xff0c;当PC重量不能满足更随性的移动办公&#xff0c;拥有全面屏和便携优势的平板电脑或是中间值&#xff0c;但前提是其必须拥有足够强大的生产力。5月27日华为在国内上市的其首款5G平板——华为MatePad Pro 5G&#xff0c;就是5G时代…

soa示例_SOA示例应用程序

soa示例SOA描述了一组用于创建松散耦合的&#xff0c;基于标准的&#xff0c;与业务相关的服务的模式&#xff0c;由于描述&#xff0c;实现和绑定之间的关注点分离&#xff0c;因此提供了新的灵活性。 近年来&#xff0c;至少在参与大多数信息技术活动的人们中&#xff0c;面向…

body curl 设置post_curl 命令详解

常用参数常用参数分类# 调试类-v, --verbose 输出信息-q, --disable 在第一个参数位置设置后 .curlrc 的设置直接失效&#xff0c;这个参数会影响到 -K, --config -A, --user-agent -e, --referer-K, --config FILE …