截断,事务和删除数据库策略之间的区别

时间:2012-06-05 21:07:48

标签: ruby database testing rspec

使用Rspec时,截断,事务和删除数据库策略有什么区别?我找不到任何解释这个的资源。我阅读了数据库清理程序自述文件,但它没有解释这些内容的作用。

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

1 个答案:

答案 0 :(得分:60)

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

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

<强>删除

这意味着使用SQL DELETE FROM语句清理数据库表。通常为slower than truncation,但may have other advantages instead

截断

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

<强>交易

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

示例讨论:Rspec, Cucumber: best speed database clean strategy

使用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.

清洁要求

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

通常情况下,RSpec会在启用事务处理程序的情况下运行,因此在运行RSpec时您将永远不会注意到这一点 - 它只会让数据库自动为您清理:

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