42

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

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

4

1 回答 1

63

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

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

删除

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

截断

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

交易

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

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

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.

清洁要求

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

通常 RSpec 运行时会打开事务装置,因此在运行 RSpec 时您永远不会注意到这一点 - 它只会自动为您保持数据库清洁:

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

于 2012-06-05T22:52:31.010 回答