为什么在Rails下RSpec很慢?

每当我为Rails应用程序运行rspectesting时,在真正开始运行testing之前需要花费一天的时间。 为什么rspec这么慢? 有没有一种方法来加快Rails的初始负载或单独的我的Rails应用程序的一部分,我需要(例如ActiveRecord的东西),所以它不会加载绝对一切运行一些testing?

您应该能够通过在单独的terminal窗口中运行script/spec_server来加速script/spec调用,然后将其他-X参数添加到您的规范调用中。

我绝对build议检查spork。

http://spork.rubyforge.org/

railstutorial专门解决这个问题,并提供了一个解决scheme,让spork在rails 3.0中很好地运行(截至目前,spork并不是rails 3的开箱即用)。 当然,如果你不在轨道3.0,那么你应该很好去。

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

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

检查什么时候spork 3.0准备好了

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

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

有没有办法加快Rails的初始负载,你可以尝试使用模拟而不是依靠数据库,这实际上是正确的unit testing,并会明确加快你的unit testing。 另外使用@ Scott Matthewman提到的spec server可以提供帮助,与@ Marc-Andre Lafortune提到的来自zentest的自动testing一样

有没有一种方法来select我需要的Rails应用程序的一部分(例如,只有ActiveRecord的东西),所以它不会加载绝对的一切来运行一些testing? 那这个呢

 rake test:recent 

我不知道如何rspec任务与此集成,但你可以肯定地使用testing:最近的任务作为模板做rspectesting相同,如果。

 rake test:rspec:recent 

尚不存在

因为它加载了所有的环境,加载装置和所有的爵士乐。

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

此任务将删除整个testing数据库并从头开始重新创build它。 这对我来说似乎很荒谬,但这就是它的作用(同样的事情发生在你运行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 

我认为你正在寻找的“禅”的经验是在后台运行spec_serverautospec ,当你保存一个文件的结果是近乎即时的testing。

但是,我有问题让这两个程序进行沟通。

我在这里find了一个解释:

我注意到自动testing不会发送命令到spec_server。 相反,它会在每次执行时重新加载整个Rails环境和应用程序的插件。 这使得自动testing比脚本服务器运行速度慢得多,因为当你运行script / spec命令时,specs被发送到spec_server,已经有了你的Rails环境,并准备好了。 如果你碰巧安装了一个新的插件或类似的东西,那么你将不得不重新启动spec_server。

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

你在Rails上运行这个吗? 如果是这样,这不是RSpec的初始化很慢,这是Rails的。 在运行规格之前,Rails必须初始化整个代码库和你的代码库。 那么,它不必,但它确实。 RSpec在我的小型非rails项目下运行的非常快。

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

如果您使用的是Mac,我build议使用Rspactor over autotest,因为与自动testing相比,它使用更less的资源来轮询更改的文件。 有一个完整的cocoa版本

RSpactor.app

或者我在Github上维护的gem版本

 sudo gem install pelle-rspactor 

虽然这些技能不会加速个人rspectesting,但是他们在一秒钟内自动运行受影响的技术规格时会感觉更快。

从rspec-rails-1.2.7开始,spec_server被弃用,转而使用spork gem。

主要原因是需要永远在窗户上,出于某种原因。

加速技巧:我相信spork现在可以与windows一起工作。

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

http://github.com/rdp/faster_require

GL。 -rp

如果你在Windows环境下,那么你可能做的事情很less,因为Rails似乎在Windows下非常慢的启动。 我在Windows上有相同的经验,并不得不将我的设置移动到一个Linux虚拟机,使其真正zippy(我也使用自动testing)。