2012-06-05 22 views
35

使用Rspec時,截斷,事務和刪除數據庫策略之間的區別是什麼?我找不到解釋這個的任何資源。我閱讀了數據庫清理器的自述文件,但沒有解釋它們各自的作用。截斷,事務和刪除數據庫策略之間的區別

爲什麼我們必須對水豚使用截斷策略?我在測試時是否必須清理數據庫,還是可以禁用它?我不明白爲什麼我應該在每個測試用例之後清理我的數據庫,難道它不會減慢測試嗎?

回答

54

數據庫清理策略是指數據庫術語。即這些術語來自(SQL)數據庫領域,因此熟悉數據庫術語的人們會知道它們的含義。

下面的示例引用了SQL定義。然而,DatabaseCleaner也支持其他非SQL類型的數據庫,但通常這些定義將是相同或相似的。

刪除

這意味着數據庫表可以使用SQL語句DELETE FROM清洗。這通常是slower than truncation,但是may have other advantages instead

截斷

這意味着數據庫表可以使用TRUNCATE TABLE聲明清洗。這將立即清空表格,而不會刪除表格結構本身或單獨刪除記錄。

事務

這意味着使用加上ROLLBACK回滾以前的數據庫操作的序列BEGIN TRANSACTION語句。把它想象成數據庫的「撤銷按鈕」。我認爲這是最常用的清理方法,並且可能是最快的,因爲更改不需要直接提交給數據庫。

實例討論:Rspec, Cucumber: best speed database clean strategy

原因與水豚

截斷策略最好的解釋是在Capybara docs themselves發現:

# 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. 

清洗要求

在每個測試用例之後,您不一定必須清理數據庫。但是,您需要了解這可能產生的副作用。即如果您一步創建,修改或刪除一些記錄,其他步驟是否會受此影響?

通常RSpec的運行與事務燈具開啓,因此在運行時的RSpec你不會注意到這一點 - 它只會保持數據庫自動清潔你:

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

+1

謝謝您詳細的解釋。這真的解釋了很多。鏈接到rspec-rails文檔也非常有用。我非常感謝你的幫助:) –

+13

這不是真的。 [刪除策略](https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb)實際上應該比截斷更快,因爲它執行「DELETE FROM table」而不是'TRUNCATE TABLE table' - 因此它可以刪除所有記錄而不需要執行重置序列等操作。 –

相關問題