Rspec测试需要大量可变的时间

时间:2013-05-22 18:21:44

标签: ruby-on-rails ruby-on-rails-3 rspec garbage-collection

我开始尝试加快测试速度,主要是遵循this railscast的建议。所以你不必看,它们是:

  • 将“bundle exec spec”替换为“bin / rspec spec”
  • 在过滤器之前摆脱多余的
  • 标记慢速测试,因为单独运行
  • 用Builds替换了不必要的Factory Creates
  • 使用Zeus加快启动时间
  • 将VCR应用于与外部API相关的示例
  • 延迟垃圾收集
  • (我现在跳过并行测试,因为我想深入研究这个问题,并行测试似乎只是最小化/掩盖它)。

无论如何,我无法弄清楚这些变化是否已经取得了很大成就,因为我的测试的运行时间变化很大。 (即使我走出分支机构,我一直在为这些测试工作,它们也是可变的 - 似乎先前存在的东西导致问题)。我现在运行完全相同的测试套件,并获得了大量的运行时间,从52秒到近1m45!再次,完全相同的测试。

此外,总体趋势似乎是如果我连续几次运行测试,每次运行时间间隔增加约20秒。然后,如果我在spec_helper中改变一些小的东西或者等待一段时间(我认为后者 - 我知道当我对垃圾收集进行了小的更改时发生了这种情况),时间会再次下降。

我的猜测是这个问题与垃圾收集有关 - 但理想情况下,我现在正在更有效地做这件事。我每隔约15秒收集一次垃圾,

spec_helper.rb

config.before(:all) { DeferredGarbageCollection.start }
config.after(:all) { DeferredGarbageCollection.reconsider }

支持/ deferred_garbage_collection.rb

class DeferredGarbageCollection

  DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 15.0).to_f

  @@last_gc_run = Time.now

  def self.start
    GC.disable if DEFERRED_GC_THRESHOLD > 0
  end

  def self.reconsider
    if DEFERRED_GC_THRESHOLD > 0 && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
      GC.enable
      GC.start
      GC.disable
      @@last_gc_run = Time.now
    end
  end
end

然后,当这导致上述问题时,我转而采用更简单的每十个测试收集系统:

spec_helper.rb

config.after(:each) do
  counter += 1
  if counter > 9
    GC.enable
    GC.start
    GC.disable
    counter = 0
  end
end
config.after(:suite) do
  counter = 0
end

我试图将其与一组测试(模型/请求/控制器)隔离开来,但它们似乎都显示出一定程度的可变性,大致相当于他们吃多少时间。

任何想法在这里出了什么问题?

编辑 - 这里发生了什么的证据/示例:

Finished in 22.88 seconds
48 examples, 0 failures
➜ my_app git:(faster-tests) ✗>zeus test spec/models
................................................

Finished in 34.89 seconds
48 examples, 0 failures
➜ my_app git:(faster-tests) ✗>zeus test spec/models
................................................

Finished in 44.68 seconds
48 examples, 0 failures
➜ my_app git:(faster-tests) ✗>zeus test spec/models
................................................

Finished in 14.36 seconds
48 examples, 0 failures
➜ my_app git:(faster-tests) ✗>zeus test spec/models
................................................

Finished in 18.74 seconds
48 examples, 0 failures
➜ my_app git:(faster-tests) ✗>

请注意,它似乎最终会重置。

1 个答案:

答案 0 :(得分:0)

我不确定你做过的所有其他事情,但我可以对宙斯发表评论。我没有在我的环境中改变任何东西,除了添加宙斯,我可以在几秒钟内运行50个例子。在运行宙斯时测试可以和你一样长,这似乎是错误的,我猜这是你的问题。运行zeus start之后所有的zeus命令都是绿色的吗?我还使用zeus rspec spec/....来运行我的规范,而不是zeus test

我使用了此railscast和此thoughtbot article以及zeus README。记得使用railscast中提到的相应Ruby版本,如果你使用spork,请确保你不再有spork。还记得在你的Gemfile之外安装zeus,zeus不应该使用Bundler。无论如何,我的建议是首先关注宙斯并使其正常工作。它真的对我有帮助