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

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

为什么我们必须为水豚使用截断策略? testing时是否必须清理数据库,还是可以禁用它? 我不明白为什么我应该在每个testing用例之后清理我的数据库,难道不会减慢testing吗?

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

以下示例引用了SQL定义。 然而, DatabaseCleaner也支持其他非SQLtypes的数据库,但通常这些定义将是相同或相似的。

删除

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

截断

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

交易

这意味着使用BEGIN TRANSACTION语句加上ROLLBACK来回滚一系列以前的数据库操作。 把它想象成数据库的“撤销button”。 我认为这是最常用的清理方法,可能是最快的,因为变更不需要直接提交给DB。

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

水豚截断策略的原因

最好的解释是在水豚文件本身 :

 # 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. 

清洁要求

在每个testing用例之后,您不一定要清理数据库。 但是,你需要知道这可能有副作用。 也就是说,如果您一步创build,修改或删除一些logging,其他步骤是否会受此影响?

通常RSpec在事务性固件开启的情况下运行,因此在运行RSpec时,您将永远不会注意到这一点 – 它将简单地保持数据库自动清理:

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