Cucumber 可用于基于 Gherkin 功能文件中描述的场景实现自动化测试。

步骤参数

步骤定义 中给出的示例中,Cucumber 从步骤中提取文本 48,将其转换为 int,并将其作为参数传递给

中的参数数量必须与表达式中的 数量相匹配。(如果数量不匹配,Cucumber 将抛出错误)。

数据表

来自 Gherkin 的数据表可以通过将 DataTable 对象作为步骤定义中的最后一个参数来访问。 此转换可以通过 Cucumber 或手动完成。

List<List<String>> table
List<Map<String, String>> table
Map<String, String> table
Map<String, List<String>> table
Map<String, Map<String, String>> table

传递给步骤定义的最简单方法是使用数据表

Given the following animals:
  | cow   |
  | horse |
  | sheep |

将参数声明为 ,但在表达式中不要定义任何

在这种情况下,DataTable 会被 Cucumber 自动扁平化为 (使用 DataTable.asList(String.class)),然后调用步骤定义。

步骤

步骤类似于方法调用或函数调用。

例如

Given I have 93 cucumbers in my belly

在此步骤中,您正在使用一个参数(值 93)“调用”上述步骤定义。

步骤在您的 文件中声明。

匹配步骤

  1. Cucumber 将步骤与步骤定义的 Regexp 进行匹配。
  2. Cucumber 收集任何 或变量。
  3. Cucumber 将它们传递给步骤定义的 并执行它。

请记住,步骤定义以 介词副词GivenWhenThenAndBut)开头。

所有步骤定义在 Cucumber 开始执行功能文件中的纯文本之前加载(并定义)。

一旦执行开始,对于每个步骤,Cucumber 将查找具有匹配 Regexp 的已注册步骤定义。 如果找到,它将执行它,并将 Regexp 中的所有 和变量作为参数传递给

在 Cucumber 注册或查找步骤定义时,使用的具体介词/副词没有意义。

此外,请查看 多行步骤参数,以获取有关如何将整个表或更大的字符串传递给步骤定义的更多信息。

步骤结果

每个步骤可以具有以下结果之一

成功

当 Cucumber 找到匹配的步骤定义时,它将执行它。 如果步骤定义中的块没有引发错误,则该步骤将被标记为成功(绿色)。 从步骤定义中 return 的任何内容都没有任何意义。

未定义

当 Cucumber 找不到匹配的步骤定义时,该步骤将被标记为未定义(黄色),并且该场景中的所有后续步骤都会被跳过。

待定

当步骤定义的 调用 pending 时,该步骤将被标记为待定(黄色,与 undefined 一样),表明您还有工作要做。

失败的步骤

当步骤定义的 被执行并引发错误时,该步骤将被标记为失败(红色)。 从步骤定义中返回的内容没有任何意义。

返回 false 不会导致步骤定义失败。

跳过

undefinedpendingfailed 步骤之后的步骤永远不会执行,即使存在匹配的步骤定义。 这些步骤被标记为跳过(青色)。

模棱两可

Cucumber 需要步骤定义是唯一的,以便知道要执行什么。如果你使用了模棱两可的步骤定义, 告诉你修复模糊性。

钩子

钩子是在 Cucumber 执行周期中的不同点运行的代码块。它们通常用于在每个场景之前和之后设置和拆除环境。

钩子定义的位置不会影响它对哪些场景或步骤生效。如果你想要更细粒度的控制,可以使用 条件钩子.

场景钩子

场景钩子对每个场景都运行。

Before

Before 钩子在每个场景的第一个步骤之前运行。

在使用 Before 之前请三思

Before 钩子中发生的任何事情对于只阅读功能的人来说都是不可见的。你应该考虑使用 背景 作为更明确的替代方案,特别是如果设置应该可以被非技术人员阅读。仅将 Before 钩子用于低级别逻辑,例如启动浏览器或从数据库中删除数据。

After

After 钩子在每个场景的最后一个步骤之后运行,即使步骤结果是 failedundefinedpendingskipped

scenario 参数是可选的。如果你使用它,你可以检查场景的状态。

例如,你可以使用 为失败的场景拍摄截图,并将它们嵌入 Cucumber 的报告中。

查看 浏览器自动化页面 以获取关于如何执行此操作的示例。

Around

步骤钩子

BeforeStep

AfterStep

条件钩子

可以根据场景的标签有条件地选择钩子以供执行。要仅针对某些场景运行特定的钩子,可以将 钩子与 标签表达式 关联。

查看有关 标签 的更多文档。

全局钩子

全局钩子在任何场景运行之前或所有场景运行之后运行一次。

BeforeAll

BeforeAll 在任何场景运行之前运行。

AfterAll

AfterAll 在所有场景执行完毕后运行。

InstallPlugin

AfterConfiguration

AfterConfiguration 已被弃用,取而代之的是根据你的需要使用 BeforeAllInstallPlugin

标签

标签是组织你的功能和场景的好方法。

它们可以用于两个目的

考虑以下示例

@billing
Feature: Verify billing

  @important
  Scenario: Missing product description
    Given hello

  Scenario: Several products
    Given hello

一个功能或场景可以拥有任意数量的标签。用空格隔开它们

@billing @bicker @annoy
Feature: Verify billing

标签可以放在以下 Gherkin 元素之上

  • Feature
  • Scenario
  • Scenario Outline
  • Examples

Scenario Outline 中,你可以在不同的示例上使用标签,如下所示

Scenario Outline: Steps will run conditionally if tagged
  Given user is logged in
  When user clicks <link>
  Then user will be logged out

  @mobile
  Examples:
    | link                  |
    | logout link on mobile |

  @desktop
  Examples:
    | link                   |
    | logout link on desktop |

不能将标签放在 Background 或步骤 (GivenWhenThenAndBut) 之上。

标签继承

标签由子元素继承。

放在 Feature 上的标签将被 ScenarioScenario OutlineExamples 继承。

放在 Scenario Outline 上的标签将被 Examples 继承。

运行场景子集

你可以告诉 Cucumber 只运行带有特定标签的场景

忽略场景子集

你可以告诉 Cucumber 忽略带有特定标签的场景

按行过滤

运行场景子集的另一种方法是使用 file.feature:line 模式或 --scenario 选项。

标签表达式

标签表达式是一个中缀布尔表达式。以下是一些示例

表达式 描述
@fast 标记为 @fast 的场景
@wip and not @slow 标记为 @wip 但没有标记为 @slow 的场景
@smoke and @fast 同时标记为 @smoke@fast 的场景
@gui or @database 标记为 @gui@database 的场景

为了更高级的标签表达式,你可以使用括号来提高清晰度,或者更改运算符优先级

(@smoke or @ui) and (not @slow)

使用标签进行文档

在使用标签进行文档方面,你的想象力是唯一的限制。

标签可以引用外部系统中的 ID,例如需求管理工具、问题跟踪器或测试管理工具。

@BJ-x98.77 @BJ-z12.33
Feature: Convert transaction

您可以使用自定义的 Cucumber 报告插件,将标签转换为指向您外部工具中的文档的链接。

开发流程

另一种使用标签的创造性方法是跟踪某个功能在开发流程中的位置。

@qa_ready
Feature: Index projects

运行 Cucumber

可以 配置 Cucumber 如何运行功能。

从命令行

您还可以使用 构建工具IDE 运行功能。

JUnit 5

JUnit 4

选项

Cucumber 提供了多个选项,可以传递到命令行。

列出配置选项

您可以列出您正在使用的 Cucumber 版本可用的选项。

您也可以使用 标签 指定要运行的内容。

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