使用Rspec时,截断、事务和删除数据库策略之间有什么区别?我找不到任何资源来解释这一点.我阅读了数据库清洁器自述,但它没有解释每一个的作用.
为什么我们必须对水豚使用截断策略?测试时我需要清理数据库吗?或者我可以禁用它吗.我不明白为什么我应该在每个测试用例之后清理我的数据库,这会不会降低测试速度?
使用Rspec时,截断、事务和删除数据库策略之间有什么区别?我找不到任何资源来解释这一点.我阅读了数据库清洁器自述,但它没有解释每一个的作用.
为什么我们必须对水豚使用截断策略?测试时我需要清理数据库吗?或者我可以禁用它吗.我不明白为什么我应该在每个测试用例之后清理我的数据库,这会不会降低测试速度?
数据库清理策略指的是数据库术语.也就是说,这些术语来自(SQL)数据库世界,所以通常熟悉数据库术语的人都知道它们的意思.
下面的示例涉及SQL定义.然而,DatabaseCleaner
也支持其他非SQL类型的数据库,但通常定义是相同或相似的.
Deletion
这意味着使用SQL DELETE FROM
语句清理数据库表.这通常是slower than truncation,但是是may have other advantages instead.
Truncation
这意味着使用TRUNCATE TABLE
语句清理数据库表.这将直接清空表,而不删除表 struct 本身或单独删除记录.
Transaction
这意味着使用BEGIN TRANSACTION
条语句和ROLLBACK
条语句来回滚之前的数据库操作序列.可以将其视为数据库的"undo撤消按钮".我认为这是最常用的清理方法,而且可能是最快的,因为更改不需要直接提交给DB.
示例讨论:Rspec, Cucumber: best speed database clean strategy
Reason for truncation strategy with Capybara
最好的解释出现在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.
Cleaning requirements
您不必在每个测试用例之后清理数据库.然而,你需要意识到这可能带来的副作用.也就是说,如果在一个步骤中创建、修改或删除一些记录,其他步骤是否会受到影响?
通常情况下,RSpec运行时会打开事务装置,因此在运行RSpec时,您永远不会注意到这一点——它只会让数据库自动保持干净:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions