关于ruby:为什么RSpec在Rails下这么慢?

关于ruby:为什么RSpec在Rails下这么慢?

Why is RSpec so slow under Rails?

每当我为Rails应用程序运行rspec测试时,它实际上就需要花费一整天的时间才能真正开始运行测试。 为什么rspec这么慢? 有没有一种方法可以加快Rails的初始加载速度,或者只选择我需要的Rails应用程序的一部分(例如,仅ActiveRecord内容),这样就不会完全加载运行某些测试的所有内容?


我绝对建议您检查spork。

http://spork.rubyforge.org/

railstutorial专门解决了这个问题,并给出了一种解决方法,以使spork在rails 3.0中正常运行(目前,spork还不是现成可用的rails 3)。 当然,如果您未使用Rails 3.0,那您应该很好了。

本教程的部分显示了如何使Spork在Rails 3.0中运行

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

检查Spork是否已准备好Rails 3.0

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


通过在单独的终端窗口中运行script/spec_server,然后将更多的-X参数添加到您的spec调用中,您应该能够加快script/spec调用的速度。


我认为您正在寻找的"禅宗"体验是在后台运行spec_serverautospec,结果在保存文件时几乎是即时测试。

但是,我在使这两个程序进行通信时遇到问题。

我在这里找到了解释:

I've noticed that autotest doesn't send commands to the spec_server.
Instead it reloads the entire Rails environment and your application's
plugins everytime it executes. This causes autotest to run
significantly slower than script server, because when you run the
script/spec command the specs are sent to the spec_server which
already has your Rails environment fired up and ready to go. If you
happen to install a new plugin or something like that, then you'll
have to restart the spec_server.

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


because it loads all the environement, loads fixtures and all that jazz.

真正的罪魁祸首是如果使用rake spec运行它,它将运行db:test:prepare任务。

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

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

像这样:

1
2
3
4
5
6
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


为什么rspec这么慢?因为它加载了所有环境,加载了设备和所有爵士乐。

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

有没有一种方法可以选出我需要的Rails应用程序的一部分(例如,仅ActiveRecord内容),以便它不会完全加载所有内容来运行一些测试?那这个呢

1
rake test:recent

我不确定rspec任务如何与之集成,但是您可以肯定地使用test:recent任务作为模板来对rspec测试执行相同的操作。

1
rake test:rspec:recent

还不存在


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


您在Rails上运行吗?如果是这样,不是RSpec的初始化很慢,而是Rails。在运行规范之前,Rails必须初始化整个代码库和您自己的代码库。好吧,它不是必须的,但确实如此。在我的小型无轨项目下,RSpec对我而言运行非常快。


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

提速提示:
我相信spork现在可用于Windows。

您可以尝试使用" faster_require"来缓存位置:

http://github.com/rdp/faster_require

GL。
-rp


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


如果您使用的是Mac,我建议您通过自动测试使用Rspactor,因为它比自动测试使用更少的资源来轮询更改的文件。既有完整的可可版本

RSpactor.app

或我在Github维护的gem版本

1
sudo gem install pelle-rspactor

尽管这些并不能加快单个rspec的测试速度,但它们的速度要快得多,因为它们会在您单击保存后的一秒钟内自动运行受影响的规范。


如果您在Windows环境中,那么可能几乎无能为力,因为Rails似乎在Windows下启动真的很慢。我在Windows上也有同样的经验,必须将安装程序移到Linux VM上才能使其变得活泼(我也在使用自动测试)。


推荐阅读