如何有条件地跳过某个场景?
例如,我希望仅在满足某些条件时才继续使用某个场景,但如果不存在则我不希望它注册为失败。
答案 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
的场景所以,我宁愿在执行期间跳过它们,具体取决于使用哪种浏览器的条件。我也不希望有太多特定于某些浏览器/设备的配置文件
解决方案:
这是一个关于黄瓜的已知忽略的有趣事实(来自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 %>
现在,您的默认配置文件将使用条件逻辑标识的包含/排除测试。
有条件地选择要在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
,那么你最终不可能期望最终得到两片面包。因此,您正在尝试测试未定义的行为。你是想说,如果你有一把勺子和一些汤,切割面包不应该在这个宇宙中工作?没有?那么为什么要跳过步骤?