minitest 5.26.1 → 6.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +138 -0
- data/Manifest.txt +13 -4
- data/README.rdoc +14 -98
- data/Rakefile +10 -1
- data/bin/minitest +5 -0
- data/lib/hoe/minitest.rb +2 -1
- data/lib/minitest/assertions.rb +44 -73
- data/lib/minitest/autorun.rb +3 -4
- data/lib/minitest/benchmark.rb +3 -3
- data/lib/minitest/bisect.rb +304 -0
- data/lib/minitest/complete.rb +56 -0
- data/lib/minitest/find_minimal_combination.rb +127 -0
- data/lib/minitest/hell.rb +1 -1
- data/lib/minitest/manual_plugins.rb +4 -16
- data/lib/minitest/parallel.rb +3 -3
- data/lib/minitest/path_expander.rb +432 -0
- data/lib/minitest/pride.rb +2 -2
- data/lib/minitest/pride_plugin.rb +1 -1
- data/lib/minitest/server.rb +49 -0
- data/lib/minitest/server_plugin.rb +88 -0
- data/lib/minitest/spec.rb +5 -33
- data/lib/minitest/sprint.rb +105 -0
- data/lib/minitest/sprint_plugin.rb +39 -0
- data/lib/minitest/test.rb +7 -13
- data/lib/minitest/test_task.rb +18 -16
- data/lib/minitest.rb +88 -94
- data/test/minitest/metametameta.rb +1 -1
- data/test/minitest/test_bisect.rb +249 -0
- data/test/minitest/test_find_minimal_combination.rb +138 -0
- data/test/minitest/test_minitest_assertions.rb +111 -102
- data/test/minitest/test_minitest_benchmark.rb +14 -0
- data/test/minitest/test_minitest_reporter.rb +6 -5
- data/test/minitest/test_minitest_spec.rb +51 -117
- data/test/minitest/test_minitest_test.rb +21 -100
- data/test/minitest/test_path_expander.rb +229 -0
- data/test/minitest/test_server.rb +146 -0
- data.tar.gz.sig +0 -0
- metadata +90 -28
- metadata.gz.sig +0 -0
- data/.autotest +0 -34
- data/lib/minitest/mock.rb +0 -347
- data/lib/minitest/unit.rb +0 -42
- data/test/minitest/test_minitest_mock.rb +0 -1218
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
$LOAD_PATH.unshift "test", "lib"
|
|
2
|
+
|
|
3
|
+
require "simplecov" if ENV["MT_COV"] || ARGV.delete("--simplecov")
|
|
4
|
+
require_relative "autorun"
|
|
5
|
+
require_relative "path_expander"
|
|
6
|
+
|
|
7
|
+
module Minitest
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Runs (Get it? It's fast!) your tests and makes it easier to rerun
|
|
11
|
+
# individual failures.
|
|
12
|
+
|
|
13
|
+
class Sprint
|
|
14
|
+
# extracted version = "1.5.0"
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# Process and run minitest cmdline.
|
|
18
|
+
|
|
19
|
+
def self.run args = ARGV
|
|
20
|
+
if args.delete("--bisect") or args.delete("-b") then
|
|
21
|
+
require_relative "bisect"
|
|
22
|
+
|
|
23
|
+
return Minitest::Bisect.run ARGV
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Minitest::PathExpander.new(args).process { |f|
|
|
27
|
+
require "./#{f}" if File.file? f
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# An extra minitest reporter to output how to rerun failures in
|
|
33
|
+
# various styles.
|
|
34
|
+
|
|
35
|
+
class SprintReporter < AbstractReporter
|
|
36
|
+
##
|
|
37
|
+
# The style to report, either lines or regexp. Defaults to lines.
|
|
38
|
+
attr_accessor :style
|
|
39
|
+
attr_accessor :results # :nodoc:
|
|
40
|
+
|
|
41
|
+
def initialize style = :regexp # :nodoc:
|
|
42
|
+
self.results = []
|
|
43
|
+
self.style = style
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def record result # :nodoc:
|
|
47
|
+
results << result unless result.passed? or result.skipped?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def report # :nodoc:
|
|
51
|
+
return if results.empty?
|
|
52
|
+
|
|
53
|
+
puts
|
|
54
|
+
puts "Happy Happy Sprint List:"
|
|
55
|
+
puts
|
|
56
|
+
print_list
|
|
57
|
+
puts
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def print_list # :nodoc:
|
|
61
|
+
case style
|
|
62
|
+
when :regexp
|
|
63
|
+
results.each do |result|
|
|
64
|
+
puts " minitest -n #{result.class_name}##{result.name}"
|
|
65
|
+
end
|
|
66
|
+
when :lines
|
|
67
|
+
files = Hash.new { |h,k| h[k] = [] }
|
|
68
|
+
results.each do |result|
|
|
69
|
+
path, line = result.source_location
|
|
70
|
+
path = path.delete_prefix "#{Dir.pwd}/"
|
|
71
|
+
files[path] << line
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
files.sort.each do |path, lines|
|
|
75
|
+
puts " minitest %s:%s" % [path, lines.sort.join(",")]
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
raise "unsupported style: %p" % [style]
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# An extra minitest reporter to output how to rerun failures using
|
|
85
|
+
# rake.
|
|
86
|
+
|
|
87
|
+
class RakeReporter < SprintReporter
|
|
88
|
+
##
|
|
89
|
+
# The name of the rake task to rerun. Defaults to nil.
|
|
90
|
+
|
|
91
|
+
attr_accessor :name
|
|
92
|
+
|
|
93
|
+
def initialize name = nil # :nodoc:
|
|
94
|
+
super()
|
|
95
|
+
self.name = name
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def print_list # :nodoc:
|
|
99
|
+
results.each do |result|
|
|
100
|
+
puts [" rake", name, "N=#{result.class_name}##{result.name}"].compact.join(" ")
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative "../minitest"
|
|
2
|
+
|
|
3
|
+
# :stopdoc:
|
|
4
|
+
class OptionParser # unofficial embedded gem "makeoptparseworkwell"
|
|
5
|
+
def hidden(...) = define(...).tap { |sw| def sw.summarize(*) = nil }
|
|
6
|
+
def deprecate(from, to) = hidden(from) { abort "#{from} is deprecated. Use #{to}." }
|
|
7
|
+
def topdict(name) = name.length > 1 ? top.long : top.short
|
|
8
|
+
def alias(from, to) = (dict = topdict(from) and dict[to] = dict[from])
|
|
9
|
+
end unless OptionParser.method_defined? :hidden
|
|
10
|
+
# :startdoc:
|
|
11
|
+
|
|
12
|
+
module Minitest # :nodoc:
|
|
13
|
+
def self.plugin_sprint_options opts, options # :nodoc:
|
|
14
|
+
opts.on "--rake [TASK]", "Report how to re-run failures with rake." do |task|
|
|
15
|
+
options[:sprint] = :rake
|
|
16
|
+
options[:rake_task] = task
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
opts.deprecate "--binstub", "--rerun"
|
|
20
|
+
|
|
21
|
+
sprint_styles = %w[rake lines names binstub]
|
|
22
|
+
|
|
23
|
+
opts.on "-r", "--rerun [STYLE]", sprint_styles, "Report how to re-run failures using STYLE (names, lines)." do |style|
|
|
24
|
+
options[:sprint] = (style || :lines).to_sym
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.plugin_sprint_init options
|
|
29
|
+
require_relative "sprint"
|
|
30
|
+
case options[:sprint]
|
|
31
|
+
when :rake then
|
|
32
|
+
self.reporter << Minitest::Sprint::RakeReporter.new(options[:rake_task])
|
|
33
|
+
when :binstub, :names then
|
|
34
|
+
self.reporter << Minitest::Sprint::SprintReporter.new
|
|
35
|
+
when :lines then
|
|
36
|
+
self.reporter << Minitest::Sprint::SprintReporter.new(:lines)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
data/lib/minitest/test.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../minitest" unless defined? Minitest::Runnable
|
|
2
2
|
|
|
3
3
|
module Minitest
|
|
4
4
|
##
|
|
@@ -8,14 +8,10 @@ module Minitest
|
|
|
8
8
|
# See Minitest::Assertions
|
|
9
9
|
|
|
10
10
|
class Test < Runnable
|
|
11
|
-
|
|
11
|
+
require_relative "assertions"
|
|
12
12
|
include Minitest::Reportable
|
|
13
13
|
include Minitest::Assertions
|
|
14
14
|
|
|
15
|
-
def class_name # :nodoc:
|
|
16
|
-
self.class.name # for Minitest::Reportable
|
|
17
|
-
end
|
|
18
|
-
|
|
19
15
|
PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException, SystemExit] # :nodoc:
|
|
20
16
|
|
|
21
17
|
SETUP_METHODS = %w[ before_setup setup after_setup ] # :nodoc:
|
|
@@ -34,8 +30,8 @@ module Minitest
|
|
|
34
30
|
|
|
35
31
|
def self.i_suck_and_my_tests_are_order_dependent!
|
|
36
32
|
class << self
|
|
37
|
-
undef_method :
|
|
38
|
-
define_method :
|
|
33
|
+
undef_method :run_order if method_defined? :run_order
|
|
34
|
+
define_method :run_order do :alpha end
|
|
39
35
|
end
|
|
40
36
|
end
|
|
41
37
|
|
|
@@ -65,20 +61,20 @@ module Minitest
|
|
|
65
61
|
|
|
66
62
|
##
|
|
67
63
|
# Returns all instance methods starting with "test_". Based on
|
|
68
|
-
# #
|
|
64
|
+
# #run_order, the methods are either sorted, randomized
|
|
69
65
|
# (default), or run in parallel.
|
|
70
66
|
|
|
71
67
|
def self.runnable_methods
|
|
72
68
|
methods = methods_matching(/^test_/)
|
|
73
69
|
|
|
74
|
-
case self.
|
|
70
|
+
case self.run_order
|
|
75
71
|
when :random, :parallel then
|
|
76
72
|
srand Minitest.seed
|
|
77
73
|
methods.sort.shuffle
|
|
78
74
|
when :alpha, :sorted then
|
|
79
75
|
methods.sort
|
|
80
76
|
else
|
|
81
|
-
raise "
|
|
77
|
+
raise "Unknown_order: %p" % [self.run_order]
|
|
82
78
|
end
|
|
83
79
|
end
|
|
84
80
|
|
|
@@ -234,5 +230,3 @@ module Minitest
|
|
|
234
230
|
extend Guard
|
|
235
231
|
end # Test
|
|
236
232
|
end
|
|
237
|
-
|
|
238
|
-
require "minitest/unit" if ENV["MT_COMPAT"] # compatibility layer only
|
data/lib/minitest/test_task.rb
CHANGED
|
@@ -168,20 +168,18 @@ module Minitest # :nodoc:
|
|
|
168
168
|
ENV["TESTOPTS"]
|
|
169
169
|
warn "FILTER is deprecated in Minitest::TestTask. Use A instead" if
|
|
170
170
|
ENV["FILTER"]
|
|
171
|
-
warn "N is deprecated in Minitest::TestTask. Use MT_CPU instead" if
|
|
172
|
-
ENV["N"] && ENV["N"].to_i > 0
|
|
173
171
|
|
|
174
172
|
lib_extras = (ENV["MT_LIB_EXTRAS"] || "").split File::PATH_SEPARATOR
|
|
175
173
|
self.libs[0, 0] = lib_extras
|
|
176
174
|
|
|
177
|
-
extra_args << "-
|
|
178
|
-
extra_args << "-
|
|
175
|
+
extra_args << "-i" << ENV["N"] if ENV["N"]
|
|
176
|
+
extra_args << "-i" << ENV["I"] if ENV["I"]
|
|
177
|
+
extra_args << "-x" << ENV["X"] if ENV["X"]
|
|
178
|
+
extra_args << "-x" << ENV["E"] if ENV["E"]
|
|
179
179
|
extra_args.concat Shellwords.split(ENV["TESTOPTS"]) if ENV["TESTOPTS"]
|
|
180
180
|
extra_args.concat Shellwords.split(ENV["FILTER"]) if ENV["FILTER"]
|
|
181
181
|
extra_args.concat Shellwords.split(ENV["A"]) if ENV["A"]
|
|
182
182
|
|
|
183
|
-
ENV.delete "N" if ENV["N"]
|
|
184
|
-
|
|
185
183
|
# TODO? RUBY_DEBUG = ENV["RUBY_DEBUG"]
|
|
186
184
|
# TODO? ENV["RUBY_FLAGS"]
|
|
187
185
|
|
|
@@ -189,11 +187,16 @@ module Minitest # :nodoc:
|
|
|
189
187
|
end
|
|
190
188
|
|
|
191
189
|
def define # :nodoc:
|
|
192
|
-
desc "Run the test suite. Use
|
|
190
|
+
desc "Run the test suite. Use I, X, and A to add flags/args."
|
|
193
191
|
task name do
|
|
194
192
|
ruby make_test_cmd, verbose: verbose
|
|
195
193
|
end
|
|
196
194
|
|
|
195
|
+
desc "Run the test suite, filtering for 'FU' in name (focused units?)."
|
|
196
|
+
task "#{name}:fu" do
|
|
197
|
+
ruby make_test_cmd(include:"/FU/"), verbose: verbose
|
|
198
|
+
end
|
|
199
|
+
|
|
197
200
|
desc "Print out the test command. Good for profiling and other tools."
|
|
198
201
|
task "#{name}:cmd" do
|
|
199
202
|
puts "ruby #{make_test_cmd}"
|
|
@@ -212,7 +215,7 @@ module Minitest # :nodoc:
|
|
|
212
215
|
|
|
213
216
|
n.threads_do tests.sort do |path|
|
|
214
217
|
t0 = Time.now
|
|
215
|
-
output = `#{Gem.ruby} #{make_test_cmd path} 2>&1`
|
|
218
|
+
output = `#{Gem.ruby} #{make_test_cmd path:path} 2>&1`
|
|
216
219
|
t1 = Time.now - t0
|
|
217
220
|
|
|
218
221
|
times[path] = t1
|
|
@@ -278,7 +281,9 @@ module Minitest # :nodoc:
|
|
|
278
281
|
##
|
|
279
282
|
# Generate the test command-line.
|
|
280
283
|
|
|
281
|
-
def make_test_cmd
|
|
284
|
+
def make_test_cmd **option
|
|
285
|
+
globs = option[:path] || test_globs
|
|
286
|
+
|
|
282
287
|
tests = []
|
|
283
288
|
tests.concat Dir[*globs].sort.shuffle # TODO: SEED -> srand first?
|
|
284
289
|
tests.map! { |f| %(require "#{f}") }
|
|
@@ -289,6 +294,8 @@ module Minitest # :nodoc:
|
|
|
289
294
|
runner.concat tests
|
|
290
295
|
runner = runner.join "; "
|
|
291
296
|
|
|
297
|
+
extra_args << "-i" << option[:include] if option[:include]
|
|
298
|
+
|
|
292
299
|
args = []
|
|
293
300
|
args << "-I#{libs.join File::PATH_SEPARATOR}" unless libs.empty?
|
|
294
301
|
args << "-w" if warning
|
|
@@ -303,13 +310,8 @@ module Minitest # :nodoc:
|
|
|
303
310
|
end
|
|
304
311
|
|
|
305
312
|
class Work < Queue # :nodoc:
|
|
306
|
-
def initialize jobs
|
|
307
|
-
super
|
|
308
|
-
|
|
309
|
-
jobs.each do |job|
|
|
310
|
-
self << job
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
+
def initialize jobs # :nodoc:
|
|
314
|
+
super
|
|
313
315
|
close
|
|
314
316
|
end
|
|
315
317
|
end
|
data/lib/minitest.rb
CHANGED
|
@@ -10,7 +10,7 @@ require_relative "minitest/compress"
|
|
|
10
10
|
# runtime. See +Minitest.run+ for more information.
|
|
11
11
|
|
|
12
12
|
module Minitest
|
|
13
|
-
VERSION = "
|
|
13
|
+
VERSION = "6.0.6" # :nodoc:
|
|
14
14
|
|
|
15
15
|
@@installed_at_exit ||= false
|
|
16
16
|
@@after_run = []
|
|
@@ -33,8 +33,7 @@ module Minitest
|
|
|
33
33
|
|
|
34
34
|
cattr_accessor :parallel_executor
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
n_threads = (ENV["MT_CPU"] || ENV["N"] || Etc.nprocessors).to_i
|
|
36
|
+
n_threads = (ENV["MT_CPU"] || Etc.nprocessors).to_i
|
|
38
37
|
|
|
39
38
|
self.parallel_executor = Parallel::Executor.new n_threads if n_threads > 1
|
|
40
39
|
|
|
@@ -68,8 +67,7 @@ module Minitest
|
|
|
68
67
|
# Registers Minitest to run at process exit
|
|
69
68
|
|
|
70
69
|
def self.autorun
|
|
71
|
-
Warning[:deprecated] = true
|
|
72
|
-
Object.const_defined?(:Warning) && Warning.respond_to?(:[]=)
|
|
70
|
+
Warning[:deprecated] = true
|
|
73
71
|
|
|
74
72
|
at_exit {
|
|
75
73
|
next if $! and not ($!.kind_of? SystemExit and $!.success?)
|
|
@@ -98,6 +96,17 @@ module Minitest
|
|
|
98
96
|
@@after_run << block
|
|
99
97
|
end
|
|
100
98
|
|
|
99
|
+
##
|
|
100
|
+
# Manually load plugins by name.
|
|
101
|
+
|
|
102
|
+
def self.load *names
|
|
103
|
+
names.each do |name|
|
|
104
|
+
require "minitest/#{name}_plugin"
|
|
105
|
+
|
|
106
|
+
self.extensions << name.to_s
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
101
110
|
##
|
|
102
111
|
# Register a plugin to be used. Does NOT require / load it.
|
|
103
112
|
|
|
@@ -146,27 +155,38 @@ module Minitest
|
|
|
146
155
|
}
|
|
147
156
|
orig_args = args.dup
|
|
148
157
|
|
|
158
|
+
warn "--no-plugins is a no-op" if args.delete "--no-plugins" # TODO: remove me! when?
|
|
159
|
+
|
|
149
160
|
OptionParser.new do |opts|
|
|
150
|
-
opts.
|
|
161
|
+
opts.program_name = "minitest"
|
|
151
162
|
opts.version = Minitest::VERSION
|
|
152
163
|
|
|
164
|
+
opts.banner = [
|
|
165
|
+
"Usage: minitest [paths] [options]",
|
|
166
|
+
"ruby path/to/test.rb [options]",
|
|
167
|
+
"rake test [A=options] (see Minitest::TestTask for more options)\n\n",
|
|
168
|
+
].join "\n or: "
|
|
169
|
+
|
|
153
170
|
opts.on "-h", "--help", "Display this help." do
|
|
154
171
|
puts opts
|
|
155
|
-
exit
|
|
172
|
+
exit! true
|
|
156
173
|
end
|
|
157
174
|
|
|
158
|
-
opts.on "
|
|
175
|
+
opts.on "-V", "--version", "Display the version." do
|
|
176
|
+
puts "#{opts.program_name} #{Minitest::VERSION}"
|
|
177
|
+
exit! true
|
|
178
|
+
end
|
|
159
179
|
|
|
160
|
-
desc = "Sets random seed. Also via env
|
|
180
|
+
desc = "Sets random seed. Also via env, eg: SEED=42"
|
|
161
181
|
opts.on "-s", "--seed SEED", Integer, desc do |m|
|
|
162
|
-
options[:seed] = m
|
|
182
|
+
options[:seed] = m
|
|
163
183
|
end
|
|
164
184
|
|
|
165
|
-
opts.on "-v", "--verbose", "Verbose.
|
|
185
|
+
opts.on "-v", "--verbose", "Verbose. Print each name as they run." do
|
|
166
186
|
options[:verbose] = true
|
|
167
187
|
end
|
|
168
188
|
|
|
169
|
-
opts.on "-q", "--quiet", "Quiet. Show no
|
|
189
|
+
opts.on "-q", "--quiet", "Quiet. Show no dots while processing files." do
|
|
170
190
|
options[:quiet] = true
|
|
171
191
|
end
|
|
172
192
|
|
|
@@ -174,29 +194,39 @@ module Minitest
|
|
|
174
194
|
options[:show_skips] = true
|
|
175
195
|
end
|
|
176
196
|
|
|
177
|
-
opts.on "-
|
|
178
|
-
|
|
197
|
+
opts.on "-b", "--bisect", "Run minitest in bisect-mode to isolate flaky tests." if
|
|
198
|
+
File.basename($0).match?(/minitest/)
|
|
199
|
+
|
|
200
|
+
opts.on "-i", "--include PATTERN", "Include /regexp/ or string for run." do |a|
|
|
201
|
+
options[:include] = a
|
|
179
202
|
end
|
|
180
203
|
|
|
181
204
|
opts.on "-e", "--exclude PATTERN", "Exclude /regexp/ or string from run." do |a|
|
|
182
205
|
options[:exclude] = a
|
|
183
206
|
end
|
|
184
207
|
|
|
208
|
+
# part of my unofficial embedded gem "makeoptparseworkwell"
|
|
209
|
+
def opts.topdict(name) = (name.length > 1 ? top.long : top.short)
|
|
210
|
+
def opts.alias(from, to) = (dict = topdict(from) ; dict[to] = dict[from])
|
|
211
|
+
|
|
212
|
+
# these will work but won't show up in --help output:
|
|
213
|
+
opts.alias "include", "name"
|
|
214
|
+
opts.alias "i", "n"
|
|
215
|
+
opts.alias "e", "x"
|
|
216
|
+
|
|
185
217
|
opts.on "-S", "--skip CODES", String, "Skip reporting of certain types of results (eg E)." do |s|
|
|
186
218
|
options[:skip] = s.chars.to_a
|
|
187
219
|
end
|
|
188
220
|
|
|
189
|
-
ruby27plus = ::Warning.respond_to? :[]=
|
|
190
|
-
|
|
191
221
|
opts.on "-W[error]", String, "Turn Ruby warnings into errors" do |s|
|
|
192
222
|
options[:Werror] = true
|
|
193
223
|
case s
|
|
194
224
|
when "error", "all", nil then
|
|
195
|
-
|
|
225
|
+
require_relative "minitest/error_on_warning"
|
|
196
226
|
$VERBOSE = true
|
|
197
|
-
::Warning[:deprecated] = true
|
|
227
|
+
::Warning[:deprecated] = true
|
|
198
228
|
else
|
|
199
|
-
::Warning[s.to_sym] = true
|
|
229
|
+
::Warning[s.to_sym] = true # check validity of category
|
|
200
230
|
end
|
|
201
231
|
end
|
|
202
232
|
|
|
@@ -253,23 +283,20 @@ module Minitest
|
|
|
253
283
|
#
|
|
254
284
|
# The overall structure of a run looks like this:
|
|
255
285
|
#
|
|
286
|
+
# [Minitest.load_plugins] optional, called by user, or require what you want
|
|
256
287
|
# Minitest.autorun
|
|
257
288
|
# Minitest.run(args)
|
|
258
|
-
# Minitest.load_plugins
|
|
259
289
|
# Minitest.process_args
|
|
260
290
|
# Minitest.init_plugins
|
|
261
|
-
# Minitest.
|
|
291
|
+
# Minitest.run_all_suites(reporter, options)
|
|
262
292
|
# Runnable.runnables.each |runnable_klass|
|
|
263
|
-
# runnable_klass.
|
|
264
|
-
# filtered_methods =
|
|
293
|
+
# runnable_klass.run_suite(reporter, options)
|
|
294
|
+
# filtered_methods = runnable_klass.filter_runnable_methods options
|
|
265
295
|
# filtered_methods.each |runnable_method|
|
|
266
|
-
# runnable_klass.
|
|
267
|
-
#
|
|
268
|
-
# runnable_klass.new(runnable_method).run
|
|
296
|
+
# runnable_klass.run(self, runnable_method, reporter)
|
|
297
|
+
# runnable_klass.new(runnable_method).run
|
|
269
298
|
|
|
270
299
|
def self.run args = []
|
|
271
|
-
self.load_plugins unless args.delete("--no-plugins") || ENV["MT_NO_PLUGINS"]
|
|
272
|
-
|
|
273
300
|
options = process_args args
|
|
274
301
|
|
|
275
302
|
Minitest.seed = options[:seed]
|
|
@@ -286,7 +313,7 @@ module Minitest
|
|
|
286
313
|
self.parallel_executor.start if parallel_executor.respond_to? :start
|
|
287
314
|
reporter.start
|
|
288
315
|
begin
|
|
289
|
-
|
|
316
|
+
run_all_suites reporter, options
|
|
290
317
|
finished = true
|
|
291
318
|
rescue Interrupt
|
|
292
319
|
warn "Interrupted. Exiting..."
|
|
@@ -303,7 +330,7 @@ module Minitest
|
|
|
303
330
|
end
|
|
304
331
|
|
|
305
332
|
def self.empty_run! options # :nodoc:
|
|
306
|
-
filter = options[:
|
|
333
|
+
filter = options[:include]
|
|
307
334
|
return true unless filter # no filter, but nothing ran == success
|
|
308
335
|
|
|
309
336
|
warn "Nothing ran for filter: %s" % [filter]
|
|
@@ -322,17 +349,17 @@ module Minitest
|
|
|
322
349
|
# Internal run method. Responsible for telling all Runnable
|
|
323
350
|
# sub-classes to run.
|
|
324
351
|
|
|
325
|
-
def self.
|
|
352
|
+
def self.run_all_suites reporter, options
|
|
326
353
|
suites = Runnable.runnables.shuffle
|
|
327
|
-
parallel, serial = suites.partition { |s| s.
|
|
354
|
+
parallel, serial = suites.partition { |s| s.run_order == :parallel }
|
|
328
355
|
|
|
329
356
|
# If we run the parallel tests before the serial tests, the parallel tests
|
|
330
357
|
# could run in parallel with the serial tests. This would be bad because
|
|
331
358
|
# the serial tests won't lock around Reporter#record. Run the serial tests
|
|
332
359
|
# first, so that after they complete, the parallel tests will lock when
|
|
333
360
|
# recording results.
|
|
334
|
-
serial.map { |suite| suite.
|
|
335
|
-
parallel.map { |suite| suite.
|
|
361
|
+
serial.map { |suite| suite.run_suite reporter, options } +
|
|
362
|
+
parallel.map { |suite| suite.run_suite reporter, options }
|
|
336
363
|
end
|
|
337
364
|
|
|
338
365
|
def self.filter_backtrace bt # :nodoc:
|
|
@@ -400,21 +427,30 @@ module Minitest
|
|
|
400
427
|
reset
|
|
401
428
|
|
|
402
429
|
##
|
|
403
|
-
#
|
|
404
|
-
#
|
|
405
|
-
#
|
|
430
|
+
# Returns an array of filtered +runnable_methods+. Uses
|
|
431
|
+
# options[:include] (--include arguments) and options[:exclude]
|
|
432
|
+
# (--exclude arguments) values to filter.
|
|
406
433
|
|
|
407
|
-
def self.
|
|
408
|
-
pos = options[:
|
|
434
|
+
def self.filter_runnable_methods options={}
|
|
435
|
+
pos = options[:include]
|
|
409
436
|
neg = options[:exclude]
|
|
410
437
|
|
|
411
438
|
pos = Regexp.new $1 if pos.kind_of?(String) && pos =~ %r%/(.*)/%
|
|
412
439
|
neg = Regexp.new $1 if neg.kind_of?(String) && neg =~ %r%/(.*)/%
|
|
413
440
|
|
|
414
441
|
# at most 1-2% slower than a 1-pass version, stop optimizing this
|
|
415
|
-
|
|
442
|
+
self.runnable_methods
|
|
416
443
|
.select { |m| !pos || pos === m || pos === "#{self}##{m}" }
|
|
417
444
|
.reject { |m| neg && (neg === m || neg === "#{self}##{m}") }
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
##
|
|
448
|
+
# Responsible for running all runnable methods in a given class,
|
|
449
|
+
# each in its own instance. Each instance is passed to the
|
|
450
|
+
# reporter to record.
|
|
451
|
+
|
|
452
|
+
def Runnable.run_suite reporter, options = {}
|
|
453
|
+
filtered_methods = filter_runnable_methods options
|
|
418
454
|
|
|
419
455
|
return if filtered_methods.empty?
|
|
420
456
|
|
|
@@ -429,12 +465,12 @@ module Minitest
|
|
|
429
465
|
warn "Current: %s#%s %.2fs" % [self, name, Minitest.clock_time - t0]
|
|
430
466
|
end
|
|
431
467
|
|
|
432
|
-
with_info_handler
|
|
468
|
+
with_info_handler do
|
|
433
469
|
filtered_methods.each do |method_name|
|
|
434
470
|
name = method_name
|
|
435
471
|
t0 = Minitest.clock_time
|
|
436
472
|
|
|
437
|
-
|
|
473
|
+
run self, method_name, reporter
|
|
438
474
|
end
|
|
439
475
|
end
|
|
440
476
|
end
|
|
@@ -445,20 +481,20 @@ module Minitest
|
|
|
445
481
|
# that subclasses can specialize the running of an individual
|
|
446
482
|
# test. See Minitest::ParallelTest::ClassMethods for an example.
|
|
447
483
|
|
|
448
|
-
def
|
|
484
|
+
def Runnable.run klass, method_name, reporter
|
|
449
485
|
reporter.prerecord klass, method_name
|
|
450
|
-
reporter.record
|
|
486
|
+
reporter.record klass.new(method_name).run
|
|
451
487
|
end
|
|
452
488
|
|
|
453
489
|
##
|
|
454
490
|
# Defines the order to run tests (:random by default). Override
|
|
455
491
|
# this or use a convenience method to change it for your tests.
|
|
456
492
|
|
|
457
|
-
def self.
|
|
493
|
+
def self.run_order
|
|
458
494
|
:random
|
|
459
495
|
end
|
|
460
496
|
|
|
461
|
-
def self.with_info_handler
|
|
497
|
+
def self.with_info_handler _reporter=nil, &block # :nodoc:
|
|
462
498
|
on_signal ::Minitest.info_signal, @_info_handler, &block
|
|
463
499
|
end
|
|
464
500
|
|
|
@@ -492,22 +528,6 @@ module Minitest
|
|
|
492
528
|
@@runnables
|
|
493
529
|
end
|
|
494
530
|
|
|
495
|
-
@@marshal_dump_warned = false
|
|
496
|
-
|
|
497
|
-
def marshal_dump # :nodoc:
|
|
498
|
-
unless @@marshal_dump_warned then
|
|
499
|
-
warn ["Minitest::Runnable#marshal_dump is deprecated.",
|
|
500
|
-
"You might be violating internals. From", caller(1..1).first].join " "
|
|
501
|
-
@@marshal_dump_warned = true
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
[self.name, self.failures, self.assertions, self.time]
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
def marshal_load ary # :nodoc:
|
|
508
|
-
self.name, self.failures, self.assertions, self.time = ary
|
|
509
|
-
end
|
|
510
|
-
|
|
511
531
|
def failure # :nodoc:
|
|
512
532
|
self.failures.first
|
|
513
533
|
end
|
|
@@ -639,9 +659,6 @@ module Minitest
|
|
|
639
659
|
class Result < Runnable
|
|
640
660
|
include Minitest::Reportable
|
|
641
661
|
|
|
642
|
-
undef_method :marshal_dump
|
|
643
|
-
undef_method :marshal_load
|
|
644
|
-
|
|
645
662
|
##
|
|
646
663
|
# The class name of the test result.
|
|
647
664
|
|
|
@@ -1001,8 +1018,7 @@ module Minitest
|
|
|
1001
1018
|
|
|
1002
1019
|
def prerecord klass, name # :nodoc:
|
|
1003
1020
|
self.reporters.each do |reporter|
|
|
1004
|
-
|
|
1005
|
-
reporter.prerecord klass, name if reporter.respond_to? :prerecord
|
|
1021
|
+
reporter.prerecord klass, name
|
|
1006
1022
|
end
|
|
1007
1023
|
end
|
|
1008
1024
|
|
|
@@ -1128,16 +1144,6 @@ module Minitest
|
|
|
1128
1144
|
"java" == platform
|
|
1129
1145
|
end
|
|
1130
1146
|
|
|
1131
|
-
##
|
|
1132
|
-
# Is this running on maglev?
|
|
1133
|
-
|
|
1134
|
-
def maglev? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
|
|
1135
|
-
where = Minitest.filter_backtrace(caller).first
|
|
1136
|
-
where = where.split(":in ", 2).first # clean up noise
|
|
1137
|
-
warn "DEPRECATED: `maglev?` called from #{where}. This will fail in Minitest 6."
|
|
1138
|
-
"maglev" == platform
|
|
1139
|
-
end
|
|
1140
|
-
|
|
1141
1147
|
##
|
|
1142
1148
|
# Is this running on mri?
|
|
1143
1149
|
|
|
@@ -1152,16 +1158,6 @@ module Minitest
|
|
|
1152
1158
|
platform.include? "darwin"
|
|
1153
1159
|
end
|
|
1154
1160
|
|
|
1155
|
-
##
|
|
1156
|
-
# Is this running on rubinius?
|
|
1157
|
-
|
|
1158
|
-
def rubinius? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
|
|
1159
|
-
where = Minitest.filter_backtrace(caller).first
|
|
1160
|
-
where = where.split(":in ", 2).first # clean up noise
|
|
1161
|
-
warn "DEPRECATED: `rubinius?` called from #{where}. This will fail in Minitest 6."
|
|
1162
|
-
"rbx" == platform
|
|
1163
|
-
end
|
|
1164
|
-
|
|
1165
1161
|
##
|
|
1166
1162
|
# Is this running on windows?
|
|
1167
1163
|
|
|
@@ -1207,12 +1203,6 @@ module Minitest
|
|
|
1207
1203
|
|
|
1208
1204
|
self.backtrace_filter = BacktraceFilter.new
|
|
1209
1205
|
|
|
1210
|
-
def self.run_one_method klass, method_name # :nodoc:
|
|
1211
|
-
result = klass.new(method_name).run
|
|
1212
|
-
raise "#{klass}#run _must_ return a Result" unless Result === result
|
|
1213
|
-
result
|
|
1214
|
-
end
|
|
1215
|
-
|
|
1216
1206
|
# :stopdoc:
|
|
1217
1207
|
|
|
1218
1208
|
if defined? Process::CLOCK_MONOTONIC # :nodoc:
|
|
@@ -1235,4 +1225,8 @@ module Minitest
|
|
|
1235
1225
|
# :startdoc:
|
|
1236
1226
|
end
|
|
1237
1227
|
|
|
1238
|
-
|
|
1228
|
+
require_relative "minitest/test"
|
|
1229
|
+
if ENV["MINITEST_SERVER"] then
|
|
1230
|
+
require_relative "minitest/server_plugin"
|
|
1231
|
+
Minitest.register_plugin :server
|
|
1232
|
+
end
|