每当我为我的 Rails 应用程序运行 rspec 测试时,它需要永远和一天的开销才能真正开始运行测试。为什么 rspec 这么慢?有没有办法加快 Rails 的初始加载或挑出我需要的 Rails 应用程序的一部分(例如仅 ActiveRecord 的东西),所以它不会加载所有东西来运行一些测试?
11 回答
我绝对建议检查一下spork。
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
您应该能够通过在单独的终端窗口中运行来加快script/spec
调用速度,然后将附加参数添加到规范调用中。script/spec_server
-X
为什么 rspec 这么慢?因为它加载了所有的环境,加载了固定装置和所有的爵士乐。
有没有办法加快 Rails 的初始负载,您可以尝试使用模拟而不是依赖数据库,这对于单元测试实际上是正确的,并且肯定会加快您的单元测试。另外使用 @Scott Matthewman 提到的规范服务器可以提供帮助,与 @ Marc-Andre Lafortune提到的 zentest 的自动测试相同
有没有办法挑选出我需要的 Rails 应用程序的一部分(例如仅 ActiveRecord 的东西),这样它就不会完全加载所有东西来运行一些测试?那这个呢
rake test:recent
我不确定 rspec 任务如何与此集成,但您绝对可以使用 test:recent 任务作为模板来对 rspec 测试执行相同操作。
rake test:rspec:recent
还不存在
因为它加载了所有的环境,加载了固定装置和所有的爵士乐。
真正的罪魁祸首是,如果你运行它使用rake spec
,它运行db:test:prepare
任务。
此任务删除您的整个测试数据库并从头开始重新创建它。这对我来说似乎很荒谬,但这就是它的作用(当你跑步时也会发生同样的事情rake:test:units
等)。
spec
您可以使用rspec 作为 rspec gem 的一部分安装的应用程序轻松解决此问题。
像这样:
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
结果是在您保存文件时近乎即时的测试。
但是,我在让这两个程序进行通信时遇到了问题。
我在这里找到了解释:
我注意到自动测试不会向 spec_server 发送命令。相反,它每次执行时都会重新加载整个 Rails 环境和应用程序的插件。这会导致 autotest 的运行速度明显慢于脚本服务器,因为当您运行 script/spec 命令时,specs 会发送到已经启动 Rails 环境并准备就绪的 spec_server。如果您碰巧安装了新插件或类似的东西,那么您将不得不重新启动 spec_server。
但是,我们如何解决这个问题?我猜这将涉及下载 ZenTest 和更改程序的代码autotest
,但现在没有时间尝试。
你是在 Rails 上运行的吗?如果是这样,那么慢的不是 RSpec 的初始化,而是 Rails 的。Rails 必须在运行规范之前初始化整个代码库和您的代码库。嗯,它不必,但它确实。在我的小型非 Rails 项目下,RSpec 对我来说运行得非常快。
运行测试可能真的很慢,因为必须加载整个 Rails 环境(尝试脚本/控制台),然后才能运行所有测试。您应该使用自动测试来保持环境加载并检查您编辑的文件。当您编辑和保存文件时,只有依赖于这些文件的测试才会自动快速运行。
如果您使用的是 Mac,我建议使用 Rspactor 而不是自动测试,因为它使用比自动测试更少的资源来轮询更改的文件。既有完整的 Cocoa 版本
或者我在Github维护的 gem 版本
sudo gem install pelle-rspactor
虽然这些并不能加速单个 rspec 测试,但它们会在您点击保存后的一秒钟内自动运行受影响的规范,因此感觉要快得多。
从 rspec-rails-1.2.7 开始,不推荐使用 spec_server 以支持 spork gem。
主要原因是由于某种原因 require 在 Windows 上永远存在。
加速提示:我相信 spork 现在可以在 Windows 上运行。
您可以尝试缓存位置的“faster_require”:
http://github.com/rdp/faster_require
总帐。-rp
如果您在 Windows 环境中,那么您可能无能为力,因为 Rails 在 Windows 下似乎启动非常缓慢。我在 Windows 上也有同样的经历,我不得不将我的设置转移到 Linux 虚拟机上,以使它变得非常流畅(我也在使用自动测试)。