我如何有条件地跳过Cucumber中的场景?

时间:2014-03-10 15:11:36

标签: ruby cucumber

如何有条件地跳过某个场景?

例如,我希望仅在满足某些条件时才继续使用某个场景,但如果不存在则我不希望它注册为失败。

6 个答案:

答案 0 :(得分:6)

这是我遇到的问题。我写的测试是针对一个UI,它有一个不断变化的BE数据库,我目前无法拥有静态数据。 这意味着有时可能没有测试数据。 不是通过而不是失败,只是无法运行。

我发现最好的方法是调用黄瓜待定。

示例测试:

Scenario: Test the application
  Given my application has data
  When I test something
  Then I get a result

示例步骤def:

Given /^my application has data$/ do
  pending unless application.has_data?
end

这些是我能看到的结果:

201 scenarios (15 pending, 186 passed)
1151 steps (15 pending, 1136 passed)

值得注意的是,我有额外的调试并且标记了这些测试,以便我可以随时再次运行这些待处理的测试。

希望这有帮助, 本。

答案 1 :(得分:5)

对于仍在寻找答案的人: 除了使用pending或特定配置文件跳过具有特定标记的方案之外,还有至少2种方法可以实现此目的。

我能理解为什么你需要这个,因为我有类似的问题并得到了解决方案,因此值得分享。 在我的情况下,我有一个功能预计可以在3/10设备上使用,并且预计在剩余的7个设备上不可用。

使用'待定'​​跳过的注意事项:

  • 由于测试和代码已实施,因此将步骤标记为pending感觉不对。
  • 它引起了混乱,因为在运行结束时很难区分真正的pending场景与跳过但标记为pending的场景
  • 某些CI作业(Jenkins / Hudson)可能会因未决方案而配置为失败,从而导致更多麻烦。

所以,我宁愿在执行期间跳过它们,具体取决于使用哪种浏览器的条件。我也不希望有太多特定于某些浏览器/设备的配置文件

解决方案

  1. 使用cucumber.yml有条件地跳过标记的场景
  2. 这是一个关于黄瓜的已知忽略的有趣事实(来自https://github.com/cucumber/cucumber/wiki/cucumber.yml):

      

    cucumber.yml文件由ERb预处理;这允许您使用ruby代码在cucumber.yml文件中生成值

    • 在此基础上,使用独特的内容标记您的方案,例如@conditional

      • 在黄瓜配置(cucumber.yml)的开头,应用所提到的任何配置文件的条件逻辑

        <% included = (ENV['BROWSER'] =~ /chrome/) ? "-t @conditional" : "-t ~@conditional" %>

        included只是一个变量,根据条件具有包含/排除的标记值

      • 现在在默认配置文件中使用此条件变量 default: <%= included %>

    现在,您的默认配置文件将使用条件逻辑标识的包含/排除测试。

    1. (更复杂,不优雅)使用rake任务执行黄瓜:
    2. 有条件地选择要在rake任务中包含/排除的标签,并将它们传递给黄瓜执行。

      希望这有帮助。

答案 2 :(得分:3)

您可以在开始黄瓜之前检查条件,然后使用可以跳过具有某些标签的方案的配置文件。把它放在你的cucumber.yml:

default: --tags ~@wip --tags ~@broken --no-source --color 
limited: --tags @core --tags ~@wip --tags ~@broken --no-source --color

将@core替换为您要用于运行cukes的任何标记(或使用〜来排除cukes)。然后从检查条件的shell脚本运行有限的配置文件:

cucumber -p limited

答案 3 :(得分:2)

请参阅此解决方案,该解决方案真正跳过了该方案,而不是乱扔未决错误:

Before do |scenario|
      scenario.skip_invoke!
   end

答案 4 :(得分:2)

我正在标记我的场景,然后在我的&#34; step_definitions / hooks.rb&#34;文件,我有这样的事情:

Before('@proxy') do 
  skip_this_scenario unless proxy_running?
end
另一个答案中提到的

scenario.skip_invoke!似乎已被弃用。

答案 5 :(得分:1)

简短回答:为什么?

答案很长: 黄瓜旨在用于模拟最终用户(通常是客户)的需求。这些功能旨在详细说明预期在其中使用的方案列表,以及功能在暴露于这些方案时应显示的预期结果。这些要求不是有条件的 - 客户希望他们始终工作。如果在禁用X时Y不起作用,则将其放在Given子句中,因为这是Y的场景。

给定将您的场景的状态设置为已知的状态。你说,“给定”这些已知的变量,我执行此操作时,然后这应该发生。通过'有条件地跳过'一个Cucumber条款,你说一个功能只有在另一个功能有效时才能工作..在这种情况下,你为什么不把它放在给定的子句中呢?

据我所知, 可以跳过步骤(虽然我不记得为什么),我只是质疑为什么你想做什么那。我可以看到你想要这样做的唯一原因是,当模块B被禁用时,模块A不应该工作。但是你的模块相互依赖,然后你的代码被耦合 - 这正是Cucumber / TDD / BDD鼓励你避免的。

示例我发表在评论中:

Feature: Slicing Bread
  As a hungry person
  I want to be able to slice bread
  so that I can eat smaller bits of my sandwich and enjoy it much more

Scenario: Slicing bread in half
  Given a knife and a piece of bread
  When I cut the bread in half
  Then I should have two pieces of bread

如果'Given'要求失败,这种情况就不会成功。如果“给定”要求失败 - 例如Given a spoon and some soup,那么你最终不可能期望最终得到两片面包。因此,您正在尝试测试未定义的行为。你是想说,如果你有一把勺子和一些汤,切割面包不应该在这个宇宙中工作?没有?那么为什么要跳过步骤?