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

Ibr*_*mad 41 ruby database testing rspec

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

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

Cas*_*per 61

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

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

删除

这意味着使用SQL DELETE FROM语句清理数据库表.这通常比截断慢,但可能有其他优点.

截断

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

交易

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

示例讨论:Rspec,Cucumber:最佳速度数据库清理策略

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.
Run Code Online (Sandbox Code Playgroud)

清洁要求

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

通常RSpec在事务处理装置打开的情况下运行,所以在运行RSpec时你永远不会注意到这一点 - 它只会让数据库自动清理干净:

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

  • 这不是真的.[删除策略](https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb)实际上应该比截断更快,因为它执行`DELETE FROM table`而不是`TRUNCATE TABLE表' - 所以它删除所有记录而不做重置序列之类的事情. (13认同)