2

在运行我们的规范套件时,我遇到了一个有趣的问题,这让我和我的团队非常头疼。

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

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发布了我的文件

提前致谢,

4

2 回答 2

1

猜测一下,我会说您的集成规范正在设置DatabaseCleaner:truncation,并且不会切换回:transaction其他规范。我有一个样本可以解决这里spec_helper的情况。还提供了几种方法,可帮助您深入了解并找出在任何给定时间正在使用的策略。这是为了您的方便:

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
于 2014-10-06T02:15:33.953 回答
0

剖析告诉你什么?

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

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

于 2013-05-21T21:37:28.127 回答