这里将介绍几种反模式,并提供一些避免它们的提示!

特性耦合的步骤定义

特性耦合的步骤定义是指 **无法跨特性或场景重复使用** 的步骤定义。

这可能导致步骤定义激增、代码重复和高维护成本。

示例

一个虚构的简历应用程序可能包含以下特性和步骤定义文件

features/
+--edit_work_experience.feature
+--edit_languages.feature
+--edit_education.feature
+--steps/
   +--edit_work_experience_steps.java
   +--edit_languages_steps.java
   +--edit_education_steps.java
features/
+--edit_work_experience.feature
+--edit_languages.feature
+--edit_education.feature
+--steps/
   +--edit_work_experience_steps.kt
   +--edit_languages_steps.kt
   +--edit_education_steps.kt
features/
+--edit_work_experience.feature
+--edit_languages.feature
+--edit_education.feature
+--steps/
   +--edit_work_experience_steps.js
   +--edit_languages_steps.js
   +--edit_education_steps.js
features/
+--edit_work_experience.feature
+--edit_languages.feature
+--edit_education.feature
+--steps/
   +--edit_work_experience_steps.rb
   +--edit_languages_steps.rb
   +--edit_education_steps.rb

edit_work_experience.feature 可能包含以下场景

Scenario: add description
  Given I have a CV and I'm on the edit description page
  And I fill in "Description" with "Cucumber BDD tool"
  When I press "Save"
  Then I should see "Cucumber BDD tool" under "Descriptions"

The 可以这样实现

    @Given("I have a CV and I'm on the edit description page")
    public void I_have_a_CV_and_Im_on_the_edit_description_page() {
        Employee employee = new Employee("Sally");
        employee.createCV();
    }
@Given("I have a CV and I'm on the edit description page")
fun I_have_a_CV_and_Im_on_the_edit_description_page() {
    val employee = Employee("Sally")
    employee.createCV()
}
var { Given } = require('cucumber');

Given(/^I have a CV and I'm on the edit description page$/, function () {
  this.employee = new Employee('Sally');
  this.employee.createCV();
});
Given /I have a CV and I'm on the edit description page/ do
  @employee = Employee.create!(name: 'Sally')
  @employee.create_cv
  visits("/employees/#{@employee.id}/descriptions/new")
end

如何解耦步骤和步骤定义

  • 按领域概念组织您的步骤。

  • 为步骤和步骤定义文件使用与领域相关的名称(而不是与特性或场景相关的名称)。

连接词步骤

来自在线 Merriam-Webster 词典

**con·junc·tion**: 一个不带词性的语言形式,用于连接句子、从句、短语或词语。

不要使用将许多不同事物组合在一起的步骤。这会使步骤过于专门化,难以重复使用。黄瓜内置了对连接词 (And, But) 的支持,是有原因的!

示例

Given I have shades and a brand new Mustang

如何拆分连接词步骤

Given I have shades
And I have a brand new Mustang

对连接词步骤的支持

有时您可能希望将几个步骤合并为一个步骤,以使您的场景更易于阅读。例如,如果您需要在 Given 状态中设置多个先决条件。

实现组合和重用的最佳方法是使用编程语言的功能。如果您想将多个操作组合到一个步骤中,请提取单个(辅助)方法,并从您的步骤定义中调用这些方法。

您应该努力使您的步骤尽可能地原子化。

更多信息

有关反模式的更多信息,请参阅 黄瓜反模式(博客).

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