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

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

例如,我希望仅在满足某些条件的情况下才继续使用方案,但如果不存在则我不希望将其注册为失败。

这是我遇到的一个问题。 我编写的测试针对的是一个不断变化的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) 

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

希望这有帮助,本。

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

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

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

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

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

方案

  1. 使用cucumber.yml有条件地跳过标记的场景

这是一个关于黄瓜的已知忽略的有趣事实(来自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 %>值中使用此条件变量default: <%= included %>

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

  1. (更复杂,更不优雅)使用rake任务执行黄瓜:

有条件地选择要在rake任务中包含/排除的标签,并将它们传递给黄瓜执行。

希望这可以帮助。

您可以在开始黄瓜之前检查条件,然后使用可以跳过具有某些标签的方案的配置文件。 把它放在你的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 

请参阅此解决方案,该解决方案真正跳过了方案,而不是抛出待处理的错误:

 Before do |scenario| scenario.skip_invoke! end 

我正在标记我的场景,然后在我的“step_definitions / hooks.rb”文件中,我有这样的事情:

 Before('@proxy') do skip_this_scenario unless proxy_running? end 

scenario.skip_invoke! 在另一个答案中提到的似乎已被弃用。

简答:为什么?

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

给定将场景的状态设置为已知的状态。 你说,“给定”这些已知的变量, 我这样做时, 那么这应该发生。 通过’有条件地跳过’一个Cucumber条款,你说一个function应该只在另一个function有效时工作..在这种情况下,你为什么不把它放在你的给定条款中?

据我所知, 可能跳过步骤(虽然我不记得为什么),我只是质疑你为什么要这样做。 我可以看到你想要这样做的唯一原因是,当模块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 ,你不可能期望最后得到两片面包。 因此,您正在尝试测试未定义的行为。 你是想说,如果你有一把勺子和一些汤,切割面包应该不再在这个宇宙中工作? 没有? 那为什么要跳过步骤?