10秒は、単一のテストを実行するには非常に長い時間です。私の直感は、仕様ターゲットが単体テストと統合テストの両方を同時に実行していることです。これは、プロジェクトが陥る典型的なことであり、ある段階で、より多く、より速く生産したい場合は、この技術的負債を克服する必要があります。これを行うのに役立ついくつかの戦略があります...そして、私が過去に使用したいくつかをお勧めします。
1.ユニットを統合テストから分離する
私が最初に行うことは、ユニットを統合テストから分離することです。次のいずれかの方法でこれを行うことができます。
- それらを(specディレクトリーの下の別個のフォルダーに)移動し、rakeターゲットを変更する
- タグを付ける(rspecを使用すると、テストにタグを付けることができます)
哲学は、あなたはあなたの定期的なビルドを速くしたいということです-そうでなければ、人々はそれらを頻繁に実行するのにあまりにも幸せではないでしょう。だから、その領域に戻ります。通常のテストをすばやく実行し、継続的インテグレーションサーバーを使用して、より完全なビルドを実行します。
統合テストは、外部の依存関係(データベース、WebService、キュー、および一部はFileSystemを主張するものなど)を伴うテストです。単体テストは、チェックしたい特定のコード項目をテストするだけです。高速で実行する必要があります(45秒で9000が可能です)。つまり、ほとんどがメモリで実行されます。
2.統合テストを単体テストに変換する
単体テストの大部分が統合テストスイートよりも小さい場合は、問題があります。これは、矛盾がより簡単に現れ始めることを意味します。したがって、ここから、統合テストに代わるユニットテストの作成を開始します。このプロセスを支援するためにできることは次のとおりです。
- 実際のリソースの代わりにモックフレームワークを使用します。Rspecには組み込みのモックフレームワークがあります。
- 単体テストスイートでrcovを実行します。これを使用して、単体テストスイートの徹底度を測定します。
統合テストを置き換える適切な単体テストができたら、統合テストを削除します。重複したテストは、メンテナンスを悪化させるだけです。
3.備品を使用しないでください
備品は悪です。代わりにファクトリー(マニシストまたはfactorybot)を使用してください。これらのシステムでは、より適応性の高いデータのグラフを作成できます。さらに重要なのは、外部データソースからデータを読み込むのではなく、使用できるメモリ内オブジェクトを作成できることです。
4.統合テストになる単体テストを停止するためのチェックを追加する
これでより高速なテストを実施できたので、これを阻止するためのチェックを再度行う時間です。
データベース(UnitRecord)にアクセスしようとしたときにエラーをスローするアクティブパッチをサルパッチするライブラリがあります。
また、ペアリングとTDDを試すこともできます。これにより、チームはより高速なテストを強制的に作成できます。
- 誰かがチェックしている-だれも怠惰にならない
- 適切なTDDには迅速なフィードバックが必要です。テストが遅いと、全体が苦痛になります。
5.他のライブラリを使用して問題を解決する
誰かがspork(rails3の下のテストスイートのロード時間を短縮する)、hydra / parallel_tests-ユニットテストを並列に(複数のコア間で)実行することについて言及しました。
これはおそらく最後に使用する必要があります。あなたの本当の問題は、ステップ1、2、3にあります。それを解決すれば、追加のインフラストラクチャをロールアウトするためのより良い立場になります。