我遇到了一个有趣的问题,这个问题导致我和我的团队在运行我们的规范套件时遇到了很多麻烦。
我们的规范套件分为以下子文件夹,紧接着它们是完成的总执行时间:
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
提前致谢,
乔
答案 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个最慢的测试。