【发布时间】:2012-06-09 22:11:27
【问题描述】:
使用Rspec时截断、事务和删除数据库策略有什么区别?我找不到任何解释这一点的资源。我阅读了 Database Cleaner 自述文件,但它没有解释它们各自的作用。
为什么我们必须对 Capybara 使用截断策略?测试时我必须清理我的数据库还是可以禁用它。我不明白为什么我应该在每个测试用例之后清理我的数据库,这不会减慢测试速度吗?
【问题讨论】:
标签: ruby database testing rspec
使用Rspec时截断、事务和删除数据库策略有什么区别?我找不到任何解释这一点的资源。我阅读了 Database Cleaner 自述文件,但它没有解释它们各自的作用。
为什么我们必须对 Capybara 使用截断策略?测试时我必须清理我的数据库还是可以禁用它。我不明白为什么我应该在每个测试用例之后清理我的数据库,这不会减慢测试速度吗?
【问题讨论】:
标签: ruby database testing rspec
数据库清理策略参考数据库术语。 IE。这些术语来自(SQL)数据库世界,因此通常熟悉数据库术语的人会知道它们的含义。
以下示例涉及 SQL 定义。 DatabaseCleaner 也支持其他非 SQL 类型的数据库,但通常定义相同或相似。
删除
这意味着使用 SQL DELETE FROM 语句清理数据库表。这通常是slower than truncation,但may have other advantages instead。
截断
这意味着使用TRUNCATE TABLE 语句清理数据库表。这只会立即清空表,而不会删除表结构本身或单独删除记录。
交易
这意味着使用BEGIN TRANSACTION 语句加上ROLLBACK 来回滚以前的数据库操作序列。将其视为数据库的“撤消按钮”。我认为这是最常用的清理方法,并且可能是最快的,因为更改不需要直接提交给数据库。
示例讨论: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.
清洁要求
您不必在每个测试用例之后清理数据库。但是,您需要注意这可能产生的副作用。 IE。如果您在一个步骤中创建、修改或删除某些记录,其他步骤是否会受此影响?
通常 RSpec 会在启用事务装置的情况下运行,因此在运行 RSpec 时您永远不会注意到这一点 - 它只会自动为您保持数据库清洁:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions
【讨论】:
DELETE FROM table 而不是 TRUNCATE TABLE table - 所以它会删除所有记录而不执行重置序列之类的操作。