我想我彻底理解了 SpecFlow 背后的概念和想法,但是即使在阅读了Secret Ninja Cucumber Scrolls、The Cucumber Book并浏览了各种论坛之后,我仍然不确定通往可重用性的道路。
我们的场景已经符合各种准则
- 不言自明
- 必须有一个可以理解的目的(是什么使它与其他场景不同)
- 是独一无二的
- 表示垂直功能切片
- 使用无处不在的语言
- 从利益相关者的角度撰写
- 关于业务功能,而不是软件设计
- 按史诗分组
- 不是测试脚本
- 让其他人阅读它们以查看场景是否正确
- 不涉及 UI 元素
- 代表关键示例
- 非技术
- 精确且可测试
- 尽可能重复
- “给定”代表状态,而不是动作
- 'When' 代表动作
- “那么”应该代表一个可见的变化,而不是一些内部事件
我们的步骤必须遵守以下准则(一些特定于 SpecFlow):
- 使用无处不在的语言
- 不涉及 UI 元素
- 不应该合并
- 应该是可重用的,并且在所有功能上都是全局的
- 不应链接到特定功能
- 按实体、实体组或领域概念分组
- 不要创建步骤以重用步骤定义文件中的逻辑
- 仔细考虑一个步骤属于哪个步骤文件
- 不要在阶段之间重用步骤
- 必须避免在步骤中使用文字字符串,但如果需要,请使用单引号
- 切勿将多个 [Given]、[When] 或 [Then] 属性应用于 step 方法
- 根据它们所代表的阶段对步骤进行排序
- 如果对场景不重要,很重要的就别提了
但是即使我们使用正则表达式占位符,我们仍然会得到相同步骤的许多变体。尤其是如果某件事不重要,则不应提及它的规则会导致这些变化。是的,在内部,这些步骤做了很多重用,但不是在场景中。
例如考虑以下场景:
Feature: Signing where both persons are physically available
@Smoke
Scenario: Show remaining time to sign based on previous signature
Given a draft proposal
And the first signature has been set
When I try to set the second signature
Then the remaining time to sign should be shown
@Smoke
Scenario: Re-signing of the first proposal
Given a signature that has not been set within the configured time
And the first signature has just been re-signed
When I try to set the second signature
Then the remaining time should start over
将两个“给定”步骤合二为一并失去一些可重用性会更好吗?
其他一些例子:
Feature: Conditionally show signatures to be signed
@Smoke
Scenario: Show the correct signature for a proposal with a night shift
Given I have a proposal for the day shift
When I change it to the night shift
Then I should only be able to sign for the night shift
@Smoke
Scenario: Show additional signature when extending the shift
Given I have a suspended proposal for the night shift
When I extend the period to the day shift
Then I should confirm extening the period over the shift
我在这里错过了一个基本概念吗?