为什么RSpec在Rails下如此之慢?

时间:2008-09-15 20:46:06

标签: ruby-on-rails ruby rspec

每当我为我的Rails应用程序运行rspec测试时,在实际开始运行测试之前需要花费一天的时间和一天的开销。为什么rspec这么慢?有没有办法加速Rails的初始加载或单独输出我需要的Rails应用程序的部分(例如,只有ActiveRecord的东西)所以它不会加载绝对的所有内容来运行一些测试?

11 个答案:

答案 0 :(得分:32)

我绝对建议查看spork。

http://spork.rubyforge.org/

railstutorial专门解决了这个问题,并给出了一个解决方法,让spork在rails 3.0中运行得很好(截至目前,spork不是开箱即用的3)。当然,如果你没有使用rails 3.0,那么你应该很高兴。

本教程的一部分展示了如何在rails 3.0中运行spork

http://railstutorial.org/chapters/static-pages#sec:spork

检查spork是否已准备好rails 3.0

http://www.railsplugins.org/plugins/440-spork

答案 1 :(得分:22)

您应该可以通过在单独的终端窗口中运行script/spec来加快script/spec_server来电,然后在规范调用中添加额外的-X参数。

答案 2 :(得分:4)

为什么rspec这么慢?因为它会加载所有环境,加载灯具和所有爵士乐。

有没有办法加速Rails的初始加载你可以尝试使用模拟而不是依赖数据库,这对于单元测试来说实际上是正确的,并且肯定会加速你的单元测试。另外使用@ Scott Matthewman提到的规范服务器可以提供帮助,与@ Marc-Andre Lafortune提到的zentest自动测试相同

有没有办法找出我需要的Rails应用程序部分(例如只有ActiveRecord的东西),所以它不会加载所有的东西来运行一些测试?这个怎么样

rake test:recent 

我不确定rspec任务是如何与此集成的,但你绝对可以使用测试:最近的任务作为模板来做同样的rspec测试,如果是。

rake test:rspec:recent

尚不存在

答案 3 :(得分:4)

  

因为它会加载所有环境,加载灯具和所有爵士乐。

真正的罪魁祸首是如果你使用rake specit runs the db:test:prepare task来运行它。

此任务将删除整个测试数据库并从头开始重新创建。这对我来说似乎很荒谬,但这就是它的作用(当你运行rake:test:units等时会发生同样的事情。)

您可以使用rspec作为rspec gem的一部分安装的spec应用程序轻松解决此问题。

像这样:

cd railsapp
spec spec # run all specs without rebuilding the whole damn database
spec spec/models # run model specs only

cd spec
spec controllers/user* # run specs for controllers that start with user

答案 4 :(得分:4)

我认为您正在寻找的“禅”体验是在后台运行spec_serverautospec,结果是在保存文件时接近即时测试。

但是,我在让这两个程序进行通信方面遇到了问题。

我找到了解释here

  

我注意到autotest不会向spec_server发送命令。   相反,它会重新加载整个Rails环境和您的应用程序   插件每次执行时。这会导致自动测试运行   比脚本服务器慢得多,因为当你运行时   script / spec命令将规范发送到spec_server中   已经启动了你的Rails环境并准备好了。如果你   恰巧安装一个新的插件或类似的东西,然后你会   必须重新启动spec_server。

但是,我们如何解决这个问题呢?我猜它会涉及下载ZenTest并更改autotest程序的代码,但现在没有时间试用它。

答案 5 :(得分:3)

你在Rails上运行吗?如果是这样,那就不是RSpec的初始化那么慢,而是Rails'。在运行规范之前,Rails必须初始化整个代码库和你的。好吧,它不会拥有,但确实如此。在我的小型非铁轨项目中,RSpec对我来说运行速度非常快。

答案 6 :(得分:3)

运行测试可能非常慢,因为整个rails环境必须加载(尝试脚本/控制台),然后才能运行所有测试。您应该使用autotest来保持环境的加载,并检查您编辑的文件。编辑和保存文件时,只有依赖于这些文件的测试才会自动且快速地运行。

答案 7 :(得分:2)

如果您使用的是Mac,我建议使用Rspactor而不是自动测试,因为它使用的资源比自动测试更少的轮询更改文件。有一个完整的Cocoa版本

RSpactor.app

或我在Github

维护的gem版本
sudo gem install pelle-rspactor

虽然这些并没有加快单个rspec测试的速度,但是他们感觉要快得多,因为他们会在一秒钟内自动运行受影响的规范。

答案 8 :(得分:2)

从rspec-rails-1.2.7开始,不推荐使用spec_server来支持spork gem。

答案 9 :(得分:2)

主要原因是,由于某种原因,require需要永远在Windows上。

加速提示: 我相信spork现在适用于windows。

您可以尝试缓存位置的“faster_require”:

http://github.com/rdp/faster_require

GL。 -rp

答案 10 :(得分:1)

如果您使用的是Windows环境,那么您可以做的事情很少,因为Rails似乎在Windows下启动速度非常慢。我在Windows上有相同的经验,不得不将我的设置移到Linux VM上,使它真的很活跃(我也在使用自动测试)。