在本快速教程中,您将学习如何

  • 安装 Cucumber
  • 使用 Gherkin 语法编写您的第一个场景
  • 中编写您的第一个步骤定义
  • 运行 Cucumber
  • 学习行为驱动开发 (BDD) 的基本工作流程

我们将使用 Cucumber 开发一个小型库,该库可以确定现在是否是星期五。

请注意,本教程假设您具备以下知识

  • 使用终端的一些经验
  • 使用文本编辑器的一些经验

在我们开始之前,您需要以下内容

创建一个空的 Cucumber 项目

现在您有一个安装了 Cucumber 的小型项目。

验证 Cucumber 安装

为了确保一切正常协作,让我们运行 Cucumber。

您应该看到类似于以下内容的内容

Cucumber 的输出告诉我们它没有找到要运行的任何内容。

编写一个场景

当我们使用 Cucumber 进行行为驱动开发时,我们使用具体示例来指定我们希望软件执行什么。场景是在生产代码之前编写的。它们从一个可执行规范开始。随着生产代码的出现,场景开始扮演活文档自动化测试的角色。

示例映射

尝试在您的团队中运行一个示例映射 研讨会,以共同设计示例。

在 Cucumber 中,一个示例称为场景。场景定义在 .feature 文件中,这些文件存储在 目录(或子目录)中。

一个具体的例子是星期日不是星期五

创建一个名为 的空文件,其中包含以下内容

Feature: Is it Friday yet?
  Everybody wants to know when it's Friday

  Scenario: Sunday isn't Friday
    Given today is Sunday
    When I ask whether it's Friday yet
    Then I should be told "Nope"

该文件的第一行以关键字 Feature: 开始,后跟一个名称。最好使用与文件名类似的名称。

第二行是对特性的简要描述。Cucumber 不会执行这一行,因为它只是文档。

第四行 Scenario: Sunday is not Friday 是一个场景,它是一个具体示例,说明软件应该如何行为。

最后三行以 GivenWhenThen 开头,是我们场景的步骤。Cucumber 将执行这些步骤。

查看场景报告为未定义

现在我们有了场景,我们可以让 Cucumber 执行它。

Cucumber 告诉我们有一个 `undefined` 场景和三个 `undefined` 步骤。它还建议了一些代码片段,我们可以用来 *定义* 这些步骤。

将三个步骤的代码片段复制粘贴到 文件中。

查看标记为待定的场景

再次运行 Cucumber。这次输出有点不同

Cucumber 找到了我们的步骤定义并执行了它们。目前它们被标记为 *待定*,这意味着我们需要让它们做一些有用的事情。

查看标记为失败的场景

下一步是按照步骤定义中的注释说明进行操作。

在此编写将上面语句转换为具体操作的代码。

尝试在代码中使用与步骤中相同的词语。

通用语言

如果您的步骤中的词语源于 示例映射 会话期间的对话,那么您正在构建一个 通用语言,我们认为这是使您的生产代码和测试更易于理解和维护的好方法。

将您的步骤定义代码更改为此

再次运行 Cucumber

这是进步!前两个步骤通过了,但最后一个失败了。

查看标记为通过的场景

让我们执行使场景通过的最低限度操作。在本例中,这意味着让我们的 返回 `Nope`

再次运行 Cucumber

恭喜!您已经获得了第一个通过的 Cucumber 场景。

添加另一个失败的测试

下一个要测试的是,当 *是* 星期五时,我们也会获得正确的结果。

更新 `is_it_friday_yet.feature` 文件

Feature: Is it Friday yet?
  Everybody wants to know when it's Friday

  Scenario: Sunday isn't Friday
    Given today is Sunday
    When I ask whether it's Friday yet
    Then I should be told "Nope"

  Scenario: Friday is Friday
    Given today is Friday
    When I ask whether it's Friday yet
    Then I should be told "TGIF"

我们需要添加一个步骤定义,将 `today` 设置为“星期五”。

运行此测试时,它将失败。

这是因为我们还没有实现逻辑!让我们在下一步中进行操作。

使其通过

我们应该更新我们的语句,以实际评估 `today` 是否等于 `"Friday"`。

再次运行 Cucumber

使用变量和示例

因此,我们都知道一周中除了星期日和星期五还有其他几天。让我们更新我们的场景以使用变量并评估更多可能性。我们将使用变量和示例来评估星期五、星期日和其他任何日期!

更新 `is_it_friday_yet.feature` 文件。注意,当我们开始使用多个 `Examples` 时,我们将从 `Scenario` 转换为 `Scenario Outline`。

Feature: Is it Friday yet?
  Everybody wants to know when it's Friday

  Scenario Outline: Today is or is not Friday
    Given today is "<day>"
    When I ask whether it's Friday yet
    Then I should be told "<answer>"

  Examples:
    | day            | answer |
    | Friday         | TGIF   |
    | Sunday         | Nope   |
    | anything else! | Nope   |

我们需要将 `today is Sunday` 和 `today is Friday` 的步骤定义替换为一个步骤定义,该定义将 `<day>` 的值作为字符串进行接收。请按照以下步骤更新 文件

再次运行 Cucumber

重构

现在我们已经拥有了工作代码,我们应该进行一些重构。

  • 我们应该将 `isItFriday` 从测试代码中移到生产代码中。

  • 我们可以在某些时候从步骤定义中提取辅助方法,用于我们在多个地方使用的

摘要

在本简短教程中,您了解了如何安装 Cucumber、如何遵循 BDD 流程来开发一个 ,以及如何使用该 来评估多个场景!

您可以帮助我们改进本文档。 编辑此页面.