【问题标题】:How to identify bottlenecks and optimise a slow test suite?如何识别瓶颈并优化慢速测试套件?
【发布时间】:2019-09-02 03:59:31
【问题描述】:

什么是系统地确定减速发生的最佳策略,以及将优化工作重点放在哪里?

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

背景:

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

我已经单独运行了组件,看起来控制器、模型等都相当快,但可能 95% 的时间都花在了系统规范上。

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

但这些都是有根据的猜测和观察,基于手动运行一些不同的规范。并没有真正让我更接近于找出延误发生的地方。

确定我应该将优化工作重点放在哪里的最佳方法是什么 - 在非常基本的层面上,甚至确定我是否需要优化测试套件或应用程序本身?系统识别和监控哪些例程和方法运行缓慢的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

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

    您应该做的第一件事是使用rspec --profile 描述您的规格

    之后,查看最上面的一组并尝试识别系统规范中的模式。一些罪魁祸首可能包括:

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

    【讨论】:

    • 感谢@fylooi,这很有用。我可以检查一下:假设我运行了两个规范文件 system/first_spec.rbsystem/second_spec.rb - Rspec 应该为每个文件中的第一个规范加载整个 Rails 应用程序,还是整个第一个规范?
    • 应用应该只加载一次,对吧?我的测试套件中的每个文件似乎都有初始化延迟。
    • 运行 rspec system/first_spec.rbrspec system/second_spec.rb 将加载 Rails 两次。 rspec system 只会加载 Rails 一次。您可以查看 Spring 以将 Rspec 进程保持在内存中,这将减少第二个规范的开销,但您可能需要定期手动重新启动它。
    【解决方案2】:

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

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

    也许它会向您展示缓慢的初始化程序?如果测试使用的是固定装置——也许加载它们会花费最多的时间,你会考虑切换到工厂吗?

    分离出慢的部分,改进它,重复直到你满意为止。

    这真的是一个开放式问题,所以很难更具体。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2017-02-02
      • 2022-01-06
      • 2019-02-12
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多