如何确定瓶颈并优化慢速测试套件?

时间:2019-09-02 03:59:31

标签: ruby-on-rails rspec rspec-rails

系统地确定减速发生在哪里以及优化工作集中在哪里的最佳策略是什么?

我知道,我知道。一个简单的Google搜索显示了许多有关优化测试的文章。其中大多数建议尽量减少与数据库和外部API的交互-都是很好的建议,但是这个问题非常不同。

背景:

我继承了带有非常慢的测试套件的Rails应用程序-运行时间超过45分钟!我已经进行了一些初步的挖掘,试图弄清楚为什么它运行缓慢。

我已经单独运行组件,并且看起来控制器,模型等都相当快,但是大约95%的时间都花在了系统规格上。

看起来,很多延迟发生在初始化中。任何给定文件中的第一个规范似乎都在15-30秒内运行,而同一文件中的所有后续规范在2秒内运行得更快。

但是这些都是基于手动运行一些不同规范的有根据的猜测和观察。并没有使我更接近解决延迟发生的地方。

确定我应该集中精力进行优化工作的最佳方法是什么-在非常基础的水平上甚至确定是否需要优化测试套件或应用程序本身?系统地识别和监视哪些例程和方法运行缓慢的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

由于RSpec需要加载整个Rails应用程序,因此第一个规范运行缓慢是正常的。

您应该做的第一件事就是使用rspec --profile

描述您的规格

然后,查看最顶层,并尝试确定系统规格中的模式。罪魁祸首可能包括:

  • 系统规范中的示例过多-您可以将更多的断言合并为更少的示例,以加快测试执行的速度,但代价是更多的不透明测试失败和调试工作。
  • 过度使用手动等待功能,例如sleep(1),以确保JS收合面板已完全打开。正确使用水豚have_匹配器可能会加快速度。为CSS框架关闭动画也可能会有所帮助。

答案 1 :(得分:1)

在用Spring包扎问题之前,我建议进行一些调查。

由于您的系统规格在运行第一个时总是很慢,因此请选择任何一个并使用事件探查器https://ruby-doc.org/stdlib-2.6/libdoc/profiler/rdoc/Profiler__.html

也许它将告诉您缓慢的初始化程序?如果测试使用的是夹具-也许加载它们花费的时间最多,那么您会考虑改用工厂吗?

隔离慢的部分,改善它,重复直到满意为止。

这确实是一个开放式的问题,因此很难具体说明。