为什么在Rails下RSpec这么慢?

时间:2020-03-05 18:54:29  来源:igfitidea点击:

每当我为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