仅在特定故障的情况下重新运行黄瓜步骤

时间:2016-09-22 15:11:30

标签: ruby-on-rails ruby selenium cucumber

使用Selenium在CircleCI中运行Cucumber有时由于CircleCI的性能而导致测试失败。常见的失败是Net::ReadTimeout错误,这似乎永远不会发生在本地。我想挽救那个错误的步骤并再次尝试,但我想要重新运行所有失败的测试。

我可以将构建拯救到似乎触发此错误的特定步骤,但理想情况下,我可以向Cucumber提供一次或两次拯救的错误列表,以重新运行该步骤,最后让错误通过。

类似的东西:

# support/env.rb
Cucumber.retry_errors = {
  # error => number of retries
  "Net::ReadTimeoutError" => 2
}

有这样的事吗?

3 个答案:

答案 0 :(得分:0)

如果你在Cucumber找到类似你想要的东西,我会感到惊讶。

重新运行一个失败的步骤,只是为了确保它是一个真正的失败而不仅仅是一个随机的网络故障,从我的角度来看,解决了错误的问题。

我的方法是看看您正在寻找的验证是否可以在没有网络的情况下进行。如果我真的必须重新运行几次以确保错误确实是一个错误,我可能还会考虑使用除Cucumber之外的其他工具。然而,这会让我陷入另一个兔子洞。你应该跑多少次,门槛是多少?你应该通过五次执行中的三次来宣布通过考试吗?它在我眼中变得非常难看。

答案 1 :(得分:0)

看起来这个问题是Selenium需要花费很长时间才能在第一次测试时编译资产。后续测试使用编译的资产,没有问题。查看this Github issue后,我提高了Selenium的超时限制。

Capybara.register_driver :chrome do |app|
  http_client = Selenium::WebDriver::Remote::Http::Default.new
  http_client.timeout = 120 # default is 60 seconds
  Capybara::Selenium::Driver.new(app, browser: :chrome, http_client: http_client)
end

答案 2 :(得分:0)

我知道这并不只捕获特定类别的重试,但是现在确实存在一种在黄瓜中进行重试的干净方法,特别是因为在Google搜索“重新运行黄瓜”时会出现此结果

在您的cumul.yml文件中,您现在可以执行以下操作:

<%
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags 'not @wip'"
std_opts_with_retry = "#{std_opts} --no-strict-flaky --retry 3"
%>
default: <%= std_opts_with_retry %> features

关于“片状”测试是否应视为失败,存在着很大的哲学争论。如果通过“ --strict”,则默认为“片状”测试(aka:在第一次运行中失败并在随后的运行中通过的测试)使运行失败。因此,为了使不稳定的测试不会“失败”您的测试运行,您可以通过附加的--no-strict-flaky--retry 3选项,现在可以通过任何有时需要花费可变时间的测试CI平台将不需要重新构建整个提交。

执行此操作时要注意的一件事:通常,我建议您将超时时间降低到一个合理的极限,在该极限下大多数测试都可以通过而无需等待很长时间,尽管我知道在这种情况下可以容纳更长的时间编译时间。