2009-04-20 6 views
2

私は現在、かなりのRailsテストスイートを探しています。それは私が細部に入ることはできませんが、スイート全体(ユニット/機能/いくつかの統合)の実行時間は5分を超えることができます。Railsテストスイートでファクトを使用することのプラスとマイナス?

私たちは完全に頼りにしており、黙ってスタブする必要はありません。

次のいくつかのスプリントは、カバレッジの改善、より良いテストの作成、最も重要なテストの効率的な作成を目的として、テストスイートに完全に焦点を合わせます。

私たちのテストでは、より多くの嘲笑とスタブを除いて、私たちはほとんどのファクトリーガールと私たちの備品を交換することを検討しています。私は、似たような状況をしている多くの幸せな人たちがいるのを見ていますが、工場に引っ越していくどんなマイナス要因でも良いリソースを見つけることができませんでした。私は、さまざまなリソースからベンチマークを使用するときに、より低速のベンチマークを見ましたが、なぜこの工場が優れているのかを知ることはできません。なぜなら、これらを使用したくない理由です。

なぜ、私は工場を使用すべきではないのか、誰に教えてもらえますか?

ありがとうございます!

答えて

6

良いテストスイートのためにエンティティ間のすべての依存関係を設定することにはいくつかの問題があります。とにかく、それはまだ多くの設備を維持するよりも簡単です。

備品:

  • (特に多対多)関係を維持するのは難しいです。
  • 通常、テストスイートの実行時間は、DBヒットが多くなるため遅くなります。
  • テストはスキーマの変更に対して非常に敏感です。

工場:

  • あなたは、現在のユニットテストでテストしていないすべてのものをスタブ。
  • 工場でテストしているエンティティを準備します。これは、工場が本当の利点を発揮するところです。新しいテストケースを設定するのは簡単です.YAMLファイルを大量に保存する必要はありません。
  • あなたはテストに専念しています。テストでシナリオを変更する必要がある場合は、考え方を変えないでください。スタブが合理的で、工場を簡単にカスタマイズできるのであれば、大丈夫です。

したがって、工場は良い方法のようです。表示される唯一の欠点は次のとおりです。

  • フィクスチャからの移行に費やした時間。
  • シノードのシナリオを維持するには、多少の労力が必要です。
10

オレグの答えは素晴らしいですが、私は両方を使用している人の視点を提供させてください。

フィクスチャはしばらくの間、Railsコミュニティの鞭打った少年でした。誰もが備品の欠点を理解していますが、誰も彼らの強みに本当に挑戦しているわけではありません。私の経験では、工場自体が簡単にフィクスチャと同じように維持するのが難しくなります(実際はスキーマに依存しますが、私は逃げ出します)。工場の本当の強みは、治具ベースの痛みの選択的な交換です。カップルの特質について話しましょう。

最初の問題はパフォーマンスです。ほとんどのアプリケーションで、データベースにぶつかることなく大部分のテストをすることができますが、大部分のアプリケーションでは、データベース全体にぶつかることなくテストすることは賢明ではないと思います。ある時点で、スタック全体をテストする必要があります。あなたが模倣したり、スタブするたびに、微妙なバグを含んでいる可能性のあるインターフェースについて推測しています。したがって、かなりの割合のテストでデータベースにヒットする必要があると仮定すると、トランザクションフィクスチャ(です)は、すべてのテストで環境全体をインスタンス化するよりはるかに高速です。

私は、テストスイートのサイズは、実際にはContinuous Integrationを探して次のレベルに発展させる必要があると言います。どんなに高速化しても、開発者が待つのはまだまだ長い時間です。多分autotestを見て、個々のレベルで助けてください。しかし、最終的にCIは、開発者の敏捷性を犠牲にすることなくテスト規律を維持することを可能にします。

フィクスチャが本当に輝く場所は機能/統合テストです。私が見ているところでは、フィクスチャはテストされるべきアプリケーションの健全な基本状態を設定する必要があるということです。ほとんどの単体テストではこれが本当に必要ではありません。あなたは工場を使って非常に良い単位カバレッジを得ることができます。しかし、機能テストでは、任意のページが数十のモデルに当たる可能性があります。私は各テストですべてのことを設定したくありません。より複雑なシナリオを構築するにあたり、グローバルデータ状態を再現することに近づいています。正確には最初に実行するように設計されたものです。

他のすべてが平等であると私は考えていますが、私は20ユニットテスト(Railsの使い方を使用)の1つの機能テストを好むと思います。どうして?機能テストは、ユーザーに送信される最終結果が正しいことを証明するためです。単体テストは機能のニュアンスを得るのに最適ですが、一日の終わりには、サイト全体を破壊するインターフェースにバグが残る可能性があります。機能テストは、私のブラウザで実際にページを読み込まずにデプロイするという確信を私に与えるものです。私はすべてをスタブして両方のインターフェースをテストして同じカバレッジを得ることができると知っていますが、小さなCPUを犠牲にして1つの単純なテストでスタック全体をテストできるなら、

それでは、フィクスチャのベストプラクティスは何ですか?多くのモデルとコントローラを横断する主要な新機能を追加する場合、データ

  • の最も広いカテゴリーをカバーするために、すべてのモデルの一握りを設定

    • 、主要な状態に
    • 回避を表現するためにいくつかの新しい器具を追加唯一のいくつかのテストのために必要とされるテストページ付けまたは他の質量を作成するためのより小さな/より局所的な変動を除去/フィールドを
    • 使用工場
    • 使用工場を添加した以外は、古い器具を編集

    また、私はJay Fields' blogを本当に良い実用的なテストアドバイスにお勧めします。私がジェイのブログについて最も気に入っていることは、テストはプロジェクト特有のものであることを常に認めており、あるプロジェクトではうまくいくものが別のプロジェクトでは必ずしも機能しないということです。彼はドグマについては短く、プラグマティズムでは長い。

  • 関連する問題