什么是 Cucumber 功能文件和步骤定义?(示例)
⚡ 智能摘要
Cucumber 特性文件用纯 Gherkin 语言描述行为,而步骤定义则包含运行每一行的代码。 Cucumber 项目需要这两者,它们存储在 features 目录下的固定文件夹布局中。

每个 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
解析器并不强制要求缩进,但每级两个空格是惯例,这样可以使较长的描述文件更容易阅读。下面的动画展示了一个描述文件的运行过程,每个步骤完成后都会变成绿色。
什么是“步骤定义”?
步骤定义将功能文件中的测试用例步骤(由 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 安装 流程和更广泛的 自动化测试 系列丛书中。

