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

标签 ruby database testing rspec

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

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

最佳答案

数据库清理策略引用数据库术语。 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

关于ruby - 截断、事务和删除数据库策略之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904996/

相关文章:

python - 如何为 Django 中的每个应用程序使用单独的数据库

database - 访问 2013 年记录计数报告

ruby-on-rails - Ruby - 无法使用 "required"加载 gem,无法运行 Rails

ruby-on-rails - Rails.空白?在不应该的时候返回真

java - 在 Play 中捕获配置错误!框架 2.0.4

Grails 测试工厂类

api - 如何在 Laravel 中调用端点时模拟注入(inject) Controller 的对象?

在电子邮件客户端中测试时 HTML 内容发生变化

android - 如何在 calabash-android 中将应用程序带到前台?

ruby "yield row if block_given?"