Rails アプリケーションの rspec テストを実行するたびに、実際にテストの実行を開始するまでに 1 日のオーバーヘッドがかかります。なぜrspecはとても遅いのですか? Rails の初期ロードを高速化する方法や、必要な Rails アプリの一部 (たとえば、ActiveRecord のもののみ) を選択して、いくつかのテストを実行するためにすべてを完全にロードしないようにする方法はありますか?
11 に答える
私は間違いなくスポークをチェックすることをお勧めします。
railstutorial は特にこれに対処し、Rails 3.0 で spork を適切に実行するための回避策を提供します (現時点では、spork はそのままで Rails 3 に対応していません)。もちろん、Rails 3.0 を使用していない場合でも問題ありません。
Rails 3.0 で spork を実行する方法を示すチュートリアルの部分
http://railstutorial.org/chapters/static-pages#sec:スポーク
スポークが Rails 3.0 に対応していることを確認する
script/spec
別のターミナル ウィンドウで実行し、spec 呼び出しにscript/spec_server
追加のパラメーターを追加することで、呼び出しを高速化できるはずです。-X
なぜrspecはとても遅いのですか? すべての環境、フィクスチャ、およびすべてのジャズをロードするためです。
データベースに依存する代わりにモックを使用して試すことができるRailsの初期ロードを高速化する方法はありますか?これは実際には単体テストには正しく、単体テストを確実に高速化します。さらに、@ Scott Matthewmanが言及した仕様サーバーを使用すると、@ Marc-Andre Lafortuneが言及した zentest の自動テストと同じように役立ちます。
いくつかのテストを実行するために完全にすべてをロードしないように、Rails アプリの必要な部分 (たとえば、ActiveRecord のもののみ) を選択する方法はありますか? これはどうですか
rake test:recent
rspec タスクがこれとどのように統合されるかはわかりませんが、test:recent タスクをテンプレートとして使用して、rspec テストで同じことを行うことができます。
rake test:rspec:recent
まだ存在しません
すべての環境、フィクスチャ、およびすべてのジャズをロードするためです。
本当の原因は、を使用して実行するとrake spec
、タスクがdb:test:prepare
実行されることです。
このタスクは、テスト データベース全体を削除し、最初から再作成します。これは私にはばかげているように思えますが、それが機能することです (実行すると同じことが起こりますrake:test:units
)。
spec
rspec gem の一部として rspec がインストールするアプリケーションを使用して、これを簡単に回避できます。
このような:
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
あなたが探している「禅」体験は、バックグラウンドで実行することでspec_server
ありautospec
、その結果、ファイルを保存するとほぼ瞬時にテストが行われると思います。
しかし、これら 2 つのプログラムの通信に問題があります。
ここで説明を見つけました:
autotest が spec_server にコマンドを送信しないことに気付きました。代わりに、実行するたびに Rails 環境全体とアプリケーションのプラグインをリロードします。script/spec コマンドを実行すると、すでに Rails 環境が起動され準備が整っている spec_server に spec が送信されるため、autotest の実行はスクリプト サーバーよりも大幅に遅くなります。新しいプラグインなどをインストールした場合は、spec_server を再起動する必要があります。
しかし、どうすればこの問題を解決できるでしょうか? ZenTest をダウンロードしてautotest
プログラムのコードを変更する必要があると思いますが、今は試す時間がありません。
Rails環境全体をロードする必要があり(スクリプト/コンソールを試してください)、その後で初めてすべてのテストを実行できるため、テストの実行は非常に遅くなる可能性があります。環境のロードを維持し、編集するファイルをチェックするautotestを使用する必要があります。ファイルを編集して保存すると、これらに依存するテストのみが自動的かつ迅速に実行されます。
これをRailsで実行していますか?もしそうなら、遅いのは RSpec の初期化ではなく、Rails です。Rails は、spec を実行する前に、コードベース全体とあなたのコードベースを初期化する必要があります。まあ、そうする必要はありませんが、そうする必要があります。私の小さな非Railsプロジェクトでは、RSpecはかなり高速に動作します。
Mac を使用している場合は、autotest よりも変更されたファイルのポーリングに使用するリソースがはるかに少ないため、autotest よりも Rspactor を使用することをお勧めします。完全な Cocoa バージョンの両方があります
または私がGithubで管理している gem バージョン
sudo gem install pelle-rspactor
これらは個々の rspec テストを高速化するわけではありませんが、保存を押してから 1 秒以内に影響を受ける仕様を自動実行するため、はるかに高速に感じられます。
rspec-rails-1.2.7 の時点で、spork gem が優先され、spec_server は非推奨になりました。
主な理由は、require が何らかの理由でWindows で永遠にかかることです。
スピードアップのヒント: spork は Windows で動作するようになったと思います。
場所をキャッシュする「faster_require」を試すことができます:
http://github.com/rdp/faster_require
GL。-rp
Windows環境でRailsの起動が非常に遅いため、Windows環境でできることはおそらくほとんどありません。Windows でも同じ経験があり、セットアップを Linux VM に移動して、本当に高速にする必要がありました (自動テストも使用していました)。