[EXPERIMENTAL] run actionpack tests in parallel

only on forking systems though.  Feel free to revert this if it causes
problems.
This commit is contained in:
Aaron Patterson 2014-07-17 12:08:41 -07:00
parent 932386be8a
commit c64bff2c87

@ -15,6 +15,10 @@
Encoding.default_external = "UTF-8"
end
require 'drb'
require 'drb/unix'
require 'tempfile'
require 'active_support/testing/autorun'
require 'abstract_controller'
require 'action_controller'
@ -105,6 +109,7 @@ def before_setup
module ActiveSupport
class TestCase
include ActionDispatch::DrawOnce
parallelize_me!
end
end
@ -432,3 +437,55 @@ def rubinius_skip(message = '')
def jruby_skip(message = '')
skip message if defined?(JRUBY_VERSION)
end
class ForkingExecutor
class Server
include DRb::DRbUndumped
def initialize
@queue = Queue.new
end
def record reporter, result
reporter.synchronize { reporter.record result }
end
def << o; @queue << o; end
def pop; @queue.pop; end
end
def initialize size
@size = size
@queue = Server.new
file = File.join Dir.tmpdir, Dir::Tmpname.make_tmpname('tests', 'fd')
@url = "drbunix://#{file}"
@pool = nil
DRb.start_service @url, @queue
end
def << work; @queue << work; end
def shutdown
pool = @size.times.map {
fork {
DRb.stop_service
DRb.start_service
queue = DRbObject.new_with_uri @url
while job = queue.pop
klass = job[0]
method = job[1]
reporter = job[2]
result = Minitest.run_one_method klass, method
queue.record reporter, result
end
}
}
@size.times { @queue << nil }
pool.each { |pid| Process.waitpid pid }
end
end
if ActiveSupport::Testing::Isolation.forking_env?
# Use N processes (N defaults to 4)
Minitest.parallel_executor = ForkingExecutor.new((ENV['N'] || 4).to_i)
end