parallel_tests 3.7.3 → 4.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +70 -28
- data/lib/parallel_tests/cli.rb +68 -39
- data/lib/parallel_tests/cucumber/runner.rb +4 -4
- data/lib/parallel_tests/cucumber/scenario_line_logger.rb +1 -1
- data/lib/parallel_tests/cucumber/scenarios.rb +4 -3
- data/lib/parallel_tests/gherkin/runner.rb +11 -16
- data/lib/parallel_tests/grouper.rb +1 -5
- data/lib/parallel_tests/pids.rb +2 -2
- data/lib/parallel_tests/rspec/failures_logger.rb +5 -13
- data/lib/parallel_tests/rspec/logger_base.rb +0 -2
- data/lib/parallel_tests/rspec/runner.rb +10 -15
- data/lib/parallel_tests/rspec/runtime_logger.rb +5 -4
- data/lib/parallel_tests/rspec/summary_logger.rb +1 -1
- data/lib/parallel_tests/rspec/verbose_logger.rb +62 -0
- data/lib/parallel_tests/spinach/runner.rb +1 -1
- data/lib/parallel_tests/tasks.rb +161 -75
- data/lib/parallel_tests/test/runner.rb +59 -16
- data/lib/parallel_tests/version.rb +1 -1
- data/lib/parallel_tests.rb +3 -1
- metadata +12 -10
@@ -3,22 +3,14 @@ require 'parallel_tests/rspec/logger_base'
|
|
3
3
|
require 'parallel_tests/rspec/runner'
|
4
4
|
|
5
5
|
class ParallelTests::RSpec::FailuresLogger < ParallelTests::RSpec::LoggerBase
|
6
|
-
|
7
|
-
def dump_failures(*args); end
|
8
|
-
else
|
9
|
-
RSpec::Core::Formatters.register self, :dump_summary
|
10
|
-
end
|
6
|
+
RSpec::Core::Formatters.register(self, :dump_summary)
|
11
7
|
|
12
8
|
def dump_summary(*args)
|
13
9
|
lock_output do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
notification
|
18
|
-
unless notification.failed_examples.empty?
|
19
|
-
colorizer = ::RSpec::Core::Formatters::ConsoleCodes
|
20
|
-
output.puts notification.colorized_rerun_commands(colorizer)
|
21
|
-
end
|
10
|
+
notification = args.first
|
11
|
+
unless notification.failed_examples.empty?
|
12
|
+
colorizer = ::RSpec::Core::Formatters::ConsoleCodes
|
13
|
+
output.puts notification.colorized_rerun_commands(colorizer)
|
22
14
|
end
|
23
15
|
end
|
24
16
|
@output.flush
|
@@ -7,8 +7,7 @@ module ParallelTests
|
|
7
7
|
DEV_NULL = (WINDOWS ? "NUL" : "/dev/null")
|
8
8
|
class << self
|
9
9
|
def run_tests(test_files, process_number, num_processes, options)
|
10
|
-
|
11
|
-
cmd = [exe, options[:test_options], color, spec_opts, *test_files].compact.join(" ")
|
10
|
+
cmd = [*executable, *options[:test_options], *color, *spec_opts, *test_files]
|
12
11
|
execute_command(cmd, process_number, num_processes, options)
|
13
12
|
end
|
14
13
|
|
@@ -16,9 +15,9 @@ module ParallelTests
|
|
16
15
|
if File.exist?("bin/rspec")
|
17
16
|
ParallelTests.with_ruby_binary("bin/rspec")
|
18
17
|
elsif ParallelTests.bundler_enabled?
|
19
|
-
"bundle exec rspec"
|
18
|
+
["bundle", "exec", "rspec"]
|
20
19
|
else
|
21
|
-
"rspec"
|
20
|
+
["rspec"]
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -34,8 +33,10 @@ module ParallelTests
|
|
34
33
|
"spec"
|
35
34
|
end
|
36
35
|
|
36
|
+
# used to find all _spec.rb files
|
37
|
+
# supports also feature files used by rspec turnip extension
|
37
38
|
def test_suffix
|
38
|
-
/_spec\.rb$/
|
39
|
+
/(_spec\.rb|\.feature)$/
|
39
40
|
end
|
40
41
|
|
41
42
|
def line_is_result?(line)
|
@@ -48,8 +49,8 @@ module ParallelTests
|
|
48
49
|
# --order rand:1234
|
49
50
|
# --order random:1234
|
50
51
|
def command_with_seed(cmd, seed)
|
51
|
-
clean = cmd
|
52
|
-
|
52
|
+
clean = remove_command_arguments(cmd, '--seed', '--order')
|
53
|
+
[*clean, '--seed', seed]
|
53
54
|
end
|
54
55
|
|
55
56
|
# Summarize results from threads and colorize results based on failure and pending counts.
|
@@ -71,19 +72,13 @@ module ParallelTests
|
|
71
72
|
|
72
73
|
private
|
73
74
|
|
74
|
-
# so it can be stubbed....
|
75
|
-
def run(cmd)
|
76
|
-
`#{cmd}`
|
77
|
-
end
|
78
|
-
|
79
75
|
def color
|
80
|
-
'--color --tty' if $stdout.tty?
|
76
|
+
['--color', '--tty'] if $stdout.tty?
|
81
77
|
end
|
82
78
|
|
83
79
|
def spec_opts
|
84
80
|
options_file = ['.rspec_parallel', 'spec/parallel_spec.opts', 'spec/spec.opts'].detect { |f| File.file?(f) }
|
85
|
-
|
86
|
-
"-O #{options_file}"
|
81
|
+
["-O", options_file] if options_file
|
87
82
|
end
|
88
83
|
end
|
89
84
|
end
|
@@ -9,7 +9,7 @@ class ParallelTests::RSpec::RuntimeLogger < ParallelTests::RSpec::LoggerBase
|
|
9
9
|
@group_nesting = 0
|
10
10
|
end
|
11
11
|
|
12
|
-
RSpec::Core::Formatters.register
|
12
|
+
RSpec::Core::Formatters.register(self, :example_group_started, :example_group_finished, :start_dump)
|
13
13
|
|
14
14
|
def example_group_started(example_group)
|
15
15
|
@time = ParallelTests.now if @group_nesting == 0
|
@@ -20,8 +20,7 @@ class ParallelTests::RSpec::RuntimeLogger < ParallelTests::RSpec::LoggerBase
|
|
20
20
|
def example_group_finished(notification)
|
21
21
|
@group_nesting -= 1
|
22
22
|
if @group_nesting == 0
|
23
|
-
|
24
|
-
@example_times[path] += ParallelTests.now - @time
|
23
|
+
@example_times[notification.group.file_path] += ParallelTests.now - @time
|
25
24
|
end
|
26
25
|
super if defined?(super)
|
27
26
|
end
|
@@ -37,9 +36,11 @@ class ParallelTests::RSpec::RuntimeLogger < ParallelTests::RSpec::LoggerBase
|
|
37
36
|
def start_dump(*)
|
38
37
|
return unless ENV['TEST_ENV_NUMBER'] # only record when running in parallel
|
39
38
|
lock_output do
|
39
|
+
# Order the output from slowest to fastest
|
40
|
+
@example_times = @example_times.sort_by(&:last).reverse
|
40
41
|
@example_times.each do |file, time|
|
41
42
|
relative_path = file.sub(%r{^#{Regexp.escape Dir.pwd}/}, '').sub(%r{^\./}, "")
|
42
|
-
@output.puts "#{relative_path}:#{time
|
43
|
+
@output.puts "#{relative_path}:#{[time, 0].max}"
|
43
44
|
end
|
44
45
|
end
|
45
46
|
@output.flush
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'parallel_tests/rspec/failures_logger'
|
3
3
|
|
4
4
|
class ParallelTests::RSpec::SummaryLogger < ParallelTests::RSpec::LoggerBase
|
5
|
-
RSpec::Core::Formatters.register
|
5
|
+
RSpec::Core::Formatters.register(self, :dump_failures)
|
6
6
|
|
7
7
|
def dump_failures(*args)
|
8
8
|
lock_output { super }
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rspec/core/formatters/base_text_formatter'
|
4
|
+
require 'parallel_tests/rspec/runner'
|
5
|
+
|
6
|
+
class ParallelTests::RSpec::VerboseLogger < RSpec::Core::Formatters::BaseTextFormatter
|
7
|
+
RSpec::Core::Formatters.register(
|
8
|
+
self,
|
9
|
+
:example_group_started,
|
10
|
+
:example_group_finished,
|
11
|
+
:example_started,
|
12
|
+
:example_passed,
|
13
|
+
:example_pending,
|
14
|
+
:example_failed
|
15
|
+
)
|
16
|
+
|
17
|
+
def initialize(output)
|
18
|
+
super
|
19
|
+
@line = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def example_group_started(notification)
|
23
|
+
@line.push(notification.group.description)
|
24
|
+
end
|
25
|
+
|
26
|
+
def example_group_finished(_notification)
|
27
|
+
@line.pop
|
28
|
+
end
|
29
|
+
|
30
|
+
def example_started(notification)
|
31
|
+
@line.push(notification.example.description)
|
32
|
+
output_formatted_line('STARTED', :yellow)
|
33
|
+
end
|
34
|
+
|
35
|
+
def example_passed(_passed)
|
36
|
+
output_formatted_line('PASSED', :success)
|
37
|
+
@line.pop
|
38
|
+
end
|
39
|
+
|
40
|
+
def example_pending(_pending)
|
41
|
+
output_formatted_line('PENDING', :pending)
|
42
|
+
@line.pop
|
43
|
+
end
|
44
|
+
|
45
|
+
def example_failed(_failure)
|
46
|
+
output_formatted_line('FAILED', :failure)
|
47
|
+
@line.pop
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def output_formatted_line(status, console_code)
|
53
|
+
prefix = ["[#{Process.pid}]"]
|
54
|
+
if ENV.include?('TEST_ENV_NUMBER')
|
55
|
+
test_env_number = ENV['TEST_ENV_NUMBER'] == '' ? 1 : Integer(ENV['TEST_ENV_NUMBER'])
|
56
|
+
prefix << "[#{test_env_number}]"
|
57
|
+
end
|
58
|
+
prefix << RSpec::Core::Formatters::ConsoleCodes.wrap("[#{status}]", console_code)
|
59
|
+
|
60
|
+
output.puts [*prefix, *@line].join(' ')
|
61
|
+
end
|
62
|
+
end
|
data/lib/parallel_tests/tasks.rb
CHANGED
@@ -9,16 +9,8 @@ module ParallelTests
|
|
9
9
|
'test'
|
10
10
|
end
|
11
11
|
|
12
|
-
def rake_bin
|
13
|
-
# Prevent 'Exec format error' Errno::ENOEXEC on Windows
|
14
|
-
return "rake" if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
|
15
|
-
binstub_path = File.join('bin', 'rake')
|
16
|
-
return binstub_path if File.exist?(binstub_path)
|
17
|
-
"rake"
|
18
|
-
end
|
19
|
-
|
20
12
|
def load_lib
|
21
|
-
$LOAD_PATH << File.expand_path(
|
13
|
+
$LOAD_PATH << File.expand_path('..', __dir__)
|
22
14
|
require "parallel_tests"
|
23
15
|
end
|
24
16
|
|
@@ -30,12 +22,15 @@ module ParallelTests
|
|
30
22
|
|
31
23
|
def run_in_parallel(cmd, options = {})
|
32
24
|
load_lib
|
33
|
-
|
25
|
+
|
34
26
|
# Using the relative path to find the binary allow to run a specific version of it
|
35
27
|
executable = File.expand_path('../../bin/parallel_test', __dir__)
|
36
|
-
|
37
|
-
command
|
38
|
-
|
28
|
+
command = ParallelTests.with_ruby_binary(executable)
|
29
|
+
command += ['--exec', Shellwords.join(cmd)]
|
30
|
+
command += ['-n', options[:count]] unless options[:count].to_s.empty?
|
31
|
+
command << '--non-parallel' if options[:non_parallel]
|
32
|
+
|
33
|
+
abort unless system(*command)
|
39
34
|
end
|
40
35
|
|
41
36
|
# this is a crazy-complex solution for a very simple problem:
|
@@ -48,16 +43,17 @@ module ParallelTests
|
|
48
43
|
# - pipefail makes pipe fail with exitstatus of first failed command
|
49
44
|
# - pipefail is not supported in (zsh)
|
50
45
|
# - defining a new rake task like silence_schema would force users to load parallel_tests in test env
|
51
|
-
# - do not use ' since run_in_parallel uses them to quote stuff
|
52
46
|
# - simple system "set -o pipefail" returns nil even though set -o pipefail exists with 0
|
53
47
|
def suppress_output(command, ignore_regex)
|
54
48
|
activate_pipefail = "set -o pipefail"
|
55
|
-
remove_ignored_lines = %{(grep -v
|
49
|
+
remove_ignored_lines = %{(grep -v #{Shellwords.escape(ignore_regex)} || true)}
|
56
50
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
51
|
+
# remove nil values (ex: #purge_before_load returns nil)
|
52
|
+
command.compact!
|
53
|
+
|
54
|
+
if system('/bin/bash', '-c', "#{activate_pipefail} 2>/dev/null")
|
55
|
+
shell_command = "#{activate_pipefail} && (#{Shellwords.shelljoin(command)}) | #{remove_ignored_lines}"
|
56
|
+
['/bin/bash', '-c', shell_command]
|
61
57
|
else
|
62
58
|
command
|
63
59
|
end
|
@@ -90,7 +86,74 @@ module ParallelTests
|
|
90
86
|
options = args.shift
|
91
87
|
pass_through = args.shift
|
92
88
|
|
93
|
-
[num_processes, pattern
|
89
|
+
[num_processes, pattern, options, pass_through]
|
90
|
+
end
|
91
|
+
|
92
|
+
def schema_format_based_on_rails_version
|
93
|
+
if rails_7_or_greater?
|
94
|
+
ActiveRecord.schema_format
|
95
|
+
else
|
96
|
+
ActiveRecord::Base.schema_format
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def schema_type_based_on_rails_version
|
101
|
+
if rails_61_or_greater? || schema_format_based_on_rails_version == :ruby
|
102
|
+
"schema"
|
103
|
+
else
|
104
|
+
"structure"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def build_run_command(type, args)
|
109
|
+
count, pattern, options, pass_through = ParallelTests::Tasks.parse_args(args)
|
110
|
+
test_framework = {
|
111
|
+
'spec' => 'rspec',
|
112
|
+
'test' => 'test',
|
113
|
+
'features' => 'cucumber',
|
114
|
+
'features-spinach' => 'spinach'
|
115
|
+
}.fetch(type)
|
116
|
+
|
117
|
+
type = 'features' if test_framework == 'spinach'
|
118
|
+
|
119
|
+
# Using the relative path to find the binary allow to run a specific version of it
|
120
|
+
executable = File.expand_path('../../bin/parallel_test', __dir__)
|
121
|
+
executable = ParallelTests.with_ruby_binary(executable)
|
122
|
+
|
123
|
+
command = [*executable, type, '--type', test_framework]
|
124
|
+
command += ['-n', count.to_s] if count
|
125
|
+
command += ['--pattern', pattern] if pattern
|
126
|
+
command += ['--test-options', options] if options
|
127
|
+
command += Shellwords.shellsplit pass_through if pass_through
|
128
|
+
command
|
129
|
+
end
|
130
|
+
|
131
|
+
def configured_databases
|
132
|
+
return [] unless defined?(ActiveRecord) && rails_61_or_greater?
|
133
|
+
|
134
|
+
@@configured_databases ||= ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
|
135
|
+
end
|
136
|
+
|
137
|
+
def for_each_database(&block)
|
138
|
+
# Use nil to represent all databases
|
139
|
+
block&.call(nil)
|
140
|
+
|
141
|
+
# skip if not rails or old rails version
|
142
|
+
return if !defined?(ActiveRecord::Tasks::DatabaseTasks) || !ActiveRecord::Tasks::DatabaseTasks.respond_to?(:for_each)
|
143
|
+
|
144
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(configured_databases) do |name|
|
145
|
+
block&.call(name)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
def rails_7_or_greater?
|
152
|
+
Gem::Version.new(Rails.version) >= Gem::Version.new('7.0')
|
153
|
+
end
|
154
|
+
|
155
|
+
def rails_61_or_greater?
|
156
|
+
Gem::Version.new(Rails.version) >= Gem::Version.new('6.1.0')
|
94
157
|
end
|
95
158
|
end
|
96
159
|
end
|
@@ -99,36 +162,46 @@ end
|
|
99
162
|
namespace :parallel do
|
100
163
|
desc "Setup test databases via db:setup --> parallel:setup[num_cpus]"
|
101
164
|
task :setup, :count do |_, args|
|
102
|
-
command = "
|
165
|
+
command = [$0, "db:setup", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"]
|
103
166
|
ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args)
|
104
167
|
end
|
105
168
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
169
|
+
ParallelTests::Tasks.for_each_database do |name|
|
170
|
+
task_name = 'create'
|
171
|
+
task_name += ":#{name}" if name
|
172
|
+
desc "Create test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]"
|
173
|
+
task task_name.to_sym, :count do |_, args|
|
174
|
+
ParallelTests::Tasks.run_in_parallel(
|
175
|
+
[$0, "db:#{task_name}", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"],
|
176
|
+
args
|
177
|
+
)
|
178
|
+
end
|
111
179
|
end
|
112
180
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
181
|
+
ParallelTests::Tasks.for_each_database do |name|
|
182
|
+
task_name = 'drop'
|
183
|
+
task_name += ":#{name}" if name
|
184
|
+
desc "Drop test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]"
|
185
|
+
task task_name.to_sym, :count do |_, args|
|
186
|
+
ParallelTests::Tasks.run_in_parallel(
|
187
|
+
[
|
188
|
+
$0,
|
189
|
+
"db:#{task_name}",
|
190
|
+
"RAILS_ENV=#{ParallelTests::Tasks.rails_env}",
|
191
|
+
"DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
|
192
|
+
],
|
193
|
+
args
|
194
|
+
)
|
195
|
+
end
|
119
196
|
end
|
120
197
|
|
121
198
|
desc "Update test databases by dumping and loading --> parallel:prepare[num_cpus]"
|
122
199
|
task(:prepare, [:count]) do |_, args|
|
123
200
|
ParallelTests::Tasks.check_for_pending_migrations
|
124
|
-
|
201
|
+
|
202
|
+
if defined?(ActiveRecord) && [:ruby, :sql].include?(ParallelTests::Tasks.schema_format_based_on_rails_version)
|
125
203
|
# fast: dump once, load in parallel
|
126
|
-
type =
|
127
|
-
if Gem::Version.new(Rails.version) >= Gem::Version.new('6.1.0')
|
128
|
-
"schema"
|
129
|
-
else
|
130
|
-
ActiveRecord::Base.schema_format == :ruby ? "schema" : "structure"
|
131
|
-
end
|
204
|
+
type = ParallelTests::Tasks.schema_type_based_on_rails_version
|
132
205
|
|
133
206
|
Rake::Task["db:#{type}:dump"].invoke
|
134
207
|
|
@@ -140,32 +213,51 @@ namespace :parallel do
|
|
140
213
|
# slow: dump and load in in serial
|
141
214
|
args = args.to_hash.merge(non_parallel: true) # normal merge returns nil
|
142
215
|
task_name = Rake::Task.task_defined?('db:test:prepare') ? 'db:test:prepare' : 'app:db:test:prepare'
|
143
|
-
ParallelTests::Tasks.run_in_parallel(
|
216
|
+
ParallelTests::Tasks.run_in_parallel([$0, task_name], args)
|
144
217
|
next
|
145
218
|
end
|
146
219
|
end
|
147
220
|
|
148
221
|
# when dumping/resetting takes too long
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
222
|
+
ParallelTests::Tasks.for_each_database do |name|
|
223
|
+
task_name = 'migrate'
|
224
|
+
task_name += ":#{name}" if name
|
225
|
+
desc "Update test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]"
|
226
|
+
task task_name.to_sym, :count do |_, args|
|
227
|
+
ParallelTests::Tasks.run_in_parallel(
|
228
|
+
[$0, "db:#{task_name}", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"],
|
229
|
+
args
|
230
|
+
)
|
231
|
+
end
|
154
232
|
end
|
155
233
|
|
156
234
|
desc "Rollback test databases via db:rollback --> parallel:rollback[num_cpus]"
|
157
235
|
task :rollback, :count do |_, args|
|
158
236
|
ParallelTests::Tasks.run_in_parallel(
|
159
|
-
"
|
237
|
+
[$0, "db:rollback", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"],
|
238
|
+
args
|
160
239
|
)
|
161
240
|
end
|
162
241
|
|
163
242
|
# just load the schema (good for integration server <-> no development db)
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
243
|
+
ParallelTests::Tasks.for_each_database do |name|
|
244
|
+
rails_task = 'db:schema:load'
|
245
|
+
rails_task += ":#{name}" if name
|
246
|
+
|
247
|
+
task_name = 'load_schema'
|
248
|
+
task_name += ":#{name}" if name
|
249
|
+
|
250
|
+
desc "Load dumped schema for test#{" #{name}" if name} database via #{rails_task} --> parallel:#{task_name}[num_cpus]"
|
251
|
+
task task_name.to_sym, :count do |_, args|
|
252
|
+
command = [
|
253
|
+
$0,
|
254
|
+
ParallelTests::Tasks.purge_before_load,
|
255
|
+
rails_task,
|
256
|
+
"RAILS_ENV=#{ParallelTests::Tasks.rails_env}",
|
257
|
+
"DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
|
258
|
+
]
|
259
|
+
ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args)
|
260
|
+
end
|
169
261
|
end
|
170
262
|
|
171
263
|
# load the structure from the structure.sql file
|
@@ -173,23 +265,34 @@ namespace :parallel do
|
|
173
265
|
desc "Load structure for test databases via db:schema:load --> parallel:load_structure[num_cpus]"
|
174
266
|
task :load_structure, :count do |_, args|
|
175
267
|
ParallelTests::Tasks.run_in_parallel(
|
176
|
-
|
177
|
-
|
268
|
+
[
|
269
|
+
$0,
|
270
|
+
ParallelTests::Tasks.purge_before_load,
|
271
|
+
"db:structure:load",
|
272
|
+
"RAILS_ENV=#{ParallelTests::Tasks.rails_env}",
|
273
|
+
"DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
|
274
|
+
],
|
275
|
+
args
|
178
276
|
)
|
179
277
|
end
|
180
278
|
|
181
279
|
desc "Load the seed data from db/seeds.rb via db:seed --> parallel:seed[num_cpus]"
|
182
280
|
task :seed, :count do |_, args|
|
183
281
|
ParallelTests::Tasks.run_in_parallel(
|
184
|
-
|
282
|
+
[
|
283
|
+
$0,
|
284
|
+
"db:seed",
|
285
|
+
"RAILS_ENV=#{ParallelTests::Tasks.rails_env}"
|
286
|
+
],
|
287
|
+
args
|
185
288
|
)
|
186
289
|
end
|
187
290
|
|
188
291
|
desc "Launch given rake command in parallel"
|
189
292
|
task :rake, :command, :count do |_, args|
|
190
293
|
ParallelTests::Tasks.run_in_parallel(
|
191
|
-
"RAILS_ENV=#{ParallelTests::Tasks.rails_env}
|
192
|
-
|
294
|
+
[$0, args.command, "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"],
|
295
|
+
args
|
193
296
|
)
|
194
297
|
end
|
195
298
|
|
@@ -198,26 +301,9 @@ namespace :parallel do
|
|
198
301
|
task type, [:count, :pattern, :options, :pass_through] do |_t, args|
|
199
302
|
ParallelTests::Tasks.check_for_pending_migrations
|
200
303
|
ParallelTests::Tasks.load_lib
|
304
|
+
command = ParallelTests::Tasks.build_run_command(type, args)
|
201
305
|
|
202
|
-
|
203
|
-
test_framework = {
|
204
|
-
'spec' => 'rspec',
|
205
|
-
'test' => 'test',
|
206
|
-
'features' => 'cucumber',
|
207
|
-
'features-spinach' => 'spinach'
|
208
|
-
}[type]
|
209
|
-
|
210
|
-
type = 'features' if test_framework == 'spinach'
|
211
|
-
# Using the relative path to find the binary allow to run a specific version of it
|
212
|
-
executable = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'parallel_test')
|
213
|
-
|
214
|
-
command = "#{ParallelTests.with_ruby_binary(Shellwords.escape(executable))} #{type} " \
|
215
|
-
"--type #{test_framework} " \
|
216
|
-
"-n #{count} " \
|
217
|
-
"--pattern '#{pattern}' " \
|
218
|
-
"--test-options '#{options}' " \
|
219
|
-
"#{pass_through}"
|
220
|
-
abort unless system(command) # allow to chain tasks e.g. rake parallel:spec parallel:features
|
306
|
+
abort unless system(*command) # allow to chain tasks e.g. rake parallel:spec parallel:features
|
221
307
|
end
|
222
308
|
end
|
223
309
|
end
|