我在Capybara/Rspec套件中有四个测试一直失败(对于CI部署是一个真正的问题)。
最糟糕的是,这些测试会间歇性地失败,并且通常只有在整个套件都运行时才会失败,这使得调试变得很困难。
它们都是ajax请求,要么提交远程表单,要么单击远程链接,后跟expect(page).to have_content 'My Flash Message'
这些测试甚至在同一测试周期内间歇性地失败。例如,我有几个行为相似的模型,因此我要遍历它们进行测试。

e.g.,
['Country', 'State', 'City'].each do |object|
  let(:target) { create object.to_sym }
  it 'runs my frustrating test' do
  end
end
有时国家会失败,有时会声明,​​有时一切都会过去。
我尝试将wait: 30添加到Expect语句中。我尝试在Expect语句之前添加sleep 30。我仍在间歇性地过关。
那里有很多描述苛刻的ajax测试的信息,但是我没有找到有关如何调试和解决这类问题的很多信息。
在我把所有的头发拔掉之前,我真的很感谢别人的建议或指教!!
更新
感谢您做出的所有这些出色答复。看到其他人都在努力解决类似的问题非常有用,而且我并不孤单。
那么,有解决方案吗?
有关使用调试工具(如pry,byebug,Poltergeist的调试功能)的建议(感谢@ Jay-Ar Polidario,@ TomWalpole)对于确认我认为我已经知道的内容很有用-即,如@ BM5K所建议的那样,这些功能可以正常工作在浏览器中保持一致,并且错误出在测试之内。
我尝试过调整超时和重试次数(@ Jay-Ar Polidario,@ BM5K),尽管进行了改进,但仍然不是一个一致的解决方案。更重要的是,这种方法就像打洞而不是适当的修复,因此我并不完全满意。
最终,我对这些测试进行了重大重写。这需要分解多步骤功能,并分别设置和测试每个步骤。从用户的角度来看,纯粹主义者可能认为这并不是真正的测试,但每次测试之间都有足够的重叠之处,我对结果感到满意。
在执行此过程时,我确实注意到所有这些错误均与@BoraMa建议的“单击事物或填写表格”有关。尽管在这种情况下体验相反-我们采用.trigger('click')语法,因为capybara + poltergeist报告使用click_linkfind(object).click的元素单击错误,而这些测试是有问题的。
为了避免这些问题,我尽可能地从测试中删除了JS。即在未启用JS的情况下测试大多数功能,然后创建非常简短的目标JS规范来测试特定的JS响应,功能或用户反馈。
因此,实际上并没有一个解决方案。老实说,可能需要进行一次重大重构,这是一次宝贵的工作。通过将所有内容分解为单独的测试,这些测试失去了某些功能,但总体而言,这使测试更易于阅读和维护。
仍然有一些测试偶尔会显示红色,并且需要做更多的工作。但是总体上有了很大的改善。
谢谢大家的指导,让我放心,测试环境中的交互可能是根本原因。

最佳答案

间歇性失败的测试很难排除故障,但是您可以做一些事情来简化生活。首先是删除任何循环或共享示例。明确说明每个期望应该更清楚地说明哪个示例组合失败了(或者更明显的是它确实是随机的)。

在几次运行过程中,跟踪哪些测试失败。它们都在同一个上下文组中吗?

您是否正在混合和匹配javascript测试和非javascript测试?如果是这样,您可能会遇到数据库问题(我已经看到了在上下文块中切换数据库清理策略所引起的问题)。

确保您考虑了测试所在的任何父上下文块。

并且,如果这些都不能缩小搜索范围,请使用gem,让您重试失败的测试。

我过去使用过respec-retry,但最近发现它不可靠。我已切换到rspec-repeat。我通常不进行开发(配置为1次尝试),并在CI上进行多次尝试(通常为3次)。这样,我可以感觉到哪些测试在本地不稳定,但不要让这些测试破坏我的构建(除非它们始终失败)。

TL; DR

我遇到的大多数间歇性失败测试都有很多动人的项目(例如,rails,capybara,数据库清理器,factory girl,phantomjs,rspec等)。如果代码经过测试且规范经常通过且功能在浏览器中始终有效,则测试环境中的某些交互作用是间歇性故障的根本原因。如果您无法找到原因,请重试失败的规范几次。

10-05 22:52
查看更多