module Minitest

Attributes

parallel_fork_stat_reporter[R]

Public Class Methods

__run(reporter, options) click to toggle source

Override __run to use a child forks to run the speeds, which allows for parallel spec execution on MRI.

    # File lib/minitest/parallel_fork.rb
128 def __run(reporter, options)
129   parallel_fork_wait_for_children(parallel_fork_setup_children(parallel_fork_suites, reporter, options), reporter)
130   nil
131 end
Also aliased as: __run
after_parallel_fork(i=nil, &block) click to toggle source

Set the after_parallel_fork block to the given block

   # File lib/minitest/parallel_fork.rb
20 def after_parallel_fork(i=nil, &block)
21   @after_parallel_fork = block
22 end
before_parallel_fork(&block) click to toggle source

Set the before_parallel_fork block to the given block

   # File lib/minitest/parallel_fork.rb
15 def before_parallel_fork(&block)
16   @before_parallel_fork = block
17 end
on_parallel_fork_marshal_failure(&block) click to toggle source

Set the on_parallel_fork_marshal_failure block to the given block

   # File lib/minitest/parallel_fork.rb
25 def on_parallel_fork_marshal_failure(&block)
26   @on_parallel_fork_marshal_failure = block
27 end
parallel_fork_child_data(data) click to toggle source
    # File lib/minitest/parallel_fork.rb
103 def parallel_fork_child_data(data)
104   data.map{|_pid, read| Thread.new(read, &:read)}.map(&:value).map{|data| parallel_fork_data_from_marshal(data)}
105 end
parallel_fork_data_from_marshal(data) click to toggle source
   # File lib/minitest/parallel_fork.rb
57 def parallel_fork_data_from_marshal(data)
58   Marshal.load(data)
59 rescue ArgumentError
60   if @on_parallel_fork_marshal_failure
61     @on_parallel_fork_marshal_failure.call
62   end
63   raise
64 end
parallel_fork_data_to_marshal() click to toggle source
   # File lib/minitest/parallel_fork.rb
53 def parallel_fork_data_to_marshal
54   %i'count assertions results'.map{|meth| parallel_fork_stat_reporter.send(meth)}
55 end
parallel_fork_number() click to toggle source
    # File lib/minitest/parallel_fork.rb
119 def parallel_fork_number
120   (ENV['NCPU'] || 4).to_i
121 end
parallel_fork_run_test_suite(suite, reporter, options) click to toggle source
   # File lib/minitest/parallel_fork.rb
72 def parallel_fork_run_test_suite(suite, reporter, options)
73   if suite.is_a?(Minitest::Parallel::Test::ClassMethods)
74     suite.extend(Minitest::Unparallelize)
75   end
76 
77   suite.run(reporter, options)
78 end
parallel_fork_run_test_suites(suites, reporter, options) click to toggle source
   # File lib/minitest/parallel_fork.rb
66 def parallel_fork_run_test_suites(suites, reporter, options)
67   suites.each do |suite|
68     parallel_fork_run_test_suite(suite, reporter, options)
69   end
70 end
parallel_fork_setup_children(suites, reporter, options) click to toggle source
    # File lib/minitest/parallel_fork.rb
 80 def parallel_fork_setup_children(suites, reporter, options)
 81   set_parallel_fork_stat_reporter(reporter)
 82   run_before_parallel_fork_hook
 83 
 84   n = parallel_fork_number
 85   n.times.map do |i|
 86     read, write = IO.pipe.each{|io| io.binmode}
 87     pid = Process.fork do
 88       read.close
 89       run_after_parallel_fork_hook(i)
 90 
 91       p_suites = []
 92       suites.each_with_index{|s, j| p_suites << s if j % n == i}
 93       parallel_fork_run_test_suites(p_suites, reporter, options)
 94 
 95       write.write(Marshal.dump(parallel_fork_data_to_marshal))
 96       write.close
 97     end
 98     write.close
 99     [pid, read]
100   end
101 end
parallel_fork_suites() click to toggle source
   # File lib/minitest/parallel_fork.rb
37 def parallel_fork_suites
38   Minitest::Runnable.runnables.shuffle
39 end
parallel_fork_wait_for_children(child_info, reporter) click to toggle source
    # File lib/minitest/parallel_fork.rb
107 def parallel_fork_wait_for_children(child_info, reporter)
108   parallel_fork_child_data(child_info).each do |data|
109     count, assertions, results = data
110     reporter.reporters.each do |rep|
111       next unless %i'count assertions results count= assertions='.all?{|meth| rep.respond_to?(meth)}
112       rep.count += count
113       rep.assertions += assertions
114       rep.results.concat(results)
115     end
116   end
117 end
run_after_parallel_fork_hook(i) click to toggle source
   # File lib/minitest/parallel_fork.rb
47 def run_after_parallel_fork_hook(i)
48   if @after_parallel_fork
49     @after_parallel_fork.call(i)
50   end
51 end
run_before_parallel_fork_hook() click to toggle source
   # File lib/minitest/parallel_fork.rb
41 def run_before_parallel_fork_hook
42   if @before_parallel_fork
43     @before_parallel_fork.call
44   end
45 end
set_parallel_fork_stat_reporter(reporter) click to toggle source
   # File lib/minitest/parallel_fork.rb
31 def set_parallel_fork_stat_reporter(reporter)
32   @parallel_fork_stat_reporter = reporter.reporters.detect do |rep|
33     %w'count assertions results count= assertions='.all?{|meth| rep.respond_to?(meth)}
34   end
35 end