测试 有人遇到过 RSpec + Capybara 下,有 testcase 随机挂掉的情况吗?

serco · 2013年11月04日 · 最后由 xwf286 回复于 2013年12月11日 · 2323 次阅读

实在无解了。。找了很久没有找到问题。 已经按照 capybara 的方式等待元素加载完成,甚至在会随机挂掉的 testcase 中加入 wait n seconds 的方式,还是不行。。。

是不是 record not found? 经常会碰到页面里有 AJAX 请求,在 after hook 里数据库被清理了,这个请求还在处理导致某些数据找不到。目前也没好的办法,一是能不带 js 测就不带,不相关的 js 可以在测试中禁用掉。

随机挂掉应该是 test 或者代码确实有问题把,我遇到过一种情况是用 factoryGirl 生成带有 sequence 字段的数据时验证会随机挂掉,因为写单个 test 时都是没问题的,一块跑起来 sequence 计数就变了

恩,应该是你某个测试改变了一些会影响全局的东西,然后又没有还原,所以就挂了

因为默认每个测试都是随机顺序跑的,在没受到影响前应该是可以过的,如果在环境被改变了再去跑,自然就失败了,这样表现为,一个个跑是没问题的,但放一起跑就随机挂了,更精彩的是每次跑 rspec 挂的那些 case 都不同。。

@xjz19901211 我这里的情况并非 test case 之间的相互影响,单个跑也会出现错误,但是概率比较低。

@doitian 如果是需要 ajax 请求结束的话,用 jquery 的话,下面的代码应该可以保证

def wait_for_ajax
  counter = 0
  while page.evaluate_script("$.active").to_i > 0
    counter += 1
    sleep(0.1)
    raise "AJAX request took longer than 5 seconds." if counter >= 50
  end
end

@dddd1919 应该还是单个 test 写的有问题,因为随机挂掉的总是那两个 test。debug 的结果是,同一个 form 下的 checkbox,有时会勾上,有时却没有勾上,不明白是否是因为这个表单是用了 bootstrap 的 modal 的缘故。

#4 楼 @serco 那有可能是 bootstrap 的问题,我测的时候偶尔也有标签出问题,把单个 test 重复跑 n 遍试试,如果确实是偶现问题但不影响功能就把断言改下吧,或者把出问题的控件换一个

flaky test 吧,多跑几次,加个容忍度。

把等待时间设得足够长,我通常是 60 秒,这个够长了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号