什么是 Cucumber 功能文件和步骤定义?(示例)

⚡ 智能摘要

Cucumber 特性文件用纯 Gherkin 语言描述行为,而步骤定义则包含运行每一行的代码。 Cucumber 项目需要这两者,它们存储在 features 目录下的固定文件夹布局中。

  • 🔘 两个文件: 功能文件描述了应该发生什么;步骤定义文件描述了自动化如何实现它。
  • ☑️ 小黄瓜关键词: 特征、场景、给定、当……时、然后……赋予场景结构和可读形式。
  • ✅ 台阶上没有冒号: Feature 和 Scenario 需要冒号,但 Given、When 和 Then 不能使用冒号,否则该步骤将被忽略。
  • 🧪 数据集: 场景大纲加上示例表,针对多行输入重现一个场景。
  • 🛠️ 共享设置: 背景提升功能中每个场景中重复的给定步骤。
  • 📊 匹配: Cucumber 匹配时会忽略关键字,因此两个步骤可能永远不会共享相同的文本。

Cucumber 通过示例解释功能文件和步骤定义

每个 Cucumber 项目在项目根目录下都有一个名为“features”的目录。所有 Cucumber 特性都存放在这里。在这个目录下,你还会找到其他子目录,例如 step_definition 和 support 目录。

布局很重要,因为 Cucumber 它通过约定而非配置来发现文件。位于 features 目录之外的功能文件将永远不会被读取。

什么是“功能文件”?

特征文件包含以下高级描述 测试场景 简单来说,它被称为 小黄瓜Gherkin 是一种纯英文文本语言。

Cucumber 功能文件包含以下组件——

  • 特性:特性将描述当前必须执行的测试脚本。
  • EventXtra XNUMX大解决方案:场景描述了特定测试用例的步骤和预期结果。
  • 场景概要:使用场景大纲可以对多组数据执行相同的场景。数据由(II)分隔的表格结构提供。
  • 特定:指定要执行的文本上下文。通过使用数据表“Given”,步骤也可以参数化。
  • 日期“何时”指定要执行的测试操作。
  • 然后测试的预期结果可以用“那么”来表示。

一个文件包含一个功能。其下方的场景是阐释该功能的具体示例,每个场景都遵循相同的节奏:描述起始背景、描述事件、描述预期结果。

接下来,我们将学习如何在 Cucumber 举个例子。

示例功能文件示例:

下面完整地复现了本教程中发布的原始示例。

Feature: Visit career guide page in career.guru99.com
Scenario: Visit career.guru99.com
Given: I am on career.guru99.com
When: I click on career guide menu
Then: I should see career guide page

⚠️更正: 上面的例子在后面加了一个冒号。 特定, 日期 和 然后小黄瓜在后面加冒号。 特性 和 EventXtra XNUMX大解决方案 仅此而已。步骤关键字后跟冒号不会被解析为步骤,因此 Cucumber 静默忽略该行。更正后的文件内容如下。

Feature: Visit career guide page in career.guru99.com

  Scenario: Visit career.guru99.com
    Given I am on career.guru99.com
    When I click on career guide menu
    Then I should see career guide page

解析器并不强制要求缩进,但每级两个空格是惯例,这样可以使较长的描述文件更容易阅读。下面的动画展示了一个描述文件的运行过程,每个步骤完成后都会变成绿色。

动画 Cucumber 功能文件运行过程中,每个 Gherkin 步骤都会依次报告。

什么是“步骤定义”?

步骤定义将功能文件中的测试用例步骤(由 Given/When/Then 引入)映射到代码。它在被测应用程序上执行步骤并根据预期结果检查结果。要执行步骤定义,它必须与功能中的给定组件匹配。步骤定义在 ruby​​ 文件中的“features/step_definitions/*_steps.rb”下定义。

仅根据步骤文本即可进行匹配。 Cucumber 它在查找定义时不会考虑关键字,这就是为什么同一套件中的两个步骤可能永远不会包含相同的文本,即使一个是 Given,另一个是 Then。

步骤定义示例:这里我们将使用上面的 Cucumber 以下是浏览 career.guru99.com 的功能文件示例。我们将使用“When”、“Then”、“Given”等功能,如下所示。 Cucumber 功能文件示例。

Step 1:

Given (/^ I am on career.guru99.com$/) do

Browser.goto "http://career.guru99.com" -This will visit career.guru99 on browser

end

Step 2:
When (/^ click on career guide menu$/) do

Browser.text (:name, " career guide" ).click – This will click "career guide menu"

end

Step 3:

Then (/^ I should see career guide page$/) do

Browser.goto "http://career.guru99.com/category/career-guide/" - It will visit "career guide page"

end

⚠️ 关于语言的说明: 以上定义均基于 Ruby 语言。 Cucumber 已启动,因此文件夹以此命名。 step_definitions 文件以……结尾。 _steps.rb同一个特征文件驱动着用以下语言编写的步骤定义: Java, Java脚本, Python 或者使用 C#,无需对 Gherkin 进行任何更改。 Cucumber-JVM 中,正则表达式会移到方法的注解中:

@Given("I am on career.guru99.com")
public void i_am_on_the_career_page() {
    driver.get("http://career.guru99.com");
}

无论你选择哪种语言,步骤定义是唯一可以包含实现细节的地方。——基ping 通过特性文件中的选择器和HTTP调用,非程序员也能理解场景。 第一 Cucumber 脚本 演练流程将逐步构建此配对。

功能文件中的场景概述和示例

为了更改一个值而将场景复制三次,是导致功能文件无法读取的最常见原因。 场景概要 用模板替换副本,并且 例子 表格提供了这些值。

参数写在尖括号内,并且必须与下方表格中的列标题相匹配。 Cucumber 在查找匹配的步骤定义之前,它会先替换值,因此定义本身不需要特殊处理。

Scenario Outline: Search the career guide
  Given I am on career.guru99.com
  When I search for "<keyword>"
  Then I should see the <section> section

  Examples:
    | keyword   | section       |
    | interview | Interview Tips|
    | resume    | Resume Guide  |

使用提纲时,有几点值得注意:

  • 该概要文件针对每行数据运行一次。第一行是标题行,永远不会执行。
  • 场景大纲之后必须至少有一个示例部分,否则程序将无法运行。
  • 表格中的管道不需要对齐,虽然对齐它们可以保持文件的可读性。
  • 表格要小。一个包含三十行的表格通常表明数据应该放在一个较小的表格中。 数据驱动测试 代替。

背景、以及、但是和其他小黄瓜关键词

除了前面列出的六个组件之外,Gherkin 还有一些关键字,可以使较长的功能文件更易于阅读。

  • 背景 — 一个 Given 步骤块,在功能中的每个场景运行之前执行。它避免了在每个场景开头重复编写相同的前提条件。
  • 和 和 但是, — 可替换重复出现的 Given、When 或 Then。它们读起来更流畅,功能也完全相同; Cucumber 两种方式都与步骤文本匹配。
  • 违反的规则 — 一个可选的组ping(在 Gherkin 6 中新增),它收集了说明一条业务规则的场景。
  • 文档字符串 — 用三个双引号括起来的文本块,当一行文本不够时,将其作为单个参数传递给步骤定义。
  • 数据表 — 附加到单个步骤的管道分隔行,用于将值列表传递给该步骤。
  • 标签 — 以 at 符号开头的标签,放置在功能或场景上方,以便在运行时选择子集。
  • 备注 — 以井号 (#) 开头的行。注释只能位于行首,Gherkin 字体不支持块级注释。

综合起来,包含共享设置的功能文件如下所示:

Feature: Career guide navigation

  Background:
    Given I am on career.guru99.com

  Scenario: Open the career guide menu
    Given I am signed in
    And my profile is complete
    When I click on career guide menu
    Then I should see career guide page
    But I should not see the admin panel

常见功能文件错误及修复方法

桥梁 Cucumber 初学者报告的问题并非框架本身的缺陷,而是违反 Gherkin 规则的一些细微错误,这些错误往往悄无声息地发生。

错误 会发生什么 固定
Given、When 或 Then 之后的冒号 该行未被识别为步骤,因此被跳过。 仅在 Feature 和 Scenario 后使用冒号
两个步骤,文本相同 Cucumber 由于忽略了关键字,因此将它们视为重复项。 修改其中一步,使两句话读起来不一样。
features 目录之外的功能文件 该文件从未被发现,也没有进行任何测试运行。 保留所有 .feature features 文件夹下的文件
一个场景中的十五个步骤 该方案不再适用,因为它已停止记录。 目标是三到五个步骤,并在步骤定义中详细说明。
然后对数据库行进行断言 测试通过,但用户可见的行为却出现故障。 对可观察的输出(例如页面或响应)进行断言
无示例场景大纲表 该模板从未执行。 在大纲下方直接添加一个“示例”部分。

在套件规模扩大之前修复这些问题远比事后修复要便宜得多,因为在此期间编写的每个场景都会复制相同的结构。一旦功能文件运行正常,下一步就是将项目连接起来——参见…… Cucumber 安装 流程和更广泛的 自动化测试 系列丛书中。

常见问题

不。一个 .feature 文件只能声明一个 Feature,但可以包含任意数量的场景。如果需要第二个 Feature,请创建第二个文件——正是这种限制使得文件夹在套件不断增长时仍然易于管理。

并非如此。Gherkin 已被本地化为七十多种语言。在文件的第一行添加语言头即可切换关键字,这样团队就可以用领域专家实际使用的语言编写场景。

它包含了除步骤定义之外的所有内容:环境设置、浏览器配置、在场景之前或之后运行的钩子以及共享的辅助代码。ping 它能防止步骤定义文件变成哑文件。ping 地面。

Cucumber 报告该步骤为“未定义”而非“失败”,并打印一段建议的代码片段,您可以将其粘贴到步骤定义文件中。该场景被标记为未通过,因此未定义的步骤永远不会被计为成功。

在功能或场景上方放置标签,可以让运行者在执行时选择子集,而无需考虑文件夹结构。团队通常会标记一个冒烟测试集、一个慢速测试集和一个在制品测试集,然后仅运行特定流水线阶段所需的部分。

大型语言模型能够根据验收标准很好地绘制 Gherkin 语法,并且能够更快地生成匹配的定义框架。 Rev查看重复步骤文本和泄露实现细节的场景的输出,这通常是生成的 Gherkin 出错的地方。

确实如此。给定一个打开的特性文件,Copilot 会推断出未定义步骤的正则表达式和方法签名,并从周围的代码中填充方法体。请将其视为初稿;它提出的断言仍需人工审核。

是的,这正是设计的关键所在。定义文件存放在共享文件夹中,并通过文本而非文件进行匹配,因此只需编写一次登录步骤,即可供所有需要它的功能重复使用。正是为了实现重复使用,才禁止编写重复的步骤文本。

总结一下这篇文章: