2011-12-12 108 views
3

我有一个背景部分需要多分钟的功能;它通过API在远程系统上设置状态。我希望它只对所有后续的场景执行一次,而不是针对每种场景执行。我的场景不会改变任何状态,它们是只读的,所以不应该从一种场景到另一种场景产生副作用。黄瓜:如何执行多个场景一次背景

我没有使用rails,也没有本地数据库,所以不能做数据库事务。

我目前正在考虑在env.rb中使用Before来做些事情,并且根据隐式约定/标记的含义来创建一些条件代码。 “@ background-only-once”,可以让一些自定义代码跳过这些步骤,或者它可以在步骤定义中执行不同的逻辑 - 但是尝试在执行过程中共享这一点有点令人讨厌。

想法?

+0

当你说'对于所有后续的场景只执行一次',这是否意味着在同一个特性文件中的场景?是否必须重新调用后台中的步骤(例如,如果其中一个步骤出现在不同的功能文件中)? –

+0

a)是的,我想在“背景”部分中的步骤仅在该特性*中的任何场景*运行之前执行一次。 b)无关紧要;它可以以任何方式工作。 –

+0

这是一个很好的问题,我很惊讶没有可以接受的答案。我有完全相同的问题,徘徊什么是处理它的最好方法。任何建议/帮助非常感谢。 –

回答

3

这并没有真正解决它,但这是我在这种情况下做的。

我去了一个场景,只是在注释中标注不同的“场景”。如果您只是将额外的场景标题添加到注释中,情况正是如此。

这里是注释掉第二个方案,并在第一功能

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 "[email protected]" 
    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" 
+0

也许我对这里的术语不够熟悉,但不太了解你的建议 - 希望你能澄清。特别是,不理解你对“评论”或“场景头文件”的引用...... –

+0

我添加了一个例子,在其中我注释了场景头 –

0

结束测试状态的运行如果你不想为每个方案要执行你的背景做榜样,那么它不是背景,是吗?

如果您每次运行黄瓜方案时都打电话给远程服务,那么不要那样做。相反,如http://marnen.github.io/webmock-presentation/webmock.html所述使用Webmock和VCR。您的测试将更快,更准确。

+0

其他测试框架具有OP正在讨论的功能。例如,RSpec具有之前(:每个)和之前(:所有)用于此目的(请参阅http://stackoverflow.com/questions/16617052/rails-rspec-before-all-vs-before-each)。所以看起来问题似乎 - 黄瓜也提供这个? –

+0

@agentutah是的,Cucumber具有这种功能,但对于OP的用例来说这是一个坏主意,除非这些场景可以*绝对保证*不改变状态(至少99%的时间不能改变状态) 。由于测试正在调用远程服务,因此他们应该使用Webmock和VCR来消除网络开销。换句话说,OP的测试方法有缺陷,应该修正。 –

+1

就Guerkin而言,'背景'代表什么,你是对的:它不是'背景'。然而,就第一次检查而言,可读性“背景”似乎应该只运行一次,并且由于在多个场景之前没有其他解决方案来运行某些内容,所以许多开发人员都会问同样的问题并使其错误的假设就是'背景'。 Guerkin也许并不打算提供一种编程语言,但是开发人员想要像一样使用它,因为它使测试变得更加简单。 –