データベースのクリーニング戦略は、データベースの用語を参照しています。つまり、これらの用語は(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