[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:
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
|
||||
|
Loading…
Reference in New Issue
Block a user