我们如何在Buildkite上将Rails测试套件的运行时间缩短至1分钟

我们如何在Buildkite上将Rails测试套件的运行时间缩短至1分钟

💡 原文英文,约600词,阅读约需3分钟。
📝

内容提要

在PlanetScale,我们优化了Ruby on Rails后端API测试套件,运行时间缩短至1分钟。通过并行测试和审计FactoryBot,解决了创建过多测试数据的问题,显著提升了测试速度。

🔎

延伸解读

并行测试:最易见效的提速手段

文章指出,在CI上利用Rails的并行测试能力是提升测试速度最有效且最简单的步骤。PlanetScale最初从2个worker开始,但受限于机器核心数,后来在Buildkite上使用64核机器,将测试时间从12分钟压缩到3-4分钟。这提示我们,如果测试套件尚未并行化,优先配置多核CI环境可能带来立竿见影的效果。

FactoryBot的隐藏成本:数据创建过多

审计发现,大部分测试时间花在测试数据准备上。FactoryBot虽然简化了关联数据的创建,但容易无意中生成远超预期的对象,例如实际创建了8倍于预期的数据。通过调试器检查测试setup后的对象数量,可以定位这类问题。修复工厂后,测试时间进一步降至约1分钟,说明优化数据创建是深度提速的关键。

用测试守护工厂,防止性能回归

解决工厂问题后,PlanetScale在模型中添加了断言工厂创建对象数量的测试,例如确保创建数据库时只生成1个Database记录。这些测试最初失败,但推动他们修正工厂,并持续防止回归。这种做法将性能约束转化为可执行的测试,确保未来修改工厂时不会重新引入数据膨胀问题。

❓

Q&A

如何在Buildkite上优化Rails测试套件的运行时间?

通过并行测试和审计FactoryBot,优化测试数据的创建,最终将测试运行时间缩短至1分钟。

在本地开发中,如何提高Rails测试的效率?

在本地开发中,只运行修改过的单个文件的测试,而不是全部测试,以节省时间。

FactoryBot在测试中如何影响运行时间?

FactoryBot的设置可能导致创建过多的测试数据,从而增加测试时间,审计后可显著减少对象创建。

并行测试如何提高Rails测试的速度?

通过在CI上并行运行测试,测试套件的运行时间从12分钟缩短至3-4分钟。

如何审计FactoryBot以优化测试性能?

通过调试测试,检查创建的对象数量,确保工厂只创建必要的对象,从而优化性能。

在优化Rails测试套件时遇到的主要问题是什么?

主要问题是测试数据的创建时间过长,导致测试运行缓慢。

🏷️

标签

➡️

继续阅读