为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作为依赖注入框架,我想尝…

字符串逆置

重视思想和理解原理 #include <iostream> #include <cstdlib> #include <cstring> using namespace std;char* reverseStr(char * str, char * dest, int len) {//指向最后一个字符char * s &str[len-1];char *d dest;while(len > 0){*dest *s--;le…

友声电子秤设置软件_友声电子秤说明书/操作指南?(一)

友声电子秤说明书一、技术指标:1&#xff0e;内装免维护充电蓄电池&#xff0c;充电可同时开机使用。2&#xff0e;开机自动置零。3&#xff0e;零点自动跟踪。4&#xff0e;累计次数1~100次。5&#xff0e;电源&#xff1a;交流220V(10%、-10%)&#xff0c;50Hz&#xff0c;内…

checkbox对齐排列

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

c linux 获取cpuid_Linux下C编程 -- 得到系统的CPU信息(cpuid)

在 linux下可以通过查看 cat /proc/cpuinfo查看CPU的相关信息&#xff0c;但是在linux下C编程需要使用汇编语言来实现&#xff0c;因为C语言中没有实现查看CPU信息的函数&#xff0c;一般实现如下&#xff1a;(C中运行汇编用 __asm__等)#include#includestatic inline voidget_…

centos开发环境安装的备忘

#Centos visudo运行普通用户$(whomai)执行sudo操作 http://www.cnblogs.com/xianyunhe/archive/2011/08/08/2124342.html 在/etc/gdm/custom.conf文件中添加以下内容 [daemon] AutomaticLoginusername AutomaticLoginEnable…

动态增删表单

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

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

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

openwrt 遍译php_openwrt安装编译

官网安装编译推荐&#xff1a;1. host32位主机~$uname -aLinux yuxi-T530 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:21:40 UTC 2015 i686 i686 i686 GNU/Linux~$lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu14.04.3LTSRelea…

java11+osgi_错误学习:Java + OSGi

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

《Effective Java》读书笔记 - 5.泛型

Chapter 5 Generics Item 23: Don’t use raw types in new code 虽然你可以把一个List<String>传给一个List类型&#xff08;raw type&#xff09;的参数&#xff0c;但你不应该这么做&#xff08;因为允许这样只是为了兼容遗留代码&#xff09;&#xff0c;举个例子&am…

输入框长度校验

输入框长度校验1.例子 <input id"username" onkeyup"checkLength(this,80)"/>80是限制的长度 //输入长度校验,当长度超出限制&#xff0c;截取0到限制长度的字符串 function checkLength(obj, length) {if ($(# $(obj).attr("id")).val…

集群没有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;因此我在这里总结一下&…

Halcon学习笔记——机器视觉应用工程开发思路及相机标定

机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分&#xff0c;硬件部分和软件部分。 1.硬件部分&#xff0c;硬件的选型至关重要&#xff0c;决定了后续工作是否可以正常开展&#xff0c;其中关键硬件部分包括&#xff1a;光源&#xff0c;相机以及镜头。 2.软件…