截断、事务和删除数据库策略之间的区别
数据库清理策略是指数据库术语。也就是说,这些术语来自(SQL)数据库领域,所以熟悉数据库术语的人通常知道它们的含义。
下面的示例是指SQL定义。不过,DatabaseCleaner
也支持其他非SQL类型的数据库,但是定义通常是相同或类似的。
删除
这意味着使用SQL的DELETE FROM
语句清空数据库表。这通常比截断慢,但可能具有其他优势。
截断
这意味着使用TRUNCATE TABLE
语句清空数据库表。这将立即清空表,而不会删除表结构本身或逐个删除记录。
事务
这意味着使用BEGIN TRANSACTION
语句结合ROLLBACK
来回滚先前数据库操作的序列。可以将其视为数据库的“撤消按钮”。我认为这是最常用的清理方法,可能也是最快的,因为更改不需要直接提交到数据库。
截断策略与Capybara的原因
在Capybara文档中找到的最好的解释:
# 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文档的链接也非常有用。非常感谢您的帮助 🙂
这并不完全正确。实际上,删除策略应该比截断更快,因为它执行的是DELETE FROM table
而不是TRUNCATE TABLE table
,所以它会删除所有记录而不会重置序列等操作。