Skip to content

Instantly share code, notes, and snippets.

@Bazai
Created September 1, 2011 15:48
Show Gist options
  • Save Bazai/1186463 to your computer and use it in GitHub Desktop.
Save Bazai/1186463 to your computer and use it in GitHub Desktop.
Настройка Spork для ускорения Ruby on Rails - RSpec - Cucumber проекта
Речь идет о Rails 3.1.0 проекте
В Gemfile добавляем все так, как написано в указанном ниже примере Gemfile
Версия Spork не менее 0.9.0.rc9
Делаем:
bundle install
Делаем все необходимые действия для установки RSpec и Cucumber
Корректируем файлы по указанным ниже примерам:
/spec/spec_helper.rb
/features/support/env.rb
Запускаем Spork с помощью:
bundle exec spork cucumber
Далее непосредственно тесты запускаем командой:
cuсumber --drb /feature/name_of.feature
Наслаждаемся супер скоростным запуском и прогоном тестов
Дополнение, если запуск Cucumber тестов отбирает ненужную кучу времени.
Есть замечательный кусок кода в блоке /features/support/env.rb
Spork.prefork do
# Раскомментировать это если нужно запустить трейсер, который показывает в милисекундах
# какие подгружаются файлы. Необходимо включить в require блок те файлы, которые загружаются
# более 100 мс.
# module Kernel
# def require_with_trace(*args)
# start = Time.now.to_f
# @indent ||= 0
# @indent += 2
# require_without_trace(*args)
# @indent -= 2
# Kernel::puts "#{' '*@indent}#{((Time.now.to_f - start)*1000).to_i} #{args[0]}"
# end
# alias_method_chain :require, :trace
# end
Пользоваться этим так, как указано в комментарии. То есть, после того, как мы запускаем cucumber сначала он показывает профайлер информацию вида:
111 treetop/runtime
39 mail/parsers/rfc2822_obsolete
3 treetop/runtime
86 mail/parsers/rfc2822
....
754 mail
45 action_mailer/tmail_compat
2 abstract_controller/collector
0 active_support/core_ext/hash/reverse_merge
0 active_support/core_ext/array/extract_options
...
Перед каждым подгружаемым файлом указано, сколько время в милисекундах заняла подгрузка определенного файла. Если это время более 100 мс, нужно добавить в Spork.prefork блок подгрузку этого файла. То есть, на данном примере стоит добавить:
require 'treetop/runtime'
require 'mail'
И у нас получится СУПЕР-МЕГА-СКОРОСТНОЙ запуск тестов, и отключаем трейс блок в prefork.
Речь идет о Rails 3.1.0 проекте
В Gemfile добавляем все так, как написано в указанном ниже примере Gemfile
Версия Spork не менее 0.9.0.rc9
Делаем:
bundle install
Делаем все необходимые действия для установки RSpec и Cucumber
Корректируем файлы по указанным ниже примерам:
/spec/spec_helper.rb
/features/support/env.rb
Запускаем Spork с помощью:
bundle exec spork cucumber
Далее непосредственно тесты запускаем командой:
cuсumber --drb /feature/name_of.feature
Наслаждаемся супер скоростным запуском и прогоном тестов
Дополнение, если запуск Cucumber тестов отбирает ненужную кучу времени.
Есть замечательный кусок кода в блоке /features/support/env.rb
Spork.prefork do
# Раскомментировать это если нужно запустить трейсер, который показывает в милисекундах
# какие подгружаются файлы. Необходимо включить в require блок те файлы, которые загружаются
# более 100 мс.
# module Kernel
# def require_with_trace(*args)
# start = Time.now.to_f
# @indent ||= 0
# @indent += 2
# require_without_trace(*args)
# @indent -= 2
# Kernel::puts "#{' '*@indent}#{((Time.now.to_f - start)*1000).to_i} #{args[0]}"
# end
# alias_method_chain :require, :trace
# end
После комментирования-разкомментирования обязательно перезапустить Spork
Пользоваться этим так, как указано в комментарии. То есть, после того, как мы запускаем cucumber сначала он показывает профайлер информацию вида:
111 treetop/runtime
39 mail/parsers/rfc2822_obsolete
3 treetop/runtime
86 mail/parsers/rfc2822
....
754 mail
45 action_mailer/tmail_compat
2 abstract_controller/collector
0 active_support/core_ext/hash/reverse_merge
0 active_support/core_ext/array/extract_options
...
Перед каждым подгружаемым файлом указано, сколько время в милисекундах заняла подгрузка определенного файла. Если это время более 100 мс, нужно добавить в Spork.prefork блок подгрузку этого файла. То есть, на данном примере стоит добавить:
require 'treetop/runtime'
require 'mail'
И у нас получится СУПЕР-МЕГА-СКОРОСТНОЙ запуск тестов, и отключаем трейс блок в prefork.
# encoding: utf-8
require 'cucumber/rails'
require 'spork'
ActionController::Base.allow_rescue = false
Spork.prefork do
# Раскомментировать это если нужно запустить трейсер, который показывает в милисекундах
# какие подгружаются файлы. Необходимо включить в require блок те файлы, которые загружаются
# более 100 мс.
# module Kernel
# def require_with_trace(*args)
# start = Time.now.to_f
# @indent ||= 0
# @indent += 2
# require_without_trace(*args)
# @indent -= 2
# Kernel::puts "#{' '*@indent}#{((Time.now.to_f - start)*1000).to_i} #{args[0]}"
# end
# alias_method_chain :require, :trace
# end
ENV["RAILS_ENV"] ||= "test"
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support
require 'cucumber/rails/world'
# require 'cucumber/rails/active_record'
require 'cucumber/web/tableish'
require 'capybara/rails'
require 'capybara/cucumber'
require 'capybara/session'
require 'mime/types'
# Lets you click links with onclick javascript handlers without using @culerity or @javascript
# Commented out because it causes bugs :-\
#require 'cucumber/rails/capybara_javascript_emulation'
Capybara.default_selector = :css
end
Spork.each_run do
ActionController::Base.allow_rescue = false
Cucumber::Rails::World.use_transactional_fixtures = true
if defined?(ActiveRecord::Base)
begin
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
rescue LoadError => ignore_if_database_cleaner_not_present
end
end
end
...
group :development do
gem "cucumber-rails"
gem "capybara"
gem "rspec-rails", ">= 2.0.1"
end
group :test do
gem "cucumber-rails"
gem "capybara"
gem "rspec-rails", ">= 2.0.1"
gem "database_cleaner"
# Особое внимание на версию Spork
gem "spork", ">= 0.9.0.rc9"
end
...
require 'spork'
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.
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'database_cleaner'
#require 'remarkable/active_record'
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.mock_with :rspec
config.before :suite do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with :truncation
end
config.before :each do
DatabaseCleaner.start
end
config.after :each do
DatabaseCleaner.clean
end
end
end
Spork.each_run do
# This code will be run each time you run your specs.
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment