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