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

Wei*_*Wei 9 ruby benchmarking rspec ruby-on-rails rspec-rails

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

Rhe*_*hin 11

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

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

  1. 每个规范是否包含在事务中
  2. 在过程中,夹具数据由ActiveRecord加载
    • 如果use_transactional_fixtures为true,则在第一次测试之前加载夹具数据一次
    • 如果为false,则在每个规范之前加载夹具数据

DatabaseCleaner的交易策略可以替代(1).但缺点是您的套件将重复加载相同的灯具数据.

因此,如果您不使用AR灯具(或仅使用一对),use_transactional_fixturesDatabaseCleaner的交易策略将具有类似的性能.但是如果你使用很多AR灯具,那么use_transactional_fixtures关闭会对性能产生很大的影响.