RSpec套件性能差异

时间:2013-05-08 16:42:16

标签: ruby-on-rails ruby testing rspec

我遇到了一个有趣的问题,这个问题导致我和我的团队在运行我们的规范套件时遇到了很多麻烦。

我们的规范套件分为以下子文件夹,紧接着它们是完成的总执行时间:

rspec spec/acceptance    311.67s
rspec spec/controllers   18.97s
rspec spec/decorators    4.39s
rspec spec/helpers       9.45s
rspec spec/lib           16.88s
rspec spec/mailers       5.27s
rspec spec/models        121.05s
rspec spec/presenters    0.03s
rspec spec/workers       19.3s

Total run time: 8m 27s

当然可以改进,但总的来说是可以管理的。

但是,如果我运行rspec spec并立即运行整个套件,则完成的总时间为27m 11s

因此,显然我们正在做的事情是在立即运行时显着影响整个套件的性能。我希望我可以得到一些指示,我可以开始尝试解决这个问题。

如果有帮助,我已发布了spec_helper.rb文件here

提前致谢,

2 个答案:

答案 0 :(得分:1)

我猜你的集成规范会将DatabaseCleaner设置为:truncation,而其他规格并没有切换回:transaction。我有一个示例spec_helper来导航情况here。还提供了一些方法,可帮助您深入了解并确定在任何给定时间使用的策略。这是为了您的方便:

def cleaner_strategy
  active_record_cleaner.instance_variable_get(:@strategy).class
end

def active_record_cleaner
  DatabaseCleaner.instance_variable_get(:@cleaners)[[:active_record, {}]]
end

附注:我们对集成规范使用过滤器,因为它们太慢了。我们默认在本地环境中禁用它们,然后让CI运行它们。

config.filter_run_excluding :slow unless ENV['SLOW']

然后您可以使用以下命令单独运行它们:

$ SLOW=true rspec spec/features/some_awesome_feature_spec.rb

答案 1 :(得分:0)

分析告诉你什么?

运行rspec spec --profile或将--profile添加到您的~/.rspec文件。

完成测试后,它将报告10个最慢的测试。