我开始尝试加快测试速度,主要是遵循this railscast的建议。所以你不必看,它们是:
无论如何,我无法弄清楚这些变化是否已经取得了很大成就,因为我的测试的运行时间变化很大。 (即使我走出分支机构,我一直在为这些测试工作,它们也是可变的 - 似乎先前存在的东西导致问题)。我现在运行完全相同的测试套件,并获得了大量的运行时间,从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) ✗>
请注意,它似乎最终会重置。
答案 0 :(得分:0)
我不确定你做过的所有其他事情,但我可以对宙斯发表评论。我没有在我的环境中改变任何东西,除了添加宙斯,我可以在几秒钟内运行50个例子。在运行宙斯时测试可以和你一样长,这似乎是错误的,我猜这是你的问题。运行zeus start
之后所有的zeus命令都是绿色的吗?我还使用zeus rspec spec/....
来运行我的规范,而不是zeus test
。
我使用了此railscast和此thoughtbot article以及zeus README。记得使用railscast中提到的相应Ruby版本,如果你使用spork,请确保你不再有spork。还记得在你的Gemfile
之外安装zeus,zeus不应该使用Bundler。无论如何,我的建议是首先关注宙斯并使其正常工作。它真的对我有帮助