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