为什么在Rails下RSpec这么慢?
每当我为Rails应用程序运行rspec测试时,它实际上就需要花费一整天的时间才能真正开始运行测试。为什么rspec这么慢?有没有一种方法可以加快Rails的初始加载速度,或者只选择我需要的Rails应用程序的一部分(例如,仅ActiveRecord内容),这样就不会完全加载运行某些测试的所有内容?
解决方案
回答
我们在Rails上运行吗?如果是这样,不是RSpec的初始化很慢,而是Rails。在运行规范之前,Rails必须初始化整个代码库和我们自己的代码库。好吧,它不是必须的,但确实如此。在我的小型无轨项目下,RSpec对我而言运行非常快。
回答
我们应该能够通过在单独的终端窗口中运行script / spec_server
,然后在spec调用中添加添加的-X参数来加快script / spec_server
的调用。
回答
运行测试可能真的很慢,因为必须加载整个Rails环境(尝试脚本/控制台),然后才能运行所有测试。我们应该使用自动测试来保持环境加载,并检查要编辑的文件。当我们编辑和保存文件时,只有依赖于这些测试的测试才会自动且快速地运行。
回答
如果我们使用的是Mac,我建议我们通过自动测试使用Rspactor,因为它比自动测试使用更少的资源来轮询更改的文件。既有完整的可可版本
RSpactor.app
或者我在Github维护的gem版本
sudo gem install pelle-rspactor
尽管这些并不能加快单个rspec的测试速度,但它们的速度要快得多,因为它们会在我们单击保存后的一秒钟内自动运行受影响的规范。
回答
如果我们在Windows环境中,那么可能几乎无能为力,因为Rails似乎在Windows下启动真的很慢。我在Windows上也有同样的经历,不得不将设置迁移到Linux VM上以使其变得活泼(我也使用了自动测试)。
回答
为什么rspec这么慢?因为它加载了所有环境,加载了设备和所有爵士乐。
有没有一种方法可以加快Rails的初始加载速度,我们可以尝试使用模拟而不是依赖数据库,这实际上对单元测试是正确的,并且可以最终加快单元测试的速度。另外,使用@Scott Matthewman提到的规范服务器可以提供帮助,与@ Marc-Andre Lafortune提到的zentest的自动测试相同
有没有一种方法可以选出我需要的Rails应用程序的一部分(例如,仅ActiveRecord内容),以便它不会完全加载运行某些测试的所有内容?那这个呢
rake test:recent
我不确定rspec任务如何与之集成,但是我们可以肯定使用test:recent任务作为模板来对rspec测试执行相同的操作。
rake test:rspec:recent
还不存在
回答
because it loads all the environement, loads fixtures and all that jazz.
真正的罪魁祸首是如果使用rake spec
运行它,它将运行db:test:prepare
任务。
此任务将删除整个测试数据库,并从头开始重新创建它。这对我来说似乎很荒谬,但这就是它的作用(当我们运行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_server"和" autospec",结果是在保存文件时进行了近乎即时的测试。
但是,我在使这两个程序进行通信时遇到问题。
我在这里找到了解释:
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
程序的代码,但现在没有时间尝试。
回答
从rspec-rails-1.2.7开始,不推荐使用spec_server来支持spork gem。
回答
主要原因是由于某种原因,require永远在Windows上使用。
提速提示:
我相信spork现在可用于Windows。
我们可以尝试使用" faster_require"来缓存位置:
http://github.com/rdp/faster_require
GL。
-rp
回答
我绝对建议我们检查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