cucumber - Cucumber 如何提高 specflow/Gherkin 步骤之间的可以重用性?

  显示原文与译文双语对照的内容

虽然我完全理解了SpecFlow的概念和思想,但即使阅读了忍者忍者 Cucumber,我还是不确定reusability的路径,我还是不确定reusability的路径。

我们的场景已经符合各种准则

  • 自我解释
  • 必须有一个可以理解的目的( 什么使它与其他场景不同)
  • 是唯一
  • 表示垂直功能片
  • 使用无所不在的语言
  • 从涉众的角度写
  • 关于业务功能,而不是软件设计
  • 按Epics分组
  • 不是测试脚本
  • 让其他人阅读,看看场景是否正确
  • 不引用用户界面元素
  • 代表关键示例
  • 非技术
  • 精确和可以测试
  • 尽可能重复
  • '给定,表示状态,而不是动作
  • 'represent表示动作时
  • 'Then则应表示可见的更改,而不是某些内部事件

我们的步骤必须遵循以下准则( 有些是针对SpecFlow的):

  • 使用无所不在的语言
  • 不引用用户界面元素
  • 不应该合并
  • 应该是可以重用和全局的所有功能
  • 不应链接到特定的功能
  • 按实体。实体组或者域概念分组
  • 不要在步骤定义文件中创建重用逻辑的步骤
  • 仔细思考步骤属于哪个步骤
  • 不要在各个阶段之间重用步骤
  • 必须避免步骤中的文字字符串,但如果需要,请使用单引号
  • 不要将多个 [Given],[When] 或者 [Then] 属性应用于步骤方法
  • 按照所代表的阶段顺序排列这些步骤
  • 如果这对于场景并不重要,那么不需要提及它。

但是,我们仍然得到了相同步骤的大量变化,即使我们使用 正规表达式 占位符。 尤它的是如果有什么不重要的规则,你不应该提到这些变化。 当然,在内部这些步骤执行大量重用,但在场景中却没有。

考虑以下情形:


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



我在这里缺少基本概念?

时间: 原作者:

这不是一个答案,但有一些提示:

  • 可以在同一方法上放置多个 Given/When/Then 属性。 如果参数相同且差异仅在语法中,则这可以能是有用
  • 在许多项目中,我们使用驱动程序/页面对象 Pattern,因这里步骤定义通常很短。
  • 我喜欢你的场景我不会改变它们。 另一方面,尝试集中于基于xml的可读性,而不是面向对象的重用性。 如果你的语言一致,可以重用性将。
  • 为了提高可以重用性,尤它的是在讨论了大量实体的"更改"时,可以考虑使用步骤参数转换。 以下是一个示例:

你需要一个类别来表示测试中的许可许可:


class PermitDescription{


 bool suspended;


 bool draft;


}



创建转换器方法:


[StepArgumentTransformation("permit")]


public PermitDescription CreateSimple(){


 return new PermitDescription();


}


[StepArgumentTransformation("draft permit")]


public PermitDescription CreateDraft(){


 return new PermitDescription() { draft = true; }


}


[StepArgumentTransformation("suspended permit")]


public PermitDescription CreateSuspended(){


 return new PermitDescription() { suspended = true; }


}



你现在可以拥有更灵活的步骤定义,需要许可:


[Given(@"I have a (.*) for the day shift")]


public void Something(PermitDescription p)


{.. . }



匹配的内容:


Given I have a permit for the day shift


Given I have a draft permit for the day shift


Given I have a suspended permit for the day shift



当然这也是可以被滥用的工具,但在某些情况下它可以帮助。

...