主にこの Railscastの提案に従うことで、テストをスピードアップしようとするプロセスを開始しました。したがって、それを見る必要はありません。それらは次のとおりです。
- 「bundle exec spec」を「bin/rspec spec」に置き換え
- フィルターの前に余分なものを取り除きました
- 個別に実行するためにタグ付けされた遅いテストなど
- 不要な Factory Creates を Builds に置き換えました
- Zeus を使用して起動時間を短縮しました
- 外部 API にアクセスする例に VCR を適用
- 遅延ガベージ コレクション
- (この問題の真相を知りたいので、今のところ並列テストをスキップしました。並列テストは、それを最小化/マスクするだけのようです)
いずれにせよ、テストの実行時間は非常に変動しやすいため、これらの変更が大きな成果を上げたかどうかはわかりません。(これらのテストのために取り組んできたブランチの外に出ても、変数は変化します。既存の何かが問題を引き起こしているようです)。まったく同じ一連のテストを実行したところ、52 秒からほぼ 1 分 45 秒までの幅広いランタイムが得られました。繰り返しますが、まったく同じテストです。
さらに、一般的な傾向として、テストを連続して数回実行すると、実行時間は毎回最大 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
そして、それが前述の問題を引き起こしたとき、私はより単純な 10 回のテストごとの収集システムに切り替えました。
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) ✗>
最終的にはリセットされるように見えることに注意してください。