42

Rspecを使用する場合の切り捨て、トランザクション、および削除データベース戦略の違いは何ですか?これを説明するリソースが見つかりません。Database Cleanerのreadmeを読みましたが、それぞれが何をするのか説明していません。

カピバラに切り捨て戦略を使用する必要があるのはなぜですか?テスト時にデータベースをクリーンアップする必要がありますか、それとも無効にすることができますか?各テストケースの後にデータベースをクリーンアップする必要がある理由がわかりません。テストが遅くなるだけではないでしょうか。

4

1 に答える 1

63

データベースのクリーニング戦略は、データベースの用語を参照しています。つまり、これらの用語は(SQL)データベースの世界に由来するため、データベースの用語に一般的に精通している人は、それらが何を意味するのかを理解できます。

以下の例はSQL定義を参照しています。DatabaseCleanerただし、他の非SQLタイプのデータベースもサポートしますが、通常、定義は同じまたは類似しています。

消す

これは、SQLDELETE FROMステートメントを使用してデータベーステーブルがクリーンアップされることを意味します。これは通常、切り捨てよりも低速ですが、代わりに他の利点がある場合があります。

切り捨て

これは、TRUNCATE TABLEステートメントを使用してデータベーステーブルがクリーンアップされることを意味します。これにより、テーブル構造自体を削除したり、レコードを個別に削除したりすることなく、テーブルをすぐに空にすることができます。

取引

これは、BEGIN TRANSACTIONステートメントを組み合わせて使用​​しROLLBACKて、以前のデータベース操作のシーケンスをロールバックすることを意味します。データベースの「元に戻すボタン」と考えてください。これは最も頻繁に使用されるクリーニング方法であり、変更をDBに直接コミットする必要がないため、おそらく最速だと思います。

ディスカッションの例:Rspec、Cucumber:最高速度のデータベースクリーン戦略

カピバラによる切り捨て戦略の理由

最良の説明は、カピバラのドキュメント自体にあります。

# Transactional fixtures do not work with Selenium tests, because Capybara
# uses a separate server thread, which the transactions would be hidden
# from. We hence use DatabaseCleaner to truncate our test database.

クリーニング要件

各テストケースの後で、必ずしもデータベースをクリーンアップする必要はありません。ただし、これが持つ可能性のある副作用に注意する必要があります。つまり、1つのステップで一部のレコードを作成、変更、または削除した場合、他のステップはこれによって影響を受けますか?

通常、RSpecはトランザクションフィクスチャをオンにして実行されるため、RSpecを実行しているときにこれに気付くことはありません。データベースを自動的にクリーンに保つだけです。

https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions

于 2012-06-05T22:52:31.010 に答える