Copy the forking isolated test runner from railties

All the tests have a substantial chunk of identical setup effort (in
cases/helper.rb); this makes isolated tests run much faster, without any
change to the variety of how we load files.
This commit is contained in:
Matthew Draper 2019-03-01 02:14:50 +10:30
parent 0c5486aa4d
commit af986325e9
1 changed files with 38 additions and 2 deletions

View File

@ -66,8 +66,28 @@ end
adapter_short = adapter == "db2" ? adapter : adapter[/^[a-z0-9]+/]
puts [adapter, adapter_short].inspect
dash_i = [
"test",
"lib",
"../activesupport/lib",
"../activemodel/lib"
].map { |dir| File.expand_path(dir, __dir__) }
dash_i.reverse_each do |x|
$:.unshift(x) unless $:.include?(x)
end
$-w = true
require "bundler/setup" unless defined?(Bundler)
# Every test file loads this first, so doing it post-fork gains
# us nothing.
require "cases/helper"
failing_files = []
test_options = ENV["TESTOPTS"].to_s.split(/[\s]+/)
test_files = (Dir["test/cases/**/*_test.rb"].reject {
|x| x.include?("/adapters/")
} + Dir["test/cases/adapters/#{adapter_short}/**/*_test.rb"]).sort
@ -81,8 +101,24 @@ end
test_files.each do |file|
puts "--- #{file}"
success = sh(Gem.ruby, "-w", "-Itest", file)
unless success
fake_command = Shellwords.join([
FileUtils::RUBY,
"-w",
*dash_i.map { |dir| "-I#{Pathname.new(dir).relative_path_from(Pathname.pwd)}" },
file,
])
puts fake_command
# We could run these in parallel, but pretty much all of the
# railties tests already run in parallel, so ¯\_(⊙︿⊙)_/¯
Process.waitpid fork {
ARGV.clear.concat test_options
Rake.application = nil
load file
}
unless $?.success?
failing_files << file
puts "^^^ +++"
end