web-dev-qa-db-ja.com

RailsでRSpecがこんなに遅いのはなぜですか?

Railsアプリケーションに対してrspecテストを実行するときはいつでも、実際にテストの実行を開始するまでに永遠に1日かかるオーバーヘッドがあります。rspecが非常に遅いのはなぜですか?Railsの初期ロードを高速化する方法はありますか?または、必要なRailsアプリ(ActiveRecordのもののみなど)の一部を選択して、いくつかのテストを実行するためにすべてを完全にロードしないようにしますか?

44
Adrian Dunston

別のターミナルウィンドウでscript/specを実行し、スペック呼び出しにscript/spec_serverパラメータを追加することで、-X呼び出しを高速化できるはずです。

22

私は間違いなくスポークをチェックすることをお勧めします。

http://spork.rubyforge.org/

Railstutorialは特にこれに対処し、Rails 3.0でスポークをうまく実行するための回避策を提供します(現時点では、スポークはRails 3もちろん、Rails 3.0を使用していない場合は、問題ないはずです。

Rails 3.0でスポークを実行する方法を示すチュートリアルの一部

http://railstutorial.org/chapters/static-pages#sec:spork

スポークがRails 3.0の準備ができているとき

http://www.railsplugins.org/plugins/440-spork

32
John Hinnegan

それはすべての環境をロードし、備品とそのすべてのジャズをロードするからです。

本当の原因は、rake specを使用して実行した場合、 db:test:prepareタスクを実行します です。

このタスクは、テストデータベース全体を削除し、最初から再作成します。これは私にはばかげているように見えますが、それはそれが行うことです(rake:test:unitsなどを実行したときに同じことが起こります)。

これは、rspecがrspecgemの一部としてインストールするspecアプリケーションを使用して簡単に回避できます。

このような:

cd railsapp
spec spec # run all specs without rebuilding the whole damn database
spec spec/models # run model specs only

cd spec
spec controllers/user* # run specs for controllers that start with user
4
Orion Edwards

rspecがとても遅いのはなぜですか?すべての環境をロードし、フィクスチャとそのすべてのジャズをロードするからです。

Railsの初期ロードを高速化する方法はありますかデータベースに依存する代わりにモックを使用してみることができます。これは実際には単体テストに適しています。ユニットテストを確実にスピードアップします。さらに、@ Scott Matthewman が言及したスペックサーバーを使用すると、@ Marc-Andre Lafortune が言及したzentestの自動テストと同じように役立ちます。

必要なRailsアプリ(ActiveRecordのもののみ)など)の一部を特定して、実行するためにすべてを完全にロードしないようにする方法はありますか?いくつかのテスト?これはどうですか

rake test:recent 

Rspecタスクがこれとどのように統合されるかはわかりませんが、test:recentタスクをテンプレートとして使用して、rspecテストで同じことを行うことができます。

rake test:rspec:recent

まだ存在しません

4
Jean

あなたが探している「禅」体験は、バックグラウンドでspec_serverautospecを実行することであり、その結果、ファイルを保存するときにほぼ瞬時にテストが行​​われると思います。

ただし、これら2つのプログラムを通信させるのに問題があります。

説明を見つけました ここ

自動テストがspec_serverにコマンドを送信しないことに気づきました。代わりに、実行するたびにRails環境全体とアプリケーションのプラグインをリロードします。これにより、スクリプト/スペックコマンドを実行するとスペックがに送信されるため、自動テストの実行速度がスクリプトサーバーよりも大幅に遅くなります。すでにRails環境が起動し、準備ができているspec_server。新しいプラグインなどをインストールした場合は、spec_serverを再起動する必要があります。

しかし、どうすればこの問題を修正できますか? ZenTestをダウンロードし、autotestプログラムのコードを変更する必要があると思いますが、今は試してみる時間がありません。

4
Nappy

Rails環境全体をロードする必要があり(スクリプト/コンソールを試してください)、その後すべてのテストを実行できるため、テストの実行は非常に遅くなる可能性があります。 autotest を使用する必要があります。環境がロードされ、編集するファイルがチェックされます。ファイルを編集して保存すると、これらに依存するテストのみが自動的かつ迅速に実行されます。

これをRailsで実行していますか?もしそうなら、遅いのはRSpecの初期化ではなく、Railsです。 Railsは、スペックを実行する前に、コードベース全体とあなたのコードベースを初期化する必要がありますが、そうではありませんhaveto、しかしそれはそうです。RSpecは私の小さな非Railsプロジェクトの下で私にとってかなり速く実行されます。

3
Loren Segal

Rspec-Rails-1.2.7の時点で、spec_serverは廃止され、sporkgemが優先されます。

2

主な理由は、何らかの理由で、ウィンドウでrequire takeforeverが発生することです。

高速化のヒント:スポークはWindowsで動作するようになりました。

場所をキャッシュする「faster_require」を試すことができます。

http://github.com/rdp/faster_require

GL。 -rp

2
rogerdpack

Macを使用している場合は、自動テストよりもRspactorを使用することをお勧めします。これは、自動テストよりも変更されたファイルのポーリングに使用するリソースがはるかに少ないためです。両方の完全なCocoaバージョンがあります

RSpactor.app

または私が維持しているgemバージョン Github

Sudo gem install pelle-rspactor

これらは個々のrspecテストをスピードアップしませんが、保存を押してから1秒以内に影響を受けるスペックを自動実行するため、はるかに速く感じます。

2
Pelle

Windows環境を使用している場合は、RailsはWindowsでの起動が非常に遅いようです。Windowsでも同じ経験があり、セットアップをLinuxに移動する必要がありました。 VMそれを本当に気の利いたものにするために(私も自動テストを使用していました)。

1
DEfusion