parallel_tests 3.4.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "parallel_tests/test/runner"
2
3
 
3
4
  module ParallelTests
@@ -12,10 +13,9 @@ module ParallelTests
12
13
  end
13
14
 
14
15
  def determine_executable
15
- case
16
- when File.exist?("bin/rspec")
16
+ if File.exist?("bin/rspec")
17
17
  ParallelTests.with_ruby_binary("bin/rspec")
18
- when ParallelTests.bundler_enabled?
18
+ elsif ParallelTests.bundler_enabled?
19
19
  "bundle exec rspec"
20
20
  else
21
21
  "rspec"
@@ -23,7 +23,7 @@ module ParallelTests
23
23
  end
24
24
 
25
25
  def runtime_log
26
- 'tmp/parallel_runtime_rspec.log'
26
+ "tmp/parallel_runtime_rspec.log"
27
27
  end
28
28
 
29
29
  def test_file_name
@@ -55,9 +55,9 @@ module ParallelTests
55
55
  return text unless $stdout.tty?
56
56
  sums = sum_up_results(results)
57
57
  color =
58
- if sums['failure'].positive?
58
+ if sums['failure'] > 0
59
59
  31 # red
60
- elsif sums['pending'].positive?
60
+ elsif sums['pending'] > 0
61
61
  33 # yellow
62
62
  else
63
63
  32 # green
@@ -77,7 +77,7 @@ module ParallelTests
77
77
  end
78
78
 
79
79
  def spec_opts
80
- options_file = ['.rspec_parallel', 'spec/parallel_spec.opts', 'spec/spec.opts'].detect{|f| File.file?(f) }
80
+ options_file = ['.rspec_parallel', 'spec/parallel_spec.opts', 'spec/spec.opts'].detect { |f| File.file?(f) }
81
81
  return unless options_file
82
82
  "-O #{options_file}"
83
83
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'parallel_tests'
2
3
  require 'parallel_tests/rspec/logger_base'
3
4
 
@@ -8,9 +9,7 @@ class ParallelTests::RSpec::RuntimeLogger < ParallelTests::RSpec::LoggerBase
8
9
  @group_nesting = 0
9
10
  end
10
11
 
11
- unless RSPEC_2
12
- RSpec::Core::Formatters.register self, :example_group_started, :example_group_finished, :start_dump
13
- end
12
+ RSpec::Core::Formatters.register self, :example_group_started, :example_group_finished, :start_dump unless RSPEC_2
14
13
 
15
14
  def example_group_started(example_group)
16
15
  @time = ParallelTests.now if @group_nesting == 0
@@ -27,16 +26,19 @@ class ParallelTests::RSpec::RuntimeLogger < ParallelTests::RSpec::LoggerBase
27
26
  super if defined?(super)
28
27
  end
29
28
 
30
- def dump_summary(*args);end
31
- def dump_failures(*args);end
32
- def dump_failure(*args);end
33
- def dump_pending(*args);end
29
+ def dump_summary(*); end
30
+
31
+ def dump_failures(*); end
32
+
33
+ def dump_failure(*); end
34
+
35
+ def dump_pending(*); end
34
36
 
35
- def start_dump(*args)
36
- return unless ENV['TEST_ENV_NUMBER'] #only record when running in parallel
37
+ def start_dump(*)
38
+ return unless ENV['TEST_ENV_NUMBER'] # only record when running in parallel
37
39
  lock_output do
38
40
  @example_times.each do |file, time|
39
- relative_path = file.sub(/^#{Regexp.escape Dir.pwd}\//,'').sub(/^\.\//, "")
41
+ relative_path = file.sub(%r{^#{Regexp.escape Dir.pwd}/}, '').sub(%r{^\./}, "")
40
42
  @output.puts "#{relative_path}:#{time > 0 ? time : 0}"
41
43
  end
42
44
  end
@@ -1,9 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'parallel_tests/rspec/failures_logger'
2
3
 
3
4
  class ParallelTests::RSpec::SummaryLogger < ParallelTests::RSpec::LoggerBase
4
- unless RSPEC_2
5
- RSpec::Core::Formatters.register self, :dump_failures
6
- end
5
+ RSpec::Core::Formatters.register self, :dump_failures unless RSPEC_2
7
6
 
8
7
  def dump_failures(*args)
9
8
  lock_output { super }
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "parallel_tests/gherkin/runner"
2
3
 
3
4
  module ParallelTests
@@ -9,10 +10,9 @@ module ParallelTests
9
10
  end
10
11
 
11
12
  def runtime_logging
12
- #Not Yet Supported
13
+ # Not Yet Supported
13
14
  ""
14
15
  end
15
-
16
16
  end
17
17
  end
18
18
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rake'
2
3
  require 'shellwords'
3
4
 
@@ -27,12 +28,13 @@ module ParallelTests
27
28
  end
28
29
  end
29
30
 
30
- def run_in_parallel(cmd, options={})
31
+ def run_in_parallel(cmd, options = {})
31
32
  load_lib
32
33
  count = " -n #{options[:count]}" unless options[:count].to_s.empty?
33
34
  # Using the relative path to find the binary allow to run a specific version of it
34
- executable = File.expand_path("../../../bin/parallel_test", __FILE__)
35
- command = "#{ParallelTests.with_ruby_binary(Shellwords.escape(executable))} --exec '#{cmd}'#{count}#{' --non-parallel' if options[:non_parallel]}"
35
+ executable = File.expand_path('../../bin/parallel_test', __dir__)
36
+ non_parallel = (options[:non_parallel] ? ' --non-parallel' : '')
37
+ command = "#{ParallelTests.with_ruby_binary(Shellwords.escape(executable))} --exec '#{cmd}'#{count}#{non_parallel}"
36
38
  abort unless system(command)
37
39
  end
38
40
 
@@ -50,12 +52,12 @@ module ParallelTests
50
52
  # - simple system "set -o pipefail" returns nil even though set -o pipefail exists with 0
51
53
  def suppress_output(command, ignore_regex)
52
54
  activate_pipefail = "set -o pipefail"
53
- remove_ignored_lines = %Q{(grep -v "#{ignore_regex}" || test 1)}
55
+ remove_ignored_lines = %{(grep -v "#{ignore_regex}" || test 1)}
54
56
 
55
57
  if File.executable?('/bin/bash') && system('/bin/bash', '-c', "#{activate_pipefail} 2>/dev/null && test 1")
56
58
  # We need to shell escape single quotes (' becomes '"'"') because
57
59
  # run_in_parallel wraps command in single quotes
58
- %Q{/bin/bash -c '"'"'#{activate_pipefail} && (#{command}) | #{remove_ignored_lines}'"'"'}
60
+ %{/bin/bash -c '"'"'#{activate_pipefail} && (#{command}) | #{remove_ignored_lines}'"'"'}
59
61
  else
60
62
  command
61
63
  end
@@ -83,7 +85,7 @@ module ParallelTests
83
85
  # parallel:spec[2,models,options]
84
86
  # parallel:spec[,models,options]
85
87
  count = args.shift if args.first.to_s =~ /^\d*$/
86
- num_processes = count.to_i unless count.to_s.empty?
88
+ num_processes = (count.to_s.empty? ? nil : Integer(count))
87
89
  pattern = args.shift
88
90
  options = args.shift
89
91
  pass_through = args.shift
@@ -96,26 +98,28 @@ end
96
98
 
97
99
  namespace :parallel do
98
100
  desc "Setup test databases via db:setup --> parallel:setup[num_cpus]"
99
- task :setup, :count do |_,args|
101
+ task :setup, :count do |_, args|
100
102
  command = "#{ParallelTests::Tasks.rake_bin} db:setup RAILS_ENV=#{ParallelTests::Tasks.rails_env}"
101
103
  ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args)
102
104
  end
103
105
 
104
106
  desc "Create test databases via db:create --> parallel:create[num_cpus]"
105
- task :create, :count do |_,args|
107
+ task :create, :count do |_, args|
106
108
  ParallelTests::Tasks.run_in_parallel(
107
- "#{ParallelTests::Tasks.rake_bin} db:create RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
109
+ "#{ParallelTests::Tasks.rake_bin} db:create RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args
110
+ )
108
111
  end
109
112
 
110
113
  desc "Drop test databases via db:drop --> parallel:drop[num_cpus]"
111
- task :drop, :count do |_,args|
114
+ task :drop, :count do |_, args|
112
115
  ParallelTests::Tasks.run_in_parallel(
113
116
  "#{ParallelTests::Tasks.rake_bin} db:drop RAILS_ENV=#{ParallelTests::Tasks.rails_env} " \
114
- "DISABLE_DATABASE_ENVIRONMENT_CHECK=1", args)
117
+ "DISABLE_DATABASE_ENVIRONMENT_CHECK=1", args
118
+ )
115
119
  end
116
120
 
117
121
  desc "Update test databases by dumping and loading --> parallel:prepare[num_cpus]"
118
- task(:prepare, [:count]) do |_,args|
122
+ task(:prepare, [:count]) do |_, args|
119
123
  ParallelTests::Tasks.check_for_pending_migrations
120
124
  if defined?(ActiveRecord::Base) && [:ruby, :sql].include?(ActiveRecord::Base.schema_format)
121
125
  # fast: dump once, load in parallel
@@ -128,7 +132,7 @@ namespace :parallel do
128
132
  Rake::Task["parallel:load_#{type}"].invoke(args[:count])
129
133
  else
130
134
  # slow: dump and load in in serial
131
- args = args.to_hash.merge(:non_parallel => true) # normal merge returns nil
135
+ args = args.to_hash.merge(non_parallel: true) # normal merge returns nil
132
136
  task_name = Rake::Task.task_defined?('db:test:prepare') ? 'db:test:prepare' : 'app:db:test:prepare'
133
137
  ParallelTests::Tasks.run_in_parallel("#{ParallelTests::Tasks.rake_bin} #{task_name}", args)
134
138
  next
@@ -137,20 +141,22 @@ namespace :parallel do
137
141
 
138
142
  # when dumping/resetting takes too long
139
143
  desc "Update test databases via db:migrate --> parallel:migrate[num_cpus]"
140
- task :migrate, :count do |_,args|
144
+ task :migrate, :count do |_, args|
141
145
  ParallelTests::Tasks.run_in_parallel(
142
- "#{ParallelTests::Tasks.rake_bin} db:migrate RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
146
+ "#{ParallelTests::Tasks.rake_bin} db:migrate RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args
147
+ )
143
148
  end
144
149
 
145
150
  desc "Rollback test databases via db:rollback --> parallel:rollback[num_cpus]"
146
- task :rollback, :count do |_,args|
151
+ task :rollback, :count do |_, args|
147
152
  ParallelTests::Tasks.run_in_parallel(
148
- "#{ParallelTests::Tasks.rake_bin} db:rollback RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
153
+ "#{ParallelTests::Tasks.rake_bin} db:rollback RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args
154
+ )
149
155
  end
150
156
 
151
157
  # just load the schema (good for integration server <-> no development db)
152
158
  desc "Load dumped schema for test databases via db:schema:load --> parallel:load_schema[num_cpus]"
153
- task :load_schema, :count do |_,args|
159
+ task :load_schema, :count do |_, args|
154
160
  command = "#{ParallelTests::Tasks.rake_bin} #{ParallelTests::Tasks.purge_before_load} " \
155
161
  "db:schema:load RAILS_ENV=#{ParallelTests::Tasks.rails_env} DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
156
162
  ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args)
@@ -158,28 +164,31 @@ namespace :parallel do
158
164
 
159
165
  # load the structure from the structure.sql file
160
166
  desc "Load structure for test databases via db:structure:load --> parallel:load_structure[num_cpus]"
161
- task :load_structure, :count do |_,args|
167
+ task :load_structure, :count do |_, args|
162
168
  ParallelTests::Tasks.run_in_parallel(
163
169
  "#{ParallelTests::Tasks.rake_bin} #{ParallelTests::Tasks.purge_before_load} " \
164
- "db:structure:load RAILS_ENV=#{ParallelTests::Tasks.rails_env} DISABLE_DATABASE_ENVIRONMENT_CHECK=1", args)
170
+ "db:structure:load RAILS_ENV=#{ParallelTests::Tasks.rails_env} DISABLE_DATABASE_ENVIRONMENT_CHECK=1", args
171
+ )
165
172
  end
166
173
 
167
174
  desc "Load the seed data from db/seeds.rb via db:seed --> parallel:seed[num_cpus]"
168
- task :seed, :count do |_,args|
175
+ task :seed, :count do |_, args|
169
176
  ParallelTests::Tasks.run_in_parallel(
170
- "#{ParallelTests::Tasks.rake_bin} db:seed RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
177
+ "#{ParallelTests::Tasks.rake_bin} db:seed RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args
178
+ )
171
179
  end
172
180
 
173
181
  desc "Launch given rake command in parallel"
174
182
  task :rake, :command, :count do |_, args|
175
183
  ParallelTests::Tasks.run_in_parallel(
176
184
  "RAILS_ENV=#{ParallelTests::Tasks.rails_env} #{ParallelTests::Tasks.rake_bin} " \
177
- "#{args.command}", args)
185
+ "#{args.command}", args
186
+ )
178
187
  end
179
188
 
180
189
  ['test', 'spec', 'features', 'features-spinach'].each do |type|
181
190
  desc "Run #{type} in parallel with parallel:#{type}[num_cpus]"
182
- task type, [:count, :pattern, :options, :pass_through] do |t, args|
191
+ task type, [:count, :pattern, :options, :pass_through] do |_t, args|
183
192
  ParallelTests::Tasks.check_for_pending_migrations
184
193
  ParallelTests::Tasks.load_lib
185
194
 
@@ -188,12 +197,10 @@ namespace :parallel do
188
197
  'spec' => 'rspec',
189
198
  'test' => 'test',
190
199
  'features' => 'cucumber',
191
- 'features-spinach' => 'spinach',
200
+ 'features-spinach' => 'spinach'
192
201
  }[type]
193
202
 
194
- if test_framework == 'spinach'
195
- type = 'features'
196
- end
203
+ type = 'features' if test_framework == 'spinach'
197
204
  # Using the relative path to find the binary allow to run a specific version of it
198
205
  executable = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'parallel_test')
199
206
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'parallel_tests'
2
3
 
3
4
  module ParallelTests
@@ -32,7 +33,7 @@ module ParallelTests
32
33
  # --- usually used by other runners
33
34
 
34
35
  # finds all tests and partitions them into groups
35
- def tests_in_groups(tests, num_groups, options={})
36
+ def tests_in_groups(tests, num_groups, options = {})
36
37
  tests = tests_with_size(tests, options)
37
38
  Grouper.in_even_groups_by_size(tests, num_groups, options)
38
39
  end
@@ -46,10 +47,17 @@ module ParallelTests
46
47
  when :filesize
47
48
  sort_by_filesize(tests)
48
49
  when :runtime
49
- sort_by_runtime(tests, runtimes(tests, options), options.merge(allowed_missing: (options[:allowed_missing_percent] || 50) / 100.0))
50
+ sort_by_runtime(
51
+ tests, runtimes(tests, options),
52
+ options.merge(allowed_missing: (options[:allowed_missing_percent] || 50) / 100.0)
53
+ )
50
54
  when nil
51
55
  # use recorded test runtime if we got enough data
52
- runtimes = runtimes(tests, options) rescue []
56
+ runtimes = begin
57
+ runtimes(tests, options)
58
+ rescue StandardError
59
+ []
60
+ end
53
61
  if runtimes.size * 1.5 > tests.size
54
62
  puts "Using recorded test runtime"
55
63
  sort_by_runtime(tests, runtimes)
@@ -67,7 +75,7 @@ module ParallelTests
67
75
  env = (options[:env] || {}).merge(
68
76
  "TEST_ENV_NUMBER" => test_env_number(process_number, options).to_s,
69
77
  "PARALLEL_TEST_GROUPS" => num_processes.to_s,
70
- "PARALLEL_PID_FILE" => ParallelTests.pid_file_path,
78
+ "PARALLEL_PID_FILE" => ParallelTests.pid_file_path
71
79
  )
72
80
  cmd = "nice #{cmd}" if options[:nice]
73
81
  cmd = "#{cmd} 2>&1" if options[:combine_stderr]
@@ -86,13 +94,11 @@ module ParallelTests
86
94
  end
87
95
  ParallelTests.pids.delete(pid) if pid
88
96
  exitstatus = $?.exitstatus
89
- seed = output[/seed (\d+)/,1]
97
+ seed = output[/seed (\d+)/, 1]
90
98
 
91
- if report_process_command?(options) && options[:serialize_stdout]
92
- output = [cmd, output].join("\n")
93
- end
99
+ output = [cmd, output].join("\n") if report_process_command?(options) && options[:serialize_stdout]
94
100
 
95
- {:stdout => output, :exit_status => exitstatus, :command => cmd, :seed => seed}
101
+ { stdout: output, exit_status: exitstatus, command: cmd, seed: seed }
96
102
  end
97
103
 
98
104
  def find_results(test_output)
@@ -104,7 +110,7 @@ module ParallelTests
104
110
  end.compact
105
111
  end
106
112
 
107
- def test_env_number(process_number, options={})
113
+ def test_env_number(process_number, options = {})
108
114
  if process_number == 0 && !options[:first_is_1]
109
115
  ''
110
116
  else
@@ -114,7 +120,7 @@ module ParallelTests
114
120
 
115
121
  def summarize_results(results)
116
122
  sums = sum_up_results(results)
117
- sums.sort.map{|word, number| "#{number} #{word}#{'s' if number != 1}" }.join(', ')
123
+ sums.sort.map { |word, number| "#{number} #{word}#{'s' if number != 1}" }.join(', ')
118
124
  end
119
125
 
120
126
  # remove old seed and add new seed
@@ -134,19 +140,18 @@ module ParallelTests
134
140
  end
135
141
 
136
142
  def sum_up_results(results)
137
- results = results.join(' ').gsub(/s\b/,'') # combine and singularize results
143
+ results = results.join(' ').gsub(/s\b/, '') # combine and singularize results
138
144
  counts = results.scan(/(\d+) (\w+)/)
139
- counts.inject(Hash.new(0)) do |sum, (number, word)|
145
+ counts.each_with_object(Hash.new(0)) do |(number, word), sum|
140
146
  sum[word] += number.to_i
141
- sum
142
147
  end
143
148
  end
144
149
 
145
150
  # read output of the process and print it in chunks
146
- def capture_output(out, env, options={})
147
- result = ""
148
- loop do
149
- begin
151
+ def capture_output(out, env, options = {})
152
+ result = +""
153
+ begin
154
+ loop do
150
155
  read = out.readpartial(1000000) # read whatever chunk we can get
151
156
  if Encoding.default_internal
152
157
  read = read.force_encoding(Encoding.default_internal)
@@ -159,11 +164,13 @@ module ParallelTests
159
164
  $stdout.flush
160
165
  end
161
166
  end
162
- end rescue EOFError
167
+ rescue EOFError
168
+ nil
169
+ end
163
170
  result
164
171
  end
165
172
 
166
- def sort_by_runtime(tests, runtimes, options={})
173
+ def sort_by_runtime(tests, runtimes, options = {})
167
174
  allowed_missing = options[:allowed_missing] || 1.0
168
175
  allowed_missing = tests.size * allowed_missing
169
176
 
@@ -178,9 +185,7 @@ module ParallelTests
178
185
  [test, time]
179
186
  end
180
187
 
181
- if options[:verbose]
182
- puts "Runtime found for #{tests.count(&:last)} of #{tests.size} tests"
183
- end
188
+ puts "Runtime found for #{tests.count(&:last)} of #{tests.size} tests" if options[:verbose]
184
189
 
185
190
  set_unknown_runtime tests, options
186
191
  end
@@ -190,7 +195,7 @@ module ParallelTests
190
195
  lines = File.read(log).split("\n")
191
196
  lines.each_with_object({}) do |line, times|
192
197
  test, _, time = line.rpartition(':')
193
- next unless test and time
198
+ next unless test && time
194
199
  times[test] = time.to_f if tests.include?(test)
195
200
  end
196
201
  end
@@ -217,7 +222,7 @@ module ParallelTests
217
222
  end.uniq
218
223
  end
219
224
 
220
- def files_in_folder(folder, options={})
225
+ def files_in_folder(folder, options = {})
221
226
  pattern = if options[:symlinks] == false # not nil or true
222
227
  "**/*"
223
228
  else
@@ -225,7 +230,7 @@ module ParallelTests
225
230
  # http://stackoverflow.com/questions/357754/can-i-traverse-symlinked-directories-in-ruby-with-a-glob
226
231
  "**{,/*/**}/*"
227
232
  end
228
- Dir[File.join(folder, pattern)].uniq
233
+ Dir[File.join(folder, pattern)].uniq.sort
229
234
  end
230
235
 
231
236
  private
@@ -236,7 +241,7 @@ module ParallelTests
236
241
  known, unknown = tests.partition(&:last)
237
242
  return if unknown.empty?
238
243
  unknown_runtime = options[:unknown_runtime] ||
239
- (known.empty? ? 1 : known.map!(&:last).inject(:+) / known.size) # average
244
+ (known.empty? ? 1 : known.map!(&:last).sum / known.size) # average
240
245
  unknown.each { |set| set[1] = unknown_runtime }
241
246
  end
242
247
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'parallel_tests'
2
3
  require 'parallel_tests/test/runner'
3
4
 
@@ -22,7 +23,7 @@ module ParallelTests
22
23
  separator = "\n"
23
24
  groups = logfile.read.split(separator).map { |line| line.split(":") }.group_by(&:first)
24
25
  lines = groups.map do |file, times|
25
- time = "%.2f" % times.map(&:last).map(&:to_f).inject(:+)
26
+ time = "%.2f" % times.map(&:last).map(&:to_f).sum
26
27
  "#{file}:#{time}"
27
28
  end
28
29
  logfile.rewind
@@ -34,7 +35,7 @@ module ParallelTests
34
35
  private
35
36
 
36
37
  def with_locked_log
37
- File.open(logfile, File::RDWR|File::CREAT) do |logfile|
38
+ File.open(logfile, File::RDWR | File::CREAT) do |logfile|
38
39
  logfile.flock(File::LOCK_EX)
39
40
  yield logfile
40
41
  end
@@ -59,7 +60,7 @@ module ParallelTests
59
60
  end
60
61
 
61
62
  def message(test, delta)
62
- return unless method = test.public_instance_methods(true).detect { |method| method =~ /^test_/ }
63
+ return unless method = test.public_instance_methods(true).detect { |m| m =~ /^test_/ }
63
64
  filename = test.instance_method(method).source_location.first.sub("#{Dir.pwd}/", "")
64
65
  "#{filename}:#{delta}"
65
66
  end
@@ -74,22 +75,26 @@ end
74
75
 
75
76
  if defined?(Minitest::Runnable) # Minitest 5
76
77
  class << Minitest::Runnable
77
- prepend(Module.new do
78
- def run(*)
79
- ParallelTests::Test::RuntimeLogger.log_test_run(self) do
80
- super
78
+ prepend(
79
+ Module.new do
80
+ def run(*)
81
+ ParallelTests::Test::RuntimeLogger.log_test_run(self) do
82
+ super
83
+ end
81
84
  end
82
85
  end
83
- end)
86
+ )
84
87
  end
85
88
 
86
89
  class << Minitest
87
- prepend(Module.new do
88
- def run(*args)
89
- result = super
90
- ParallelTests::Test::RuntimeLogger.unique_log
91
- result
90
+ prepend(
91
+ Module.new do
92
+ def run(*args)
93
+ result = super
94
+ ParallelTests::Test::RuntimeLogger.unique_log
95
+ result
96
+ end
92
97
  end
93
- end)
98
+ )
94
99
  end
95
100
  end