ruby-on-rails - 什么是调试间歇性失败规范的系统方法?

标签 ruby-on-rails ajax rspec capybara

我的 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语句。我试过添加 sleep 30在expect语句之前。我仍然收到断断续续的传球。
有相当多的信息描述了挑剔的 ajax 测试,但我还没有找到太多关于如何调试和修复这类问题的信息。
在我拔掉所有头发之前,我真的很感谢其他人的任何建议或指示!!
更新
感谢所有这些出色的回应。看到其他人也在努力解决类似的问题,这很有用,而且我并不孤单。
那么,有解决办法吗?
使用调试工具的建议,例如 pry、byebug、Poltergeist 的调试功能(感谢 @Jay-Ar Polidario、@TomWalpole)有助于确认我认为我已经知道的东西——即,正如@BM5K 所建议的那样)这些功能有效始终在浏览器中,错误位于测试中。
我尝试调整超时和重试(@Jay-Ar Polidario,@BM5K),虽然有所改进,但这些仍然不是一致的修复。更重要的是,这种方法感觉像是修补漏洞而不是适当的修复,所以我并不完全舒服。
最终,我对这些测试进行了重大重写。这需要分解多步骤功能,并单独设置和测试每个步骤。虽然纯粹主义者可能声称这不是从用户的角度真正进行的测试,但每个测试之间有足够的重叠,我对结果感到满意。
在执行此过程时,我确实注意到所有这些错误都与@BoraMa 建议的“点击事物或填写表格”有关。尽管在这种情况下,体验发生了逆转——我们采用了 .trigger('click')语法,因为 capybara + poltergeist 使用 click_link 报告单击元素时出错或 find(object).click ,正是这些测试存在问题。
为了避免这些问题,我尽可能地从测试中删除了 JS。即,在不启用 JS 的情况下测试大部分功能,然后创建非常短的、有针对性的 JS 规范来测试特定的 JS 响应、功能或用户反馈。
所以没有真正的单一修复。老实说,可能需要进行一次重大的重构,并且是一项有值(value)的工作。通过将所有内容分解为单独的测试,这些测试失去了一些功能,但总的来说,这使测试更易于阅读和维护。
还有一些测试偶尔会显示红色,需要做更多的工作。但总体来说进步很大。
感谢大家的指导,并向我保证测试环境中的交互可能是根本原因。

最佳答案

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

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

您是否混合和匹配 javascript 测试和非 javascript 测试?如果是,您可能会遇到数据库问题(我已经看到由于在上下文块中切换数据库清理策略而导致的问题)。

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

如果这些都没有缩小您的搜索范围,请使用允许您重试失败测试的 gem。

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

TL; 博士

我遇到的大多数间歇性失败的测试都有很多移动部分(rails、 capybara 、数据库清理器、工厂女孩、phantomjs、rspec 仅举几例)。如果代码经过测试并且规范经常通过并且该功能在浏览器中始终有效,则测试环境中的某些交互可能是间歇性故障的根本原因。如果您无法追踪,请重试失败的规范几次。

关于ruby-on-rails - 什么是调试间歇性失败规范的系统方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37114184/

相关文章:

ruby-on-rails - Rails 4,设计登录规范失败?

ruby-on-rails - 为 ruby​​ on rails web 应用程序创建试用期

ruby-on-rails - 在 Heroku 上设置 Puma Worker 数量

java - 无法使用 javascript 提交()接缝表单

javascript - Codeigniter ajax CSRF问题

ruby - 在 rspec 中为 after_create Hook 创建 stub

ruby-on-rails - 有什么方法可以使用公共(public) URL 在 Rspec 中测试文件上传吗?

ruby-on-rails - Rails-Rubocop-开始+救援语法

javascript - 从 javascript 调用 web 方法时出现 ASP.NET 500 内部服务器错误

ruby - 用 RSpec 打桩 Time.now