使用Rspec时,截断、事务和删除数据库策略有何不同?我找不到任何资源来解释这一点。我读了Database Cleaner的自述文件,但它没有解释每一个都是做什么的。
为什么我们必须对Capybara使用截断策略?我必须在测试时清理我的数据库,或者我可以禁用它。我不明白为什么我要在每个测试用例之后清理我的数据库,这不是只会减慢测试速度吗?
发布于 2012-06-06 06:52:31
数据库清理策略指的是数据库术语。也就是说,这些术语来自(SQL)数据库世界,所以熟悉数据库术语的人通常会知道它们的意思。
下面的示例涉及SQL定义。然而,DatabaseCleaner也支持其他非SQL类型的数据库,但通常定义是相同或相似的。
删除
这意味着使用SQL DELETE FROM语句清理数据库表。这通常是slower than truncation,但may have other advantages instead。
截断
这意味着使用TRUNCATE TABLE语句清理数据库表。这只会立即清空表,而不会删除表结构本身或单独删除记录。
事务
这意味着结合使用BEGIN TRANSACTION语句和ROLLBACK回滚以前的一系列数据库操作。可以把它想象成数据库的“撤销按钮”。我认为这是最常用的清理方法,也可能是最快的,因为更改不需要直接提交到DB。
示例讨论: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.清理要求
您不必在每个测试用例之后清理数据库。然而,您需要意识到这可能会产生副作用。例如,如果您在一个步骤中创建、修改或删除一些记录,其他步骤会受此影响吗?
通常情况下,RSpec运行时会打开事务性fixtures,所以在运行RSpec时,您永远不会注意到这一点-它只会自动为您保持数据库的干净:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions
https://stackoverflow.com/questions/10904996
复制相似问题