【发布时间】:2016-05-09 11:05:31
【问题描述】:
我的 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 添加到期望语句中。我尝试在期望语句之前添加sleep 30。我仍然得到间歇性通行证。
那里有很多描述挑剔的 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 响应、功能或用户反馈。
所以实际上并没有一个单一的修复方法。老实说,可能需要进行一次重大的重构,并且是一项有价值的练习。通过将所有内容分解为单独的测试,这些测试失去了一些功能,但总的来说,这使得测试更易于阅读和维护。
仍有一些测试偶尔会显示为红色,需要做更多的工作。但总体来说进步很大。
感谢大家的出色指导,并让我放心,测试环境中的交互可能是根本原因。
【问题讨论】:
-
错误总是一样吗?只是想知道,你能添加一个示例错误吗?我们之前也有间歇性失败的规范,但我们发现这是另一个独立的错误导致它。
-
始终如一。我期待 Flash 内容
Failure/Error: expect(page).to have_content "#{target.model_name.human} was flagged!" expected to find text "Country was flagged!" in ......或选择器Failure/Error: expect(page).to have_selector "a.unflag-btn" expected to find css "a.unflag-btn" but there were no matches -
如果你认为客户端没有问题,下一个要看的地方可能是服务器端(即你没有任何随机变量,例如使用Faker gem ?)。如果此测试是本地连接(它不是远程 AJAX 测试),那么应该没有连接问题,因为它是本地的,因此我只能认为这是服务器端和/或客户端之一/两者导致间歇性错误的一侧。
-
对于服务器端调试,我通常只是在加载页面的那一行之后插入
byebug。那么你可以只检查page对象及其方法。 -
显示你实际的“令人沮丧的测试”代码和你得到的实际错误,我们可能会指出它为什么不稳定——你也可以确保你已经打开了 debug: true 和 js_errors:在 poltergeist 驱动程序中为真 - github.com/teampoltergeist/poltergeist#customization - 并发布创建的日志
标签: ruby-on-rails ajax rspec capybara