Ruby 截断、事务和删除数据库策略之间的差异

Ruby 截断、事务和删除数据库策略之间的差异,ruby,database,testing,rspec,Ruby,Database,Testing,Rspec,使用Rspec时,截断、事务和删除数据库策略之间有什么区别?我找不到任何资源来解释这一点。我阅读了数据库清洁器自述文件,但它没有解释它们各自的作用 为什么我们必须对水豚使用截断策略?我是否必须在测试时清理我的数据库,或者我可以禁用它。我不明白为什么我应该在每个测试用例之后清理我的数据库,这会不会降低测试速度?数据库清理策略指的是数据库术语。也就是说,这些术语来自(SQL)数据库世界,因此熟悉数据库术语的人都知道它们的含义 下面的示例涉及SQL定义DatabaseCleaner但是也支持其他非SQ

使用Rspec时,截断、事务和删除数据库策略之间有什么区别?我找不到任何资源来解释这一点。我阅读了数据库清洁器自述文件,但它没有解释它们各自的作用


为什么我们必须对水豚使用截断策略?我是否必须在测试时清理我的数据库,或者我可以禁用它。我不明白为什么我应该在每个测试用例之后清理我的数据库,这会不会降低测试速度?

数据库清理策略指的是数据库术语。也就是说,这些术语来自(SQL)数据库世界,因此熟悉数据库术语的人都知道它们的含义

下面的示例涉及SQL定义
DatabaseCleaner
但是也支持其他非SQL类型的数据库,但通常定义相同或相似

删除

这意味着使用SQL
DELETE FROM
语句清理数据库表。这通常是,但是

截断

这意味着使用
TRUNCATE TABLE
语句清理数据库表。这将直接清空表,而不删除表结构本身或单独删除记录

交易

这意味着使用
begintransaction
语句和
ROLLBACK
回滚以前的数据库操作序列。可以将其视为数据库的“撤消按钮”。我认为这是最常用的清理方法,而且可能是最快的,因为更改不需要直接提交给DB

示例讨论:

水豚截断策略的原因

最好的解释是:

清洁要求

您不必在每个测试用例之后清理数据库。然而,你需要意识到这可能产生的副作用。即,如果您在一个步骤中创建、修改或删除某些记录,其他步骤是否会受此影响

通常情况下,RSpec在事务装置打开的情况下运行,因此在运行RSpec时,您永远不会注意到这一点-它将为您自动保持数据库干净:


谢谢您的详细解释。这真的解释了很多。到rspecrails文档的链接也非常有用。我非常感谢你的帮助:)这不完全是真的。实际上应该比截断更快,因为它执行
DELETE FROM table
,而不是
TRUNCATE table
——因此它删除所有记录而不执行重置序列之类的操作。
# 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.