【发布时间】:2011-05-22 10:27:32
【问题描述】:
我正在运行 mysql、database_cleaner、Rspec 等。到目前为止,我有大约 518 个测试,它们需要 88 秒才能运行。这对我来说是不可接受的,因为我的应用开发才刚刚开始。
所以在继续之前,我想尝试找到减少运行这些测试所需时间的方法 - 希望不必实际更改测试。
在大多数情况下,我会尝试使用存根。但是,当我测试模型和查询时,我会使用数据库。
我认为 database_cleaner 正在减慢它们的速度,但没有它我不知道如何测试查询和其他东西。
使用带有 ":memory:" 选项的 sqlite3 似乎只减少了大约 10 秒(有点令人失望的结果......)
我能做些什么来真正加快我的测试速度?
【问题讨论】:
-
这 518 个单元/功能/集成测试之间的区别是什么?
-
除了查询测试之外,它们都是单元。我会说他们中的大多数是单位。 20-25% 是集成(查询......当你想到它时,这是一种单位)。没有进行高级别的测试。我测试的最高级别是控制器,它使用存根
-
对于那些关注这个的人来说,问题是 factory_girl。它超级慢。 9 个人觉得这个问题很有趣,我敢打赌,你们 9 个人都像我一样使用 factory_girl。它会导致每次测试浪费 0.25 到 0.35 秒的时间!这是不可接受的,我正在寻求纠正它......或者在继续之前将其换成其他东西。
-
好吧,我已将所有
Factory.build/Factory.create调用更改为简单的 RubyMyClass.new调用。现在 250 个控制器测试在大约 5 秒内运行,而不是天知道要多长时间。它很快。而且我必须告诉你,老实说,不使用工厂并不是那么痛苦。只需设置您需要的值,如果它很烦人,请将其存根。问题解决了。我不知道为什么我们使用工厂女孩。从字面上看,它比简单地自己制作实例效率低了许多数量级。我不知道 Factory.build 内部到底发生了什么……但它臃肿且效率低下。 -
是的,在不合适的情况下删除 Factory girl 或调用 . build() 并尽可能使用 :default_strategy => :build 。总体速度提高了 75%,在某些情况下,速度提高了 2000%。
标签: ruby-on-rails ruby performance testing