9

Ruby on Rails 3.2.2、FactoryGirl 3.1.0、FactoryGirlRails 3.1.0、Rspec 2.9.0、および RspecRails 2.9.0 を使用しています。アプリケーションをテストするために、データベースに大量のレコード (約 5000) を作成する必要がありますが、その操作は非常に低速です (レコードの作成に 10 分以上かかります)。私は次のように進めます:

before(:each) do
  5000.times do
    FactoryGirl.create(:article,)
  end
end

仕様コードを改善して高速化するにはどうすればよいですか?

: 各記事の作成プロセスの前後に実行される (5) 記事のコールバックによって速度が遅くなる可能性がありますが、レコードの作成が遅い場合は、それらをスキップできます (テストする必要があるのは記事だけであり、関連付けられたモデルではないため)。 ...それを行うことは可能ですか、それは正しい方法ですか?

4

3 に答える 3

2

そのような大量のレコードの処理を開始するときは、必要のない ActiveRecord のオーバーヘッドを避けるために、SQL で直接処理することをお勧めします。
SQLの実装に応じて、スクリプトを作成するか、ストアドプロシージャを作成してこれを行うことを検討します。数秒で終わる可能性が高いです。

于 2012-05-16T04:49:35.090 に答える
0

私はテストの専門家ではありませんが、FactoryGirl はこのような使い方をするべきではないと思います。いくつかのレコードを作成する必要があります。

テストのために非常に多くのレコードが本当に必要かどうかを考えてみてください。必要な場合、各テストの前にそれらを「リセット」する必要がありますか? (はい、各テストの前にそれらを作成しているので、実際には 5000*number_of_tests レコードを作成しています)。生の SQL スクリプトを選択することはできませんか? したがって、テスト データベースが作成されると、それらのレコードもすべて作成されます。

于 2012-05-16T04:48:34.717 に答える
0

他の人が述べたように、工場は大量生産を想定していません。妥当な単体テストで 5,000 レコードが必要になるのはなぜですか?

とはいえ、速度が低下する理由の 1 つは、#createが各レコードを構築後にデータベースに保存することです。代わりにFactoryGirl.buildを使用することをお勧めします。ファクトリの使用を参照してください。

もちろん、I/O バウンド プロセスをメモリバウンド プロセスと交換することになります。それが本当に必要でない場合は、#buildを使用して個々のテストを実行するのに十分な数のレコードをインスタンス化するか、一括読み込み用に最適化されたフィクスチャ ファイルを使用することを検討してください。

于 2012-05-16T04:59:05.833 に答える