2014-03-02 8 views
1

Я разрабатываю проект Rails через коробку Vagrant (Ubuntu 32-bit, Rails 4.0.3, Ruby 2.1.0p0).Guard + Spork замедляет тесты, не получая опцию -drb

Я только что попробовал добавить Spork в свой проект, чтобы ускорить мои тесты (используя RSpec, Capybara), и я вижу значительно более медленные тесты. Если я запускаю просто «rspec.», Все мои тесты проходят через 5,83 секунды. Однако, когда я запускаю защиту через «guard -c -p», я сохраняю один из моих файлов spec, и получаю время 26.08 секунд.

Примечание: Мне нужно запустить «guard -p», чтобы на самом деле получить стражу, чтобы запустить мои тесты в файле, сохраняя через Vagrant.

Когда охранник начинает запуск тестов, он показывает арг:

["--color", "--failure-exit-code", "2", "--format", "progress", "--format", 
"Guard::RSpec::Formatter", "--require", "/home/vagrant/.rvm/gems/ruby-2.1.0/ 
gems/guard-rspec-4.2.7/lib/guard/rspec/formatter.rb", "spec"]... 

Я вижу, что «--format» указан дважды, и «--drb» не появляется вообще.

Вот мой Guardfile:

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

guard :rspec, :cmd => 'rspec --drb' 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|\.slim)$})   { |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" } 
end 


guard 'livereload' do 
    watch(%r{app/views/.+\.(erb|haml|slim)$}) 
    watch(%r{app/helpers/.+\.rb}) 
    watch(%r{public/.+\.(css|js|html)}) 
    watch(%r{config/locales/.+\.yml}) 
    # Rails Assets Pipeline 
    watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg))).*}) { |m| "/assets/#{m[3]}" } 
end 

Вот мой 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' 
    require 'rspec/autorun' 
    require 'capybara/rspec' 

    # 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 } 

    # Checks for pending migrations before tests are run. 
    # If you are not using ActiveRecord, you can remove this line. 
    ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 

    RSpec.configure do |config| 

    config.use_transactional_fixtures = true 
    config.infer_base_class_for_anonymous_controllers = false 
    config.order = "random" 

    #Devise 
    config.include Devise::TestHelpers, type: :controller 

    #Capybara 
    config.include Capybara::DSL 
    end 

end 

Spork.each_run do 
    # This code will be run each time you run your specs. 

end 

Единственное в моем .rspec:

--color 

Соответствующая часть моего Gemfile:

group :development, :test do 
    gem 'rspec-rails', '~> 2.0' 
    gem 'factory_girl_rails' 
    gem 'guard-rspec' 
    gem 'guard-livereload' 
    gem 'spork-rails' 
    gem 'guard-spork' 
end 

group :test do 
    gem 'shoulda-matchers' 
    gem 'capybara' 
end 

Я заметил, что если у меня есть охранник работает, а затем сохранить файл, время от времени я получаю сообщение об ошибке:

Could not start Spork server for rspec after 30 seconds. I will continue 
waiting for a further 60 seconds. 

Я m не уверен, почему он так долго после установки Spork, особенно когда rspec намного быстрее проходит через ту же коробку Vagrant. Есть идеи?

+0

Если удалить флаг -p, тесты со скоростью до около 5 секунд (всего 12 тестов, так далеко, но он проходит через Vagrant, так что, возможно, со временем я увижу увеличение скорости). Тем не менее, мне нужно вручную нажать «enter» в окне консоли, в котором работает Guard, и будет запускать все тесты, а не изменения файла. –

+0

Я нашел здесь обсуждение: https://github.com/guard/guard-rspec/issues/183 В основном проблема заключается в том, что VirtualBox не может позволить Guard, чтобы увидеть, что файлы были изменены, если только вы добавляете аргумент опроса -p. Вместо этого он пытается запустить все, пока Spork уже работает, что приводит к ошибкам «не запускать spork». Это также приводит к более медленным испытаниям. На данный момент я придерживаюсь того, чтобы просто нажать «войти» в консоль, чтобы запустить все тесты. Я не уверен, что время для редактирования всех моих драгоценных камней на моем уровне знаний в Ruby будет сохранено, если Guard будет работать правильно. –

ответ

1

Там новый --listen-on вариант, поскольку Guard 2.5: https://github.com/guard/guard/releases/tag/v2.5.0

От Guard's README:

Use Listen's network functionality to receive file change events from the network. This is most useful for virtual machines (e.g. Vagrant) which have problems firing native filesystem events on the guest OS.

Suggested use:

On the host OS, you need to listen to filesystem events and forward them to your VM using the listen script:

$ listen -f 127.0.0.1:4000

Remember to configure your VM to forward the appropriate ports, e.g. in Vagrantfile: config.vm.network :forwarded_port, guest: 4000, host: 4000

Then, on your guest OS, listen to the network events but ensure you specify the host path $ bundle exec guard -o '10.0.2.2:4000' -w '/projects/myproject'

 Смежные вопросы

  • Нет связанных вопросов^_^