截断,事务和删除数据库策略之间的区别
使用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