java cucumber
作为软件开发人员,我们都有最喜欢的工具来使我们成功。 许多人在开始工作时就很适合这份工作,但很快就不见了。 其他人则需要太多的设置和培训才能“将脚趾浸入水中”,只是为了简单地确定它们是否是正确的工具即可。
Cucumber JVM是一个测试框架,它增强了JUnit ,从而提供了一种更轻松的方式来开始进行行为驱动开发(BDD)。 Gherkin语言 (Cucumber理解的语言)使软件或质量工程师可以更轻松地用文字描述有关软件应用程序中预期行为的方案。
对我而言,Cucumber允许表达哪些方案是自动化的,而无需“深入了解”并阅读Java代码。 这个简短的博客描述了我为什么使用它,以及使用方法的提示,这些提示可能与大多数情况有所不同。
应用程序发展与需求变化
我认为,软件需求规范更多是一种艺术形式。 如果我们可以询问业务主题专家(SME),他们希望应用程序做什么,并让他们抽象地提供所有必要的细节,那就太好了。 不幸的是,在过去30多年中,我从事的每个试图预先收集需求的项目都不可避免地遇到了在开发过程中更改或误解需求的情况,这使所有需求都尚未实现。
作为敏捷方法论的支持者,我相信最好的应用会不断发展。 需求必须随着时间而成形。 这个概念使僵化的项目经理甚至利益相关者发疯。 “如果我不确切知道每个版本的要求,我该如何计划三年?”
该主题可以提供其自己的博客,但现在让我们简单地期望在项目的所有阶段都将发生需求变更。 能够快速有效地做出React是敏捷开发的全部意义所在。
因此,如果将12个月的项目中的5个月进行了改进,这是5个月的工作前提,那么如何确保对已编写和测试的代码所做的更改不会引起回归问题?
为什么要使用Cucumber?
Cucumber和JUnit是使我能够自动化应用程序的重要功能和使用场景的工具。 作为一个敏捷的开发人员,我必须期望我将重构代码和设计以响应需求变化。 我编写的单元测试和集成测试使我有信心,过去测试过的方案仍然可以使用。 这就是为什么我们要进行单元测试,但是仍然存在为什么要使用Cucumber的问题?
对我来说,当我领导的一个项目决定转向JEE6,CDI和Interceptors时,Cucumber出现在了现场。 这些概念全部重用服务,并使用面向方面的编程将业务规则行为插入服务方法。 也就是说,我们决定使用Java拦截器来确保在每次服务方法调用开始之前都满足业务规则。
那么,您到底如何测试这样的概念? 我不仅需要正确测试我的业务逻辑,还需要一个测试环境,该环境可以模拟我的容器行为,以便对适当的集成测试进行编码。
那时,实际上只有一套可以处理这种环境的工具:Cucumber和Arquillian。 Arquillian是Redhat的测试框架,可让您“收缩包装”可在测试容器中使用的可部署资源,从而使集成测试真正在容器中运行。 如何设置它并使其起作用是比我在这里要讲的更高级的话题,但是从Arquillian Cucumber测试环境开始并不是要把脚趾浸入水中。 它更像是在漂着水母。
无论如何,该测试都需要我驱使我更多地研究Cucumber作为测试工具,这使我对BDD环境的多种可能性大开眼界。
现在就举一个很好的例子。
到目前为止,这听起来像是一个推销活动,但让我演示一下Cucumber测试的外观。 让我们以1040EZ表格为例。
如果我们正在为此编写应用程序,则可能需要以下方案:
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批注的步骤与功能步骤匹配,这些批注具有用于进行匹配的正则表达式参数。
请参阅Cucumber文档,以获得更好的示例以及有关如何将它们组合在一起的更多详细信息。
使用标准值编写Cucumber脚本的技巧
如上面的示例所述,“给定”步骤设置了方案。 在我们的简单场景中,第一个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 |
将标准值期望值分离到一个单独的功能可以使功能方案变得混乱,但仍可以看到标准值是什么。 但是,请注意,随着标准值的更改或添加,必须更新功能文件。 但是我认为这是一件好事。
最后的想法
能够快速有效地做出React是敏捷开发的全部意义所在。 Cucumber是一种工具,它使我能够自动化应用程序的重要功能和使用场景。 该博客描述了为什么我使用Cucumber来帮助实现该目标,以及如何使用它的技巧。 您也可以在此处查看有关此主题的另一个Keyhole博客。
需求的变更将在项目的所有阶段发生,但是如果您拥有适当的工具,就可以避免痛苦。
翻译自: https://www.javacodegeeks.com/2016/01/introducing-cucumber-java-standard-values.html
java cucumber