Ruby on rails Spork每次初始化rails并缓慢运行

Ruby on rails Spork每次初始化rails并缓慢运行,ruby-on-rails,rspec,spork,guard,Ruby On Rails,Rspec,Spork,Guard,我需要帮助找出我的rspec测试运行缓慢的原因 我负责spork、guard和rspec。然而,spork似乎每次都在重新初始化rails。我很难弄清楚如何调试这个问题。我怀疑是我使用的一些宝石造成的,但没有证据 我认为它正在重新加载的原因是: 在spork内部或外部运行所需的时间相同 我在跑步时收到这个警告(与SOLR gem相关) rails服务器 运行所有规格 弃用警告:ActiveSupport::Concern中的InstanceMethods模块将不再自动包含。请直接在Sunspo

我需要帮助找出我的rspec测试运行缓慢的原因

我负责spork、guard和rspec。然而,spork似乎每次都在重新初始化rails。我很难弄清楚如何调试这个问题。我怀疑是我使用的一些宝石造成的,但没有证据

我认为它正在重新加载的原因是:

  • 在spork内部或外部运行所需的时间相同
  • 我在跑步时收到这个警告(与SOLR gem相关) rails服务器

    运行所有规格

    弃用警告:ActiveSupport::Concern中的InstanceMethods模块将不再自动包含。请直接在Sunspot::Rails::SolrInstrumentation中定义实例方法。(从at/home/dougt/replynline/config/environment.rb调用:5)


这是我的spec_helper.rb

require 'rubygems'
require 'spork'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'

Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.
# This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'

  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    # == Mock Framework
    #
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
    #
    # config.mock_with :mocha
    # config.mock_with :flexmock
    # config.mock_with :rr
    config.mock_with :rspec

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
    config.fixture_path = "#{::Rails.root}/spec/fixtures"

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true
    config.include Devise::TestHelpers, :type => :view

    #https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-(and-rspec)
    config.extend ControllerMacros, :type => :controller
    config.extend ControllerMacros, :type => :helper
    config.extend ControllerMacros, :type => :view

  end
end

Spork.each_run do
  # This code will be run each time you run your specs.
  #https://github.com/sporkrb/spork/issues/37
#   silence_warnings do
#      Dir["#{Rails.root}/app/models/**/*.rb"].each {|f| load f}
#  end
#  load "#{Rails.root}/config/routes.rb"
#  Dir["#{Rails.root}/app/**/*.rb"].each {|f| load f}

end

Gemfile

source 'http://rubygems.org'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
#  gem "less-rails", "~> 2.1.4"
  gem 'twitter-bootstrap-rails',"~> 2.0.3"

end

group :test do
  # Pretty printed test output
  gem 'spork-rails'
  gem 'rspec-rails', '2.8'
  gem 'guard-spork'
  gem 'rspec'
  gem 'growl'
  gem 'rb-fsevent'
  gem 'guard-spork'

end

group :development do
  gem 'guard'
  gem 'guard-rspec'
  gem 'turn', '~> 0.8.3', :require => false
  gem 'webrat', '0.7.3'
  gem 'therubyracer'
  gem 'progress_bar'
  gem 'sunspot_solr'
  gem 'minitest'
  gem 'rspec-rails', '2.8'
end


gem 'rails', '3.2.2'
gem 'jquery-rails'
gem 'pg'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

gem 'execjs'
gem 'devise'
gem "cancan"
gem "oauth"
gem "oauth2"
gem "oauth-plugin", ">= 0.4.0.rc2"
gem "autotest"
gem "autotest-rails-pure"
gem "autotest-notification"
gem 'uuidtools'
gem 'json'
gem 'twitter'
gem 'ZenTest', '4.6.0'
gem 'mobylette'
gem 'diff-lcs'
gem 'twitter-text'
gem 'chronic',:git => 'git://github.com/tarr11/chronic.git'
gem 'sunspot_rails'
gem 'delayed_job_active_record', "~> 0.3.2"
gem 'delayed_task'
gem 'codemirror-rails', "~> 2.22"
gem 'thin'
gem "paperclip", "~> 2.0"
gem 'aws-sdk'
gem 'aws-s3'
gem 'newrelic_rpm'
gem 'airbrake'
gem 'factory_girl_rails', "~> 1.2"
gem 'diff_match_patch'
gem 'draper'
gem "email_veracity", "~> 0.6.0"

警卫文件

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
  watch('config/application.rb')
  watch('config/environment.rb')
  watch(%r{^config/environments/.+\.rb$})
  watch(%r{^config/initializers/.+\.rb$})
  watch('Gemfile')
  watch('Gemfile.lock')
  watch('spec/spec_helper.rb') { :rspec }
  watch('test/test_helper.rb') { :test_unit }
  watch(%r{features/support/}) { :cucumber }
end

guard 'rspec', :version => 2 do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }

  # Rails example
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
  # Capybara request specs
  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
end

保护端输出

dougt@dougt-ThinkPad-W520 ~/project $ bundle exec guard
Guard uses NotifySend to send notifications.
Guard is now watching at '/home/dougt/project'
Starting Spork for RSpec
Using RSpec, Rails
Preloading Rails environment
Loading Spork.prefork block...
DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in Sunspot::Rails::SolrInstrumentation instead. (called from <top (required)> at /home/dougt/project/config/environment.rb:5)
Spork is ready and listening on 8989!
Spork server for RSpec successfully started
Guard::RSpec is running, with RSpec 2!
Running all specs
DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in Sunspot::Rails::SolrInstrumentation instead. (called from <top (required)> at /home/dougt/project/config/environment.rb:5)
/home/dougt/project/app/models/dropbox_token.rb:7: warning: already initialized constant ACCESS_TYPE
/home/dougt/project/app/models/dropbox_token.rb:9: warning: already initialized constant DROPBOX_SETTINGS
*.........**.....................***....***.....................***......*......................*

Pending:
  UserMailer add some examples to (or delete) /home/dougt/project/spec/mailers/user_mailer_spec.rb
    # No reason given
    # ./spec/mailers/user_mailer_spec.rb:4
  PersonNote add some examples to (or delete) /home/dougt/project/spec/models/person_note_spec.rb
    # No reason given
    # ./spec/models/person_note_spec.rb:4
  Task add some examples to (or delete) /home/dougt/project/spec/models/task_spec.rb
    # No reason given
    # ./spec/models/task_spec.rb:4
  Alert add some examples to (or delete) /home/dougt/project/spec/models/alert_spec.rb
    # No reason given
    # ./spec/models/alert_spec.rb:4
  Slide add some examples to (or delete) /home/dougt/project/spec/models/slide_spec.rb
    # No reason given
    # ./spec/models/slide_spec.rb:4
  BetaTester add some examples to (or delete) /home/dougt/project/spec/models/beta_tester_spec.rb
    # No reason given
    # ./spec/models/beta_tester_spec.rb:4
  SlideContent add some examples to (or delete) /home/dougt/project/spec/models/slide_content_spec.rb
    # No reason given
    # ./spec/models/slide_content_spec.rb:4
  SharedFile add some examples to (or delete) /home/dougt/project/spec/models/shared_file_spec.rb
    # No reason given
    # ./spec/models/shared_file_spec.rb:4
  FileActivity add some examples to (or delete) /home/dougt/project/spec/models/file_activity_spec.rb
    # No reason given
    # ./spec/models/file_activity_spec.rb:4
  EmailHelper add some examples to (or delete) /home/dougt/project/spec/helpers/email_helper_spec.rb
    # No reason given
    # ./spec/helpers/email_helper_spec.rb:14
  TodoLinesHelper add some examples to (or delete) /home/dougt/project/spec/helpers/todo_lines_helper_spec.rb
    # No reason given
    # ./spec/helpers/todo_lines_helper_spec.rb:14
  UserHelper add some examples to (or delete) /home/dougt/project/spec/helpers/user_helper_spec.rb
    # No reason given
    # ./spec/helpers/user_helper_spec.rb:14
  TasksHelper add some examples to (or delete) /home/dougt/project/spec/helpers/tasks_helper_spec.rb
    # No reason given
    # ./spec/helpers/tasks_helper_spec.rb:14
  todo_lines/show.html.erb add some examples to (or delete) /home/dougt/project/spec/views/todo_lines/show.html.erb_spec.rb
    # No reason given
    # ./spec/views/todo_lines/show.html.erb_spec.rb:4

Finished in 7.71 seconds
Running: spec/models/todo_file_spec.rb
DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in Sunspot::Rails::SolrInstrumentation instead. (called from <top (required)> at /home/dougt/project/config/environment.rb:5)
/home/dougt/project/app/models/dropbox_token.rb:7: warning: already initialized constant ACCESS_TYPE
/home/dougt/project/app/models/dropbox_token.rb:9: warning: already initialized constant DROPBOX_SETTINGS
.....................

Finished in 3.05 seconds
21 examples, 0 failures
dougt@dougt-ThinkPad-W520~/project$bundle exec-guard
Guard使用NotifySend发送通知。
卫兵现在正在“/home/dougt/project”监视
RSpec的启动Spork
使用RSpec、Rails
预加载Rails环境
正在加载Spork.prefork块。。。
弃用警告:ActiveSupport::Concern中的InstanceMethods模块将不再自动包含。请直接在Sunspot::Rails::SolrInstrumentation中定义实例方法。(从at/home/dougt/project/config/environment.rb:5调用)
斯波克准备好了,正在收听8989!
RSpec的Spork服务器已成功启动
守卫::RSpec正在运行,rspec2!
运行所有规格
弃用警告:ActiveSupport::Concern中的InstanceMethods模块将不再自动包含。请直接在Sunspot::Rails::SolrInstrumentation中定义实例方法。(从at/home/dougt/project/config/environment.rb:5调用)
/home/dougt/project/app/models/dropbox_token.rb:7:警告:已初始化常量访问类型
/home/dougt/project/app/models/dropbox_令牌。rb:9:警告:已初始化常量dropbox_设置
*.........**.....................***....***.....................***......*......................*
悬而未决的:
UserMailer向(或删除)/home/dougt/project/spec/mailers/user\u mailer\u spec.rb添加一些示例
#没有给出理由
#./spec/mailers/user\u mailer\u spec.rb:4
PersonNote向(或删除)/home/dougt/project/spec/models/person\u note\u spec.rb添加一些示例
#没有给出理由
#/规格/型号/人员\注\规格rb:4
任务将一些示例添加到(或删除)/home/dougt/project/spec/models/Task_spec.rb
#没有给出理由
#/规格/型号/任务\规格rb:4
警报将一些示例添加到(或删除)/home/dougt/project/spec/models/Alert_spec.rb
#没有给出理由
#/规格/型号/警报\规格rb:4
幻灯片将一些示例添加(或删除)/home/dougt/project/spec/models/Slide_spec.rb
#没有给出理由
#/规格/型号/幻灯片\规格rb:4
BetaTester将一些示例添加到(或删除)/home/dougt/project/spec/models/beta_tester_spec.rb
#没有给出理由
#/规格/型号/测试仪规格rb:4
SlideContent向(或删除)/home/dougt/project/spec/models/slide\u content\u spec.rb添加一些示例
#没有给出理由
#/规格/型号/幻灯片\u内容\u规格rb:4
SharedFile向(或删除)/home/dougt/project/spec/models/shared_file_spec.rb添加一些示例
#没有给出理由
#./spec/models/shared_file_spec.rb:4
FileActivity将一些示例添加到(或删除)/home/dougt/project/spec/models/file_activity_spec.rb
#没有给出理由
#./spec/models/file\u activity\u spec.rb:4
EmailHelper将一些示例添加到(或删除)/home/dougt/project/spec/helpers/email\u helper\u spec.rb
#没有给出理由
#./spec/helpers/email\u helper\u spec.rb:14
TodoLinesHelper添加(或删除)/home/dougt/project/spec/helpers/todo\U lines\U helper\U spec.rb中的一些示例
#没有给出理由
#./spec/helpers/todo\u line\u helper\u spec.rb:14
UserHelper将一些示例添加到(或删除)/home/dougt/project/spec/helpers/user\u helper\u spec.rb
#没有给出理由
#./spec/helpers/user\u helper\u spec.rb:14
TasksHelper将一些示例添加(或删除)/home/dougt/project/spec/helpers/tasks\u helper\u spec.rb
#没有给出理由
#./spec/helpers/tasks\u helper\u spec.rb:14
todo_lines/show.html.erb在/home/dougt/project/spec/views/todo_lines/show.html.erb_spec.rb中添加(或删除)一些示例
#没有给出理由
#./spec/views/todo_line/show.html.erb_spec.rb:4
以7.71秒完成
正在运行:spec/models/todo_file_spec.rb
弃用警告:ActiveSupport::Concern中的InstanceMethods模块将不再自动包含。请直接在Sunspot::Rails::SolrInstrumentation中定义实例方法。(从at/home/dougt/project/config/environment.rb:5调用)
/home/dougt/project/app/models/dropbox_token.rb:7:警告:已初始化常量访问类型
/home/dougt/project/app/models/dropbox_令牌。rb:9:警告:已初始化常量dropbox_设置
.....................
以3.05秒完成
21例,0例失败

您可以分析spork,并使用结果在prefork块中查找内容

designe和可能的其他gems调用reload也存在一个问题,通过向spec_helper prefork块添加以下内容,可以捕获这些方法:

  ...
  ENV["RAILS_ENV"] ||= 'test'      
  # For Devise
  require "rails/application"
  Spork.trap_method(Rails::Application, :reload_routes!)
  Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
  ...

我已经添加了GuardFile,你到底是如何运行你的规格的?向我们展示您如何启动guard,以及运行规格时guard显示的内容。为了调试这个,我们需要更多的终端输出。如果guard的输出中确实在重新加载Spork,您应该会看到
重新加载Spork for RSpec
。加载rails和依赖项只是使您的测试套件“快速”的一步——如果您在其中使用rails并大量使用工厂,那么测试套件本身可能仍然很慢。我们谈论的是什么样的数字