【问题标题】:Difference between truncation, transaction and deletion database strategies截断、事务和删除数据库策略的区别
【发布时间】:2012-06-09 22:11:27
【问题描述】:

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

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

【问题讨论】:

    标签: ruby database testing rspec


    【解决方案1】:

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

    【讨论】:

    • 感谢您的详细解释。这真的解释了很多。 rspec-rails 文档的链接也非常有用。非常感谢您的帮助:)
    • 这并不完全正确。 deletion strategy 实际上应该比截断更快,因为它执行 DELETE FROM table 而不是 TRUNCATE TABLE table - 所以它会删除所有记录而不执行重置序列之类的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2011-02-15
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多