Skip to content

Commit a53fbc7

Browse files
author
Jean-Michel Garnier
committed
1 parent 749763e commit a53fbc7

File tree

5 files changed

+101
-4
lines changed

5 files changed

+101
-4
lines changed

Gemfile

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ group :development, :test do
2828
gem 'rdiscount' # For yard
2929
gem "sprockets"
3030
gem 'rails-i18n' # Gives us default i18n for many languages
31+
gem 'parallel_tests'
3132
end
3233

3334
group :test do

Rakefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ require File.expand_path('../spec/support/detect_rails_version', __FILE__)
1414
# Import all our rake tasks
1515
FileList['tasks/**/*.rake'].each { |task| import task }
1616

17-
# Run the specs & cukes
18-
task :default => :test
17+
# Run the specs & cukes using parallel_tests
18+
task :default => :parallel_tests
1919

2020
begin
2121
require 'jasmine'

spec/support/rails_template.rb

+36-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
# Generate a model with string ids
2424
generate :model, "tag name:string"
25-
gsub_file(Dir['db/migrate/*_create_tags.rb'][0], /\:tags\sdo\s.*/, ":tags, :id => false, :primary_key => :id do |t|\n\t\t\tt.string :id\n" )
25+
gsub_file(Dir['db/migrate/*_create_tags.rb'][0], /\:tags\sdo\s.*/, ":tags, :id => false, :primary_key => :id do |t|\n\t\t\tt.string :id\n")
2626
id_model_setup = <<-EOF
2727
self.primary_key = :id
2828
before_create :set_id
@@ -68,3 +68,38 @@ def set_id
6868
rake "db:migrate"
6969
rake "db:test:prepare"
7070
run "/usr/bin/env RAILS_ENV=cucumber rake db:migrate"
71+
72+
# Setup parallel_tests
73+
def setup_parallel_tests_database(after, force_insert_same_content = false)
74+
inject_into_file 'config/database.yml', "<%= ENV['TEST_ENV_NUMBER'] %>", :after => after, :force => force_insert_same_content
75+
end
76+
77+
setup_parallel_tests_database "test.sqlite3"
78+
setup_parallel_tests_database "cucumber.sqlite3", true
79+
80+
# Note: this is hack!
81+
# Somehow, calling parallel_tests tasks from Rails generator using Thor does not work ...
82+
# RAILS_ENV variable never makes it to parallel_tests tasks.
83+
# We need to call these tasks in the after set up hook in order to creates cucumber DBs + run migrations on test & cucumber DBs
84+
create_file 'lib/tasks/parallel.rake' do
85+
<<'RAKE'
86+
namespace :parallel do
87+
def run_in_parallel(cmd, options)
88+
count = "-n #{options[:count]}" if options[:count]
89+
executable = 'parallel_test'
90+
command = "#{executable} --exec '#{cmd}' #{count} #{'--non-parallel' if options[:non_parallel]}"
91+
abort unless system(command)
92+
end
93+
94+
desc "create cucumber databases via db:create --> parallel:create_cucumber_db[num_cpus]"
95+
task :create_cucumber_db, :count do |t, args|
96+
run_in_parallel("rake db:create RAILS_ENV=cucumber", args)
97+
end
98+
99+
desc "load dumped schema for cucumber databases"
100+
task :load_schema_cucumber_db, :count do |t,args|
101+
run_in_parallel("rake db:schema:load RAILS_ENV=cucumber", args)
102+
end
103+
end
104+
RAKE
105+
end

tasks/parallel_tests.rake

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
require 'parallel'
2+
3+
desc "Run the full suite using parallel_tests to run on multiple cores"
4+
task :parallel_tests => ['parallel:setup_parallel_tests', 'parallel:spec', 'parallel:features', 'cucumber:class_reloading']
5+
6+
namespace :parallel do
7+
8+
def rails_app_rake(task)
9+
require 'rails/version'
10+
system "cd spec/rails/rails-#{Rails::VERSION::STRING}; rake #{task}"
11+
end
12+
13+
task :after_setup_hook do
14+
rails_app_rake "parallel:load_schema"
15+
rails_app_rake "parallel:create_cucumber_db"
16+
rails_app_rake "parallel:load_schema_cucumber_db"
17+
end
18+
19+
def parallel_tests_setup?
20+
require 'rails/version'
21+
database_config = File.join "spec", "rails", "rails-#{Rails::VERSION::STRING}", "config", "database.yml"
22+
File.read(database_config).include?("TEST_ENV_NUMBER")
23+
end
24+
25+
desc "Setup parallel_tests DBs"
26+
task :setup_parallel_tests do
27+
unless parallel_tests_setup?
28+
puts "parallel_tests is not set up. (Re)building spec/rails/rails-#{Rails::VERSION::STRING} App. Please wait."
29+
require 'rails/version'
30+
system("rm -Rf spec/rails/rails-#{Rails::VERSION::STRING}")
31+
Rake::Task['setup'].invoke
32+
end
33+
end
34+
35+
def run_in_parallel(command)
36+
system("ENV['TEST_ENV_NUMBER']=#{Parallel.processor_count} #{command}")
37+
end
38+
39+
desc "Run the specs in parallel"
40+
task :spec => :setup_parallel_tests do
41+
run_in_parallel "parallel_rspec spec/"
42+
end
43+
44+
namespace :spec do
45+
46+
%w(unit integration).each do |type|
47+
desc "Run the #{type} specs in parallel"
48+
task type => :setup_parallel_tests do
49+
run_in_parallel "parallel_rspec spec/#{type}"
50+
end
51+
end
52+
53+
end
54+
55+
desc "Run the cucumber features in parallel"
56+
task :features => :setup_parallel_tests do
57+
run_in_parallel "parallel_cucumber features/"
58+
end
59+
60+
end

tasks/test.rake

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ task :setup do
33
require 'rails/version'
44
system("mkdir spec/rails") unless File.exists?("spec/rails")
55
system "bundle exec rails new spec/rails/rails-#{Rails::VERSION::STRING} -m spec/support/rails_template.rb"
6+
Rake::Task['parallel:after_setup_hook'].invoke
67
end
78

89
# Run specs and cukes
9-
desc "Run the full suite"
10+
desc "Run the full suite using 1 core"
1011
task :test => ['spec:unit', 'spec:integration', 'cucumber', 'cucumber:class_reloading']
1112

1213
namespace :test do

0 commit comments

Comments
 (0)