2013-05-08 87 views
2

当我们运行我们的spec套件时,我遇到了一个有趣的问题,导致我和我的团队很头痛。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

感谢,

+0

你有没有对运行rspec的'一个spec'探查?随着时代的巨大差异,我认为重度消费者会跳出来。类似['perftools.rb'](https://github.com/tmm1/perftools.rb)支持方法调用图可能会有帮助。 – 2013-05-09 03:08:28

+0

分析能告诉你什么?运行'rspec spec --profile'或将'--profile'添加到'〜/ .rspec'文件中。它会向您显示10个最慢的测试。 – adarsh 2013-05-16 04:03:20

+0

好的,我将开始做。 – TheDelChop 2013-05-16 14:16:00

回答

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 

备注:我们使用过滤器来处理我们的集成规格,因为它们太慢了。我们在本地env中默认禁用它们,然后让CI运行它们。

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

然后你就可以有独立运行它们:

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

是什么分析告诉你吗?

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

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