0

主にこの 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) ✗>

最終的にはリセットされるように見えることに注意してください。

4

1 に答える 1

0

あなたが行った他のすべてのことについてはわかりませんが、ゼウスについてコメントできます. 私の環境では、zeus を追加する以外は何も変更していません。数秒で 50 の例を実行できます。ゼウスを実行しているときにテストに時間がかかるのは間違っているようで、それがあなたの問題だと思います。実行後zeus start、すべての zeus コマンドは緑色ですか? zeus rspec spec/....の代わりにスペックを実行するためにも使用しますzeus test

このrailscastとthis thinkbot articleをzeus READMEと共に使用しました。Railscast に記載されている適切な Ruby バージョンを使用することを忘れないでください。また、zeus を の外にインストールすることを忘れないでくださいGemfile。zeus は Bundler を使用しないでください。とにかく、私の提案は、最初にゼウスに焦点を合わせて、それを正しく機能させることです. それは私にとって本当に役に立ちました

于 2013-05-22T21:15:50.693 に答える