minitest 5.0.3 → 5.0.4

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 5.0.4 / 2013-06-07
2
+
3
+ * 5 minor enhancements:
4
+
5
+ * Added AbstractReporter, defining required Reporter API to quack properly.
6
+ * Added doco for writing reporters.
7
+ * Refactored Reporter into ProgressReporter and SummaryReporter. (idea: phiggins, code:me+scotch)
8
+ * Refactored SummaryReporter pushing up to StatisticsReporter. (phiggins)
9
+ * Removed Reporter#run_and_report... cleaner, but doesn't "fit" in the API.
10
+
1
11
  === 5.0.3 / 2013-05-29
2
12
 
3
13
  * 4 minor enhancements:
data/README.txt CHANGED
@@ -245,12 +245,52 @@ bogus example:
245
245
  def self.plugin_bogus_options(opts, options)
246
246
  opts.on "--myci", "Report results to my CI" do
247
247
  options[:myci] = true
248
+ options[:myci_addr] = get_myci_addr
249
+ options[:myci_port] = get_myci_port
248
250
  end
249
251
  end
250
252
 
251
253
  def self.plugin_bogus_init(options)
252
- ARGV << "-p" # all pride, all the time
253
- self.reporter << MyCI.new if options[:myci]
254
+ self.reporter << MyCI.new(options) if options[:myci]
255
+ end
256
+ end
257
+
258
+ === Adding custom reporters
259
+
260
+ Minitest uses composite reporter to output test results using multiple
261
+ reporter instances. You can add new reporters to the composite during
262
+ the init_plugins phase. As we saw in +plugin_bonus_init+ above, you
263
+ simply add your reporter instance to the composite via +<<+.
264
+
265
+ +AbstractReporter+ defines the API for reporters. You may subclass it
266
+ and override any method you want to achieve your desired behavior.
267
+
268
+ start :: Called when the run has started.
269
+ record :: Called for each result, passed or otherwise.
270
+ report :: Called at the end of the run.
271
+ passed? :: Called to see if you detected any problems.
272
+
273
+ Using our example above, here is how we might implement MyCI:
274
+
275
+ # minitest/bogus_plugin.rb
276
+
277
+ module Minitest
278
+ class MyCI < AbstractReporter
279
+ attr_accessor :results, :addr, :port
280
+
281
+ def initialize options
282
+ self.results = []
283
+ self.addr = options[:myci_addr]
284
+ self.port = options[:myci_port]
285
+ end
286
+
287
+ def record result
288
+ self.results << result
289
+ end
290
+
291
+ def report
292
+ CI.connect(addr, port).send_results self.results
293
+ end
254
294
  end
255
295
  end
256
296
 
@@ -356,6 +396,7 @@ minitest-instrument :: Instrument ActiveSupport::Notifications when
356
396
  minitest-instrument-db :: Store information about speed of test
357
397
  execution provided by minitest-instrument in database
358
398
  minitest-libnotify :: Test notifier for minitest via libnotify.
399
+ minitest-line :: Run test at line number
359
400
  minitest-macruby :: Provides extensions to minitest for macruby UI testing.
360
401
  minitest-matchers :: Adds support for RSpec-style matchers to minitest.
361
402
  minitest-metadata :: Annotate tests with metadata (key-value).
data/lib/minitest.rb CHANGED
@@ -4,7 +4,7 @@ require "optparse"
4
4
  # :include: README.txt
5
5
 
6
6
  module Minitest
7
- VERSION = "5.0.3" # :nodoc:
7
+ VERSION = "5.0.4" # :nodoc:
8
8
 
9
9
  @@installed_at_exit ||= false
10
10
  @@after_run = []
@@ -94,7 +94,7 @@ module Minitest
94
94
  # Runnable.runnables.each
95
95
  # runnable.run(reporter, options)
96
96
  # self.runnable_methods.each
97
- # self.new.run runnable_method
97
+ # self.new(runnable_method).run
98
98
 
99
99
  def self.run args = []
100
100
  self.load_plugins
@@ -102,15 +102,16 @@ module Minitest
102
102
  options = process_args args
103
103
 
104
104
  reporter = CompositeReporter.new
105
- reporter << Reporter.new(options[:io], options)
105
+ reporter << ProgressReporter.new(options[:io], options)
106
+ reporter << SummaryReporter.new(options[:io], options)
106
107
 
107
108
  self.reporter = reporter # this makes it available to plugins
108
109
  self.init_plugins options
109
110
  self.reporter = nil # runnables shouldn't depend on the reporter, ever
110
111
 
111
- reporter.run_and_report do
112
- __run reporter, options
113
- end
112
+ reporter.start
113
+ __run reporter, options
114
+ reporter.report
114
115
 
115
116
  reporter.passed?
116
117
  end
@@ -362,19 +363,38 @@ module Minitest
362
363
  end
363
364
 
364
365
  ##
365
- # Collects and reports the result of all runs.
366
+ # Defines the API for Reporters. Subclass this and override whatever
367
+ # you want. Go nuts.
366
368
 
367
- class Reporter
369
+ class AbstractReporter
368
370
  ##
369
- # The count of assertions run.
371
+ # Starts reporting on the run.
370
372
 
371
- attr_accessor :assertions
373
+ def start
374
+ end
372
375
 
373
376
  ##
374
- # The count of runnable methods ran.
377
+ # Record a result and output the Runnable#result_code. Stores the
378
+ # result of the run if the run did not pass.
375
379
 
376
- attr_accessor :count
380
+ def record result
381
+ end
377
382
 
383
+ ##
384
+ # Outputs the summary of the run.
385
+
386
+ def report
387
+ end
388
+
389
+ ##
390
+ # Did this run pass?
391
+
392
+ def passed?
393
+ true
394
+ end
395
+ end
396
+
397
+ class Reporter < AbstractReporter # :nodoc:
378
398
  ##
379
399
  # The IO used to report.
380
400
 
@@ -385,118 +405,151 @@ module Minitest
385
405
 
386
406
  attr_accessor :options
387
407
 
388
- ##
389
- # The results of all the runs. (Non-passing only to cut down on memory)
408
+ def initialize io = $stdout, options = {} # :nodoc:
409
+ self.io = io
410
+ self.options = options
411
+ end
412
+ end
390
413
 
391
- attr_accessor :results
414
+ ##
415
+ # A very simple reporter that prints the "dots" during the run.
416
+ #
417
+ # This is added to the top-level CompositeReporter at the start of
418
+ # the run. If you want to change the output of minitest via a
419
+ # plugin, pull this out of the composite and replace it with your
420
+ # own.
392
421
 
393
- ##
394
- # The start time of the run.
422
+ class ProgressReporter < Reporter
423
+ def record result # :nodoc:
424
+ io.print "%s#%s = %.2f s = " % [result.class, result.name, result.time] if
425
+ options[:verbose]
426
+ io.print result.result_code
427
+ io.puts if options[:verbose]
428
+ end
429
+ end
395
430
 
396
- attr_accessor :start_time
431
+ ##
432
+ # A reporter that gathers statistics about a test run. Does not do
433
+ # any IO because meant to be used as a parent class for a reporter
434
+ # that does.
435
+ #
436
+ # If you want to create an entirely different type of output (eg,
437
+ # CI, HTML, etc), this is the place to start.
397
438
 
398
- attr_accessor :sync, :old_sync # :nodoc:
439
+ class StatisticsReporter < Reporter
440
+ # :stopdoc:
441
+ attr_accessor :assertions
442
+ attr_accessor :count
443
+ attr_accessor :results
444
+ attr_accessor :start_time
445
+ attr_accessor :total_time
446
+ attr_accessor :failures
447
+ attr_accessor :errors
448
+ attr_accessor :skips
449
+ # :startdoc:
399
450
 
400
451
  def initialize io = $stdout, options = {} # :nodoc:
401
- self.io = io
402
- self.options = options
452
+ super
403
453
 
404
454
  self.assertions = 0
405
455
  self.count = 0
406
456
  self.results = []
407
457
  self.start_time = nil
458
+ self.total_time = nil
459
+ self.failures = nil
460
+ self.errors = nil
461
+ self.skips = nil
408
462
  end
409
463
 
410
- ##
411
- # Did this run pass?
412
-
413
- def passed?
464
+ def passed? # :nodoc:
414
465
  results.all?(&:skipped?)
415
466
  end
416
467
 
417
- ##
418
- # Top-level method to ensure that start and report are called.
419
- # Yields to the caller.
468
+ def start # :nodoc:
469
+ self.start_time = Time.now
470
+ end
420
471
 
421
- def run_and_report
422
- start
472
+ def record result # :nodoc:
473
+ self.count += 1
474
+ self.assertions += result.assertions
423
475
 
424
- yield
476
+ results << result if not result.passed? or result.skipped?
477
+ end
425
478
 
426
- io.sync = self.old_sync if self.sync
427
- report
479
+ def report # :nodoc:
480
+ aggregate = results.group_by { |r| r.failure.class }
481
+ aggregate.default = [] # dumb. group_by should provide this
482
+
483
+ self.total_time = Time.now - start_time
484
+ self.failures = aggregate[Assertion].size
485
+ self.errors = aggregate[UnexpectedError].size
486
+ self.skips = aggregate[Skip].size
428
487
  end
488
+ end
429
489
 
430
- ##
431
- # Starts reporting on the run.
490
+ ##
491
+ # A reporter that prints the header, summary, and failure details at
492
+ # the end of the run.
493
+ #
494
+ # This is added to the top-level CompositeReporter at the start of
495
+ # the run. If you want to change the output of minitest via a
496
+ # plugin, pull this out of the composite and replace it with your
497
+ # own.
432
498
 
433
- def start
434
- self.sync = io.respond_to? :"sync=" # stupid emacs
435
- self.old_sync, io.sync = io.sync, true if self.sync
499
+ class SummaryReporter < StatisticsReporter
500
+ # :stopdoc:
501
+ attr_accessor :sync
502
+ attr_accessor :old_sync
503
+ # :startdoc:
436
504
 
437
- self.start_time = Time.now
505
+ def start # :nodoc:
506
+ super
438
507
 
439
508
  io.puts "Run options: #{options[:args]}"
440
509
  io.puts
441
510
  io.puts "# Running:"
442
511
  io.puts
443
- end
444
-
445
- ##
446
- # Record a result and output the Runnable#result_code. Stores the
447
- # result of the run if the run did not pass.
448
512
 
449
- def record result
450
- self.count += 1
451
- self.assertions += result.assertions
452
-
453
- io.print "%s#%s = %.2f s = " % [result.class, result.name, result.time] if
454
- options[:verbose]
455
- io.print result.result_code
456
- io.puts if options[:verbose]
457
-
458
- results << result if not result.passed? or result.skipped?
513
+ self.sync = io.respond_to? :"sync=" # stupid emacs
514
+ self.old_sync, io.sync = io.sync, true if self.sync
459
515
  end
460
516
 
461
- ##
462
- # Outputs the summary of the run.
463
-
464
- def report
465
- aggregate = results.group_by { |r| r.failure.class }
466
- aggregate.default = [] # dumb. group_by should provide this
517
+ def report # :nodoc:
518
+ super
467
519
 
468
- f = aggregate[Assertion].size
469
- e = aggregate[UnexpectedError].size
470
- s = aggregate[Skip].size
471
- t = Time.now - start_time
520
+ io.sync = self.old_sync
472
521
 
473
522
  io.puts # finish the dots
474
523
  io.puts
475
- io.puts "Finished in %.6fs, %.4f runs/s, %.4f assertions/s." %
476
- [t, count / t, self.assertions / t]
477
-
478
- format = "%d runs, %d assertions, %d failures, %d errors, %d skips"
479
- summary = format % [count, self.assertions, f, e, s]
480
-
481
- io.print self
482
- io.puts
524
+ io.puts statistics
525
+ io.puts aggregated_results
483
526
  io.puts summary
484
527
  end
485
528
 
486
- def to_s # :nodoc:
529
+ def statistics # :nodoc:
530
+ "Finished in %.6fs, %.4f runs/s, %.4f assertions/s." %
531
+ [total_time, count / total_time, assertions / total_time]
532
+ end
533
+
534
+ def aggregated_results # :nodoc:
487
535
  filtered_results = results.dup
488
536
  filtered_results.reject!(&:skipped?) unless options[:verbose]
489
537
 
490
538
  filtered_results.each_with_index.map do |result, i|
491
539
  "\n%3d) %s" % [i+1, result]
492
- end.join "\n"
540
+ end.join("\n") + "\n"
541
+ end
542
+
543
+ def summary # :nodoc:
544
+ "%d runs, %d assertions, %d failures, %d errors, %d skips" %
545
+ [count, assertions, failures, errors, skips]
493
546
  end
494
547
  end
495
548
 
496
549
  ##
497
550
  # Dispatch to multiple reporters as one.
498
551
 
499
- class CompositeReporter < Reporter
552
+ class CompositeReporter < AbstractReporter
500
553
  ##
501
554
  # The list of reporters to dispatch to.
502
555
 
@@ -602,7 +655,7 @@ module Minitest
602
655
  ##
603
656
  # Provides a simple set of guards that you can use in your tests
604
657
  # to skip execution if it is not applicable. These methods are
605
- # mixed into TestCase as both instance and class methods so you
658
+ # mixed into Test as both instance and class methods so you
606
659
  # can use them inside or outside of the test methods.
607
660
  #
608
661
  # def test_something_for_mri
@@ -624,7 +677,7 @@ module Minitest
624
677
  end
625
678
 
626
679
  ##
627
- # Is this running on mri?
680
+ # Is this running on maglev?
628
681
 
629
682
  def maglev? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
630
683
  "maglev" == platform
data/lib/minitest/spec.rb CHANGED
@@ -197,7 +197,7 @@ class Minitest::Spec < Minitest::Test
197
197
  #
198
198
  # This is also aliased to #specify and doesn't require a +desc+ arg.
199
199
  #
200
- # Hint: If you _do_ want inheritence, use minitest/unit. You can mix
200
+ # Hint: If you _do_ want inheritence, use minitest/test. You can mix
201
201
  # and match between assertions and expectations as much as you want.
202
202
 
203
203
  def it desc = "anonymous", &block
data/lib/minitest/test.rb CHANGED
@@ -25,8 +25,8 @@ module Minitest
25
25
  end
26
26
 
27
27
  ##
28
- # Make diffs for this TestCase use #pretty_inspect so that diff
29
- # in assert_equal can be more details. NOTE: this is much slower
28
+ # Make diffs for this Test use #pretty_inspect so that diff
29
+ # in assert_equal can have more details. NOTE: this is much slower
30
30
  # than the regular inspect but much more usable for complex
31
31
  # objects.
32
32
 
@@ -15,7 +15,11 @@ class MetaMetaMetaTestCase < Minitest::Test
15
15
  options = Minitest.process_args flags
16
16
 
17
17
  @output = StringIO.new("")
18
- self.reporter = Minitest::Reporter.new @output, options
18
+
19
+ self.reporter = Minitest::CompositeReporter.new
20
+ reporter << Minitest::SummaryReporter.new(@output, options)
21
+ reporter << Minitest::ProgressReporter.new(@output, options)
22
+
19
23
  reporter.start
20
24
 
21
25
  @tus ||= [@tu]
@@ -28,6 +32,10 @@ class MetaMetaMetaTestCase < Minitest::Test
28
32
  reporter.report
29
33
  end
30
34
 
35
+ def first_reporter
36
+ reporter.reporters.first
37
+ end
38
+
31
39
  def assert_report expected, flags = %w[--seed 42]
32
40
  header = clean <<-EOM
33
41
  Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "}
@@ -5,9 +5,33 @@ class TestMinitestReporter < Minitest::Test
5
5
 
6
6
  attr_accessor :r, :io
7
7
 
8
+ def new_composite_reporter
9
+ reporter = Minitest::CompositeReporter.new
10
+ reporter << Minitest::SummaryReporter.new(self.io)
11
+ reporter << Minitest::ProgressReporter.new(self.io)
12
+
13
+ def reporter.first
14
+ reporters.first
15
+ end
16
+
17
+ def reporter.results
18
+ first.results
19
+ end
20
+
21
+ def reporter.count
22
+ first.count
23
+ end
24
+
25
+ def reporter.assertions
26
+ first.assertions
27
+ end
28
+
29
+ reporter
30
+ end
31
+
8
32
  def setup
9
33
  self.io = StringIO.new("")
10
- self.r = Minitest::Reporter.new io
34
+ self.r = new_composite_reporter
11
35
  end
12
36
 
13
37
  def error_test
@@ -432,7 +432,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
432
432
  def self.name; "wacky!" end
433
433
 
434
434
  def self.before_my_suite
435
- @reporter.io.puts "Running #{self.name} tests"
435
+ @reporter.reporters.first.io.puts "Running #{self.name} tests"
436
436
  @@foo = 1
437
437
  end
438
438
 
@@ -1750,7 +1750,7 @@ class TestMinitestUnitRecording < MetaMetaMetaTestCase
1750
1750
 
1751
1751
  run_tu_with_fresh_reporter
1752
1752
 
1753
- recorded = reporter.results.map(&:failures).flatten.map { |f| f.error.class }
1753
+ recorded = first_reporter.results.map(&:failures).flatten.map { |f| f.error.class }
1754
1754
 
1755
1755
  assert_equal expected, recorded
1756
1756
  end
@@ -1828,7 +1828,7 @@ class TestMinitestUnitRecording < MetaMetaMetaTestCase
1828
1828
  FILE:LINE:in `teardown'
1829
1829
  "
1830
1830
 
1831
- assert_equal exp.strip, normalize_output(reporter.results.first.to_s).strip
1831
+ assert_equal exp.strip, normalize_output(first_reporter.results.first.to_s).strip
1832
1832
  end
1833
1833
 
1834
1834
  def test_record_skip
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest
3
3
  version: !ruby/object:Gem::Version
4
- hash: 49
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 5
8
8
  - 0
9
- - 3
10
- version: 5.0.3
9
+ - 4
10
+ version: 5.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Davis
@@ -36,7 +36,7 @@ cert_chain:
36
36
  FBHgymkyj/AOSqKRIpXPhjC6
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2013-05-30 00:00:00 Z
39
+ date: 2013-06-07 00:00:00 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rdoc
metadata.gz.sig CHANGED
Binary file