在大型 codebase/team 中重用黄瓜步骤

Reusing cucumber steps in a large codebase/team

我们在一个相当大的代码库上使用 cucumberJS,其中有数百个 cucumber 场景,我们 运行 遇到了步骤重用的问题。

由于 Cucumber 中的所有步骤都是全局的,因此很难编写类似 "and I select the first item in the list" 或类似的高级步骤。我们最终不得不附加 "on homepage"(因此:"I select the first item in the list of folders on homepage"),这感觉不对并且读起来不对。

此外,我发现很难弄清楚步骤之间的依赖关系。例如,我们使用 "and I see " 模式在 world 黄瓜实例上存储页面对象引用,以供后续步骤使用。我觉得这很尴尬,因为在阅读 .feature 文件时,这些依赖项几乎是不可见的。

关于如何在大型团队中使用 Cucumber,您有什么建议? (包括 "ditch cucumber and use instead" :) )

写 scenarios/steps 是关于您在做什么以及为什么这样做,而不是关于您如何做事。 Cucumber 是做 BDD 的工具。这里的关键词是行为及其解释。 Cucumber 和步骤背后的基本思想是每个行为(什么)在应用程序中都有唯一的名称和位置,在应用程序上下文中,您可以使用该名称毫无歧义地讨论该行为。

所以你的例子永远不应该是分步的,因为它们是关于你如何做某事的。好的步骤从不谈点击或选择。相反,他们会谈论您点击或选择的原因。

当您遵循此模式时,您最终会在更高的抽象层次上完成更少的步骤,每个步骤都专注于一个特定的主题。

此模式易于实施,并且相对容易维护。困难在于,要编写场景,您必须深刻理解您在做什么以及为什么它很重要,这样您就可以 discover/uncover 使用您需要的语言来清晰、清晰和简单地表达自己。

我将给出有关登录的标准示例。我使用它是因为我们对什么是登录及其重要性有着共同的理解。在您登录之前意识到您必须注册并且这很复杂。

Scenario: Login
  Given I am registered
  When I login
  Then I should be logged in

这个实现很有趣,因为我将所有工作委托给辅助方法

  Given I am registered
    @i = create_registered_user
  end

  When I login
    login_as(user: @i)
  end

  Then I should be logged in
    should_be_logged_in
  end

现在您的问题变成了管理辅助方法之一。你拥有的是一个带有大量辅助方法的全局命名空间。现在这是一个代码和命名问题,你所要做的就是

  • 使辅助方法的数量尽可能少
  • 保持每个辅助方法简单
  • 确保方法名称之间没有歧义
  • 确保没有重复

这仍然是一个难题,但是 - 它不像你正在处理的那么难 - 走到这一步有大量额外的好处 - 现在是代码问题,很多人都有管理代码的经验。

你可以用 - 命名规则(我上面的所有方法都以他们的名字登录) - 聪明但有节制地使用参数 - 频繁重构和代码清理

你的辅助方法的代码将有 - 您所有应用程序代码的最高流失率 - 最需要简单明了

因此,目前您的问题不在于 Cucumber,而在于您对现有方案及其实施的欠债。想变好就得还债,祝你好运