测试速度:ActiveRecord use_transactional_fixtures与DatabaseCleaner.strategy =:transaction

时间:2012-11-05 14:46:55

标签: ruby-on-rails ruby rspec benchmarking rspec-rails

从来源(database_cleaneractive_record)来看,它们看起来应该同样快。但有人声称使用database_cleaner的事务策略会降低控制器和模型规范(for example)的速度。我没有一个大型测试套件可用于基准测试。任何人有任何见解或比较两者?

1 个答案:

答案 0 :(得分:10)

我花了一点时间比较两个中型代码库,它们大量使用ActiveRecord灯具。当我将其切换为使用DatabaseCleaner而不是use_transactional_fixtures时,模型规格开始花费大约两倍的时间。

在进行了相同的比较之后,我意识到use_transactional_fixtures控制了两件事:

  1. 每个规范是否包含在事务中
  2. 在过程中,固定数据由ActiveRecord加载
    • use_transactional_fixtures为真时,夹具数据在第一次测试之前加载一次
    • 如果为false,则在每个规范之前加载夹具数据
  3. DatabaseCleaner的交易策略可以替代(1)。但缺点是你的套件会重复加载相同的灯具数据。

    因此,如果您不使用AR灯具(或仅使用一对),use_transactional_fixtures和DatabaseCleaner的交易策略将具有类似的性能。但如果您使用大量AR灯具,关闭use_transactional_fixtures会对性能产生重大影响。