RSpec - 如何救援并重试测试?

时间:2016-12-13 16:04:29

标签: ruby rspec capybara

由于Net::ReadTimeout错误,我们间歇性地失败了测试。

我们还没有弄清楚永久性修复。目前我们想尝试抢救该特定错误并重新运行测试。不是一个理想的解决方案或真正的解决方案,但我们需要短期内的东西。

我们如何重新运行失败的rspec测试?我的意思是测试套件如何自动为该测试执行此操作?

我们可以抓住这样的错误:

# spec/support/capybara.rb
def rescue_net_read_timeout(max_tries = 1, tries = 0, &block)
  yield
rescue Net::ReadTimeout => e
  Rails.logger.error e.message
end

但我们如何让它尝试重新运行该测试? 我们想尝试重新运行测试,然后如果重新运行传递继续而没有错误(理想情况下记录它),否则实际失败并考虑测试,因此套件失败。

2 个答案:

答案 0 :(得分:1)

我使用名为rspec-repeat的红宝石宝石。在几百个自动化测试中,我们可能会在这里或那里遇到一个片状的问题,这有助于我们克服漏报。

理想情况下,最好继续诊断这些片状测试,但这有助于缓解过渡期间的问题。

旁注,rspec-repeat基于另一个名为rspec-retry的库,但我发现这个库的代码库更整洁,配置更容易使用。

答案 1 :(得分:0)

以下方法使用wait gem重试测试-或测试的一部分,可能只是断言。

def retry_test(&block)
  Wait.new(delay: 0.5, attempts: 10).until do
    begin
      yield    
      true # test passed
    rescue RSpec::Expectations::ExpectationNotMetError => x
      # make sure it failed for the expected reason
      expect(x.to_s).to match /Net::ReadTimeout/
      false # test failed, will retry
    end
  end
end

一个人可以验证失败的原因,如果测试由于其他原因失败,则可以立即报告失败。

it 'should get a response' do
  retry_test do
    # The entire test, or just the part to retry
  end
end