行为驱动的开发 - Gherkin

Gherkin 是一种语言,用于编写功能、场景和步骤。 Gherkin 的目的是帮助我们编写具体的需求。

要理解具体要求的含义,请考虑以下示例−

应防止客户输入无效的信用卡详细信息。

Versus(对比)

如果客户输入的信用卡号长度不完全是 16 位数字,则当他们尝试提交表单时,应该重新显示该表单并显示一条错误消息,告知他们正确的位数。

后者没有歧义,可以避免错误,并且更易于测试。

Gherkin 旨在创建更具体的要求。 在 Gherkin 中,上面的例子看起来像 −

功能

输入无效信用卡详细信息时的反馈功能定义

在用户测试中,我们看到很多人犯错误文档

Background(背景)适用于以下所有场景

Given(鉴于)我已选择要购买的商品,

And(并且)我即将输入我的信用卡号码

Scenario(场景) − 信用卡号太短场景定义

When(当)我输入的卡号长度少于 16 位

And(并且)所有其他详细信息均正确

And(并且)我提交表单步骤

Then(那么)表单应该重新显示

And(而且)我应该会看到一条消息,建议我正确的位数

Gherkin 格式和语法

Gherkin 文件是纯文本文件,扩展名为 .feature。 每行非空白都必须以 Gherkin 关键字开头,后跟您喜欢的任何文本。 关键词是 −

  • Feature

  • Scenario

  • Given, When, Then, And, But (Steps)

  • Background

  • Scenario Outline

  • Examples

  • """ (Doc Strings)

  • | (Data Tables)

  • @ (Tags)

  • # (Comments)

  • *

Feature

Feature(功能)关键字用于描述软件功能,并对相关场景进行分组。 功能具有三个基本元素 −

  • 关键字 – Feature(功能)。

  • 功能名称,与功能关键字在同一行提供。

  • 可选(但强烈推荐)的描述,可以跨越多行,即包含关键字"功能"的行与以"场景"、"背景"或"场景大纲"开头的行之间的所有文本。

除了名称和描述之外,功能还包含场景或场景轮廓列表以及可选背景。

通常通过获取功能名称、将其转换为小写并用下划线替换空格来命名 .feature 文件。 例如,

feedback_when_entering_invalid_credit_card_details.feature

为了识别系统中的功能,您可以使用所谓的"功能注入模板"。

In order to <meet some goal> as a <type of user> I want <a feature>

描述

Gherkin 文档的某些部分不必以关键字开头。

在功能、场景、场景大纲或示例后面的行中,您可以编写任何您喜欢的内容,只要没有任何行以关键字开头即可。 这是包含描述的方式。

场景

为了表达系统的行为,您可以为每个功能附加一个或多个场景。 通常每个功能会看到 5 到 20 个场景,以完全指定该功能周围的所有行为。

场景遵循以下模式 −

  • 描述初始上下文

  • 描述一个事件

  • 描述预期结果

我们从上下文开始,描述操作,然后检查结果。 这是通过步骤完成的。 Gherkin 提供了三个关键字来描述每个上下文、操作和结果作为步骤。

  • Given(假设) − 建立上下文

  • When(当) − 执行操作

  • Then(然后) − 检查结果

这些关键字提供了场景的可读性。

示例

场景 − 从帐户中提取资金。

  • Given(假设)我的账户里有 100 美元。

  • When(当)我请求 20 美元时。

  • Then(那么)应该发放 20 美元。

如果有多个相互关联的 GivenWhen 步骤,您可以使用 AndBut。 它们允许您详细指定场景。

示例

场景 − 尝试使用被盗卡提款。

  • Given(鉴于)我的帐户中有 100 美元。

  • But(但是)我的卡无效。

  • When(当)我请求 50 美元时。

  • Then(那么)我的卡不应被退回。

  • And(而且)我应该被告知联系银行。

在创建场景时,请记住"每个场景都必须有意义并且能够独立于任何其他场景执行"。 这意味着 −

  • 一个场景的成功条件不能依赖于在它之前执行过的其他场景。

  • 每个场景都会创建其特定的上下文,执行一项操作并测试结果。

此类场景提供以下好处 −

  • 测试将变得更简单、更容易理解。

  • 您可以只运行场景的子集,而不必担心测试集的破坏。

  • 根据您的系统,您也许能够并行运行测试,从而减少执行所有测试所需的时间。

场景大纲

如果您必须编写具有多个输入或输出的场景,您最终可能会创建多个仅其值不同的场景。 解决方案是使用场景大纲。 要写出情景大纲,

  • 场景大纲步骤中的变量用 < and > 标记。

  • 变量的各种值在表格中作为示例给出。

示例

假设您正在编写一个在计算器上添加两个数字的功能。

功能 − Add.

Scenario Outline: Add two numbers.
Given the input "<input>"
When the calculator is run
Then the output should be <output>"
Examples
| input    | output |
| 2+2      | 4      | 
| 98+1     | 99     |
| 255+390  | 645    |

场景大纲部分后面始终跟随一个或多个示例部分,这些示例是表格的容器。 该表必须具有与场景大纲步骤中的变量相对应的标题行。 下面的每一行都会创建一个新场景,填充变量值