使用Rspec時,截斷,事務和刪除數據庫策略之間的區別是什麼?我找不到解釋這個的任何資源。我閱讀了數據庫清理器的自述文件,但沒有解釋它們各自的作用。截斷,事務和刪除數據庫策略之間的區別
爲什麼我們必須對水豚使用截斷策略?我在測試時是否必須清理數據庫,還是可以禁用它?我不明白爲什麼我應該在每個測試用例之後清理我的數據庫,難道它不會減慢測試嗎?
使用Rspec時,截斷,事務和刪除數據庫策略之間的區別是什麼?我找不到解釋這個的任何資源。我閱讀了數據庫清理器的自述文件,但沒有解釋它們各自的作用。截斷,事務和刪除數據庫策略之間的區別
爲什麼我們必須對水豚使用截斷策略?我在測試時是否必須清理數據庫,還是可以禁用它?我不明白爲什麼我應該在每個測試用例之後清理我的數據庫,難道它不會減慢測試嗎?
數據庫清理策略是指數據庫術語。即這些術語來自(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
謝謝您詳細的解釋。這真的解釋了很多。鏈接到rspec-rails文檔也非常有用。我非常感謝你的幫助:) –
這不是真的。 [刪除策略](https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb)實際上應該比截斷更快,因爲它執行「DELETE FROM table」而不是'TRUNCATE TABLE table' - 因此它可以刪除所有記錄而不需要執行重置序列等操作。 –