这里将介绍几种反模式,并提供一些避免它们的提示!
特性耦合的步骤定义
特性耦合的步骤定义是指 **无法跨特性或场景重复使用** 的步骤定义。
这可能导致步骤定义激增、代码重复和高维护成本。
示例
一个虚构的简历应用程序可能包含以下特性和步骤定义文件
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"
Theedit_work_experience_steps.kt edit_work_experience_steps.java edit_work_experience_steps.js edit_work_experience_steps.rb可以这样实现
    @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 状态中设置多个先决条件。
虽然可以在 Cucumber-Ruby 中从步骤定义调用步骤,但并不推荐这样做。
在 Cucumber-JVM 中,不支持从步骤定义调用步骤;这是 **设计使然**。
在 Cucumber-JVM 中,不支持从步骤定义调用步骤;这是 **设计使然**。
在 Cucumber-js 中,不支持从步骤定义调用步骤;这是 **设计使然**。
实现组合和重用的最佳方法是使用编程语言的功能。如果您想将多个操作组合到一个步骤中,请提取单个(辅助)方法,并从您的步骤定义中调用这些方法。
您应该努力使您的步骤尽可能地原子化。
更多信息
有关反模式的更多信息,请参阅 黄瓜反模式(博客).