【问题标题】:Cucumber: how to only execute background once for multiple scenariosCucumber:如何为多个场景只执行一次后台
【发布时间】:2011-12-12 17:34:48
【问题描述】:

我有一个需要几分钟的背景部分的功能;它通过 API 在远程系统上设置状态。我想让它对随后的所有场景只执行一次,而不是对每个场景都执行一次。我的场景不会改变任何状态,它们是只读的,因此从一个场景到另一个场景应该没有副作用。

我没有使用 Rails,也没有本地数据库,所以无法处理数据库事务。

我目前正在考虑对 env.rb 中的 Before 做一些事情,并有一些基于标签的隐式约定/含义的条件代码,例如“@background-only-once”,可以让一些自定义代码跳过这些步骤,或者它可以在步骤定义中执行不同的逻辑 - 但尝试在执行之间共享它有点讨厌。

想法?

【问题讨论】:

  • 当你说'让它对随后的所有场景只执行一次'时,这是否意味着同一个功能文件中的场景?是否必须重新调用您背景中的步骤(例如,如果其中一个出现在不同的功能文件中)?
  • a) 是的,我希望“背景”部分中的步骤只执行一次,然后再运行该功能中的任何场景。 b) 没关系;无论哪种方式都可以。
  • 这是一个很好的问题,我很惊讶没有可接受的答案。我有完全相同的问题,并且徘徊什么是处理它的最佳方法。非常感谢任何建议/帮助。
  • 我在 2013 年遇到了这个问题,并要求提供一些东西来满足这一需求(请参阅 groups.google.com/forum/#!topic/cukes/gTKZeUS_7dI)。显然,在 Cucumber 的一生中,它被多次请求和拒绝(尽管我在发布后不久就停止关注它)。

标签: cucumber cuke4duke


【解决方案1】:

这并不能真正解决它,但这是我在这种情况下所做的。

我去一个场景,只是在 cmets 中标记不同的“场景”。如果您只是将附加的场景标题注释掉,就会发生这种情况。

这里是注释掉第二个场景,并在第一个功能结束时运行测试状态的示例

Feature: Admin can manage organizations
  In order to ...

Scenario: can add
  When I log into the admin
  When I follow "Organizations"
  When I follow "Add"

  When I fill in "Email" with "red@cross.com"
  When I fill in "Name" with "Red Cross"
  When I press "Save"
  Then I should see "success"

# Scenario: can edit
  When I follow "Red Cross"
  When I fill in "Name" with "Green Cross"
  When I press "Update"

  Then I should see "success"

【讨论】:

  • 也许我对这里的术语不够熟悉,但不太明白你的建议——希望你能澄清一下。特别是,不明白您对“cmets”或“scenario headers”的引用......
  • 我添加了一个示例,我注释掉了 Scenario 标头
  • 投反对票。这基本上打破了 Cucumber 所做的很多假设,也放弃了测试隔离。
【解决方案2】:

如果您不希望每个场景都执行您的背景,那么它就不是背景,是吗?

如果每次运行 Cucumber 场景时都调用远程服务,不要这样做。相反,请使用 http://marnen.github.io/webmock-presentation/webmock.html 中所述的 Webmock 和 VCR。您的测试会更快、更准确。

【讨论】:

  • 其他测试框架具有 OP 所说的功能。例如,RSpec 有 before(:each) 和 before(:all) 用于此目的(参见stackoverflow.com/questions/16617052/…)。所以看起来问题是 - Cucumber 也提供这个吗?
  • @agentutah 是的,Cucumber 有这个功能,但是对于 OP 的用例来说这是个坏主意,除非场景可以绝对保证不改变状态(至少99%的时间,他们不可能)。由于测试调用远程服务,它们应该使用 Webmock 和 VCR 来消除网络开销。换句话说,OP 的测试方法有缺陷,应该修复。
  • 就 Guerkin 而言,以及“背景”代表什么,您是对的:它不是“背景”。然而,就第一次检查和可读性而言,“背景”确实应该运行一次,并且由于没有替代解决方案可以在多个场景之前运行一次,因此许多开发人员提出相同的问题并制作错误的假设就是“背景”。 Guerkin 也可能不打算提供一种编程语言,但开发人员希望像使用它一样使用它,因为它使测试变得更加容易。
  • @SteveTomlin “在多个场景之前运行一次,没有其他解决方案”不是真的。你可以使用 Cucumber 的 Before 钩子,可选地受标签约束。
  • 是的,这可以做到,但它是一个钩子,它不进入功能,而是进入代码。当然,这可以通过在功能中提供标签 \@background 来解决。还有另一个考虑因素是,如果多个功能需要相同的 \@background 标签,但您只希望背景运行一次,而不是每个功能您必须手动检测 \@background 是否已运行,这是可能的,但您必须对其进行编码。它不是背景只运行一次的想法的组成部分。也许应该有一个 AllFeaturesBackground。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多