minitest-reporters 0.4.0 → 0.5.0
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.
- data/README.md +10 -1
- data/lib/minitest/backtrace_filter.rb +66 -0
- data/lib/minitest/reporters.rb +14 -12
- data/lib/minitest/reporters/default_reporter.rb +28 -24
- data/lib/minitest/reporters/progress_reporter.rb +25 -21
- data/lib/minitest/reporters/ruby_mate_reporter.rb +18 -14
- data/lib/minitest/reporters/rubymine_reporter.rb +163 -0
- data/lib/minitest/reporters/spec_reporter.rb +26 -22
- data/lib/minitest/reporters/version.rb +2 -2
- data/test/minitest/backtrace_filter_test.rb +38 -0
- data/test/{journo → minitest}/reporter_test.rb +0 -0
- data/test/{journo → minitest}/suite_runner_test.rb +0 -0
- data/test/{journo → minitest}/test_runner_test.rb +0 -0
- data/test/test_helper.rb +6 -4
- metadata +26 -21
data/README.md
CHANGED
@@ -24,7 +24,8 @@ The following reporters are provided:
|
|
24
24
|
MiniTest::Reporters::DefaultReporter # => Identical to the standard MiniTest reporter
|
25
25
|
MiniTest::Reporters::SpecReporter # => Turn-like output that reads like a spec
|
26
26
|
MiniTest::Reporters::ProgressReporter # => Fuubar-like output with a progress bar
|
27
|
-
MiniTest::Reporters::RubyMateReporter # => Simple reporter designed for RubyMate
|
27
|
+
MiniTest::Reporters::RubyMateReporter # => Simple reporter designed for RubyMate
|
28
|
+
MiniTest::Reporters::RubyMineReporter # => Reporter designed for RubyMine IDE and TeamCity CI server; see below
|
28
29
|
|
29
30
|
I really like `ProgressReporter` for my everyday terminal usage, but I like
|
30
31
|
using `RubyMateReporter` when I'm executing test suites from TextMate. My usual
|
@@ -38,6 +39,14 @@ set up looks like this:
|
|
38
39
|
MiniTest::Unit.runner.reporters << MiniTest::Reporters::ProgressReporter.new
|
39
40
|
end
|
40
41
|
|
42
|
+
If you prefer integration with RubyMine test runner or TeamCity CI server you'll need:
|
43
|
+
|
44
|
+
if ENV["RM_INFO"] || ENV["TEAMCITY_VERSION"]
|
45
|
+
MiniTest::Unit.runner.reporters << MiniTest::Reporters::RubyMineReporter.new
|
46
|
+
else
|
47
|
+
...
|
48
|
+
end
|
49
|
+
|
41
50
|
## TODO ##
|
42
51
|
|
43
52
|
* Make the boilerplate code look prettier. Something like a one-line require for the general use-case would be nice.
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module MiniTest
|
2
|
+
# Filters backtraces of exceptions that may arise when running tests.
|
3
|
+
class BacktraceFilter
|
4
|
+
# Returns the default filter.
|
5
|
+
#
|
6
|
+
# The default filter will filter out all MiniTest and minitest-reporters
|
7
|
+
# lines.
|
8
|
+
#
|
9
|
+
# @return [MiniTest::BacktraceFilter]
|
10
|
+
def self.default_filter
|
11
|
+
unless defined? @default_filter
|
12
|
+
filter = self.new
|
13
|
+
filter.add_filter(/lib\/minitest/)
|
14
|
+
@default_filter = filter
|
15
|
+
end
|
16
|
+
|
17
|
+
@default_filter
|
18
|
+
end
|
19
|
+
|
20
|
+
# Creates a new backtrace filter.
|
21
|
+
def initialize
|
22
|
+
@filters = []
|
23
|
+
end
|
24
|
+
|
25
|
+
# Adds a filter.
|
26
|
+
#
|
27
|
+
# @param [Regex] regex the filter
|
28
|
+
def add_filter(regex)
|
29
|
+
@filters << regex
|
30
|
+
end
|
31
|
+
|
32
|
+
# Determines if the string would be filtered.
|
33
|
+
#
|
34
|
+
# @param [String] str
|
35
|
+
# @return [Boolean]
|
36
|
+
def filters?(str)
|
37
|
+
@filters.any? { |filter| str =~ filter }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Filters a backtrace.
|
41
|
+
#
|
42
|
+
# This will add new lines to the new backtrace until a filtered line is
|
43
|
+
# encountered. If there were lines added to the new backtrace, it returns
|
44
|
+
# those lines. However, if the first line in the backtrace was filtered,
|
45
|
+
# resulting in an empty backtrace, it returns all lines that would have
|
46
|
+
# been unfiltered. If that in turn does not contain any lines, it returns
|
47
|
+
# the original backtrace.
|
48
|
+
#
|
49
|
+
# @param [Array] backtrace the backtrace to filter
|
50
|
+
# @return [Array] the filtered backtrace
|
51
|
+
# @note This logic is based off of MiniTest's #filter_backtrace.
|
52
|
+
def filter(backtrace)
|
53
|
+
result = []
|
54
|
+
|
55
|
+
backtrace.each do |line|
|
56
|
+
break if filters?(line)
|
57
|
+
result << line
|
58
|
+
end
|
59
|
+
|
60
|
+
result = backtrace.reject { |line| filters?(line) } if result.empty?
|
61
|
+
result = backtrace.dup if result.empty?
|
62
|
+
|
63
|
+
result
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/minitest/reporters.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
require
|
1
|
+
require "minitest/unit"
|
2
2
|
|
3
3
|
module MiniTest
|
4
|
-
autoload :Reporter,
|
5
|
-
autoload :SuiteRunner,
|
6
|
-
autoload :TestRunner,
|
7
|
-
|
4
|
+
autoload :Reporter, "minitest/reporter"
|
5
|
+
autoload :SuiteRunner, "minitest/suite_runner"
|
6
|
+
autoload :TestRunner, "minitest/test_runner"
|
7
|
+
autoload :BacktraceFilter, "minitest/backtrace_filter"
|
8
|
+
|
8
9
|
module Reporters
|
9
|
-
require
|
10
|
-
|
11
|
-
autoload :DefaultReporter,
|
12
|
-
autoload :SpecReporter,
|
13
|
-
autoload :ProgressReporter,
|
14
|
-
autoload :RubyMateReporter,
|
10
|
+
require "minitest/reporters/version"
|
11
|
+
|
12
|
+
autoload :DefaultReporter, "minitest/reporters/default_reporter"
|
13
|
+
autoload :SpecReporter, "minitest/reporters/spec_reporter"
|
14
|
+
autoload :ProgressReporter, "minitest/reporters/progress_reporter"
|
15
|
+
autoload :RubyMateReporter, "minitest/reporters/ruby_mate_reporter"
|
16
|
+
autoload :RubyMineReporter, "minitest/reporters/rubymine_reporter"
|
15
17
|
end
|
16
|
-
end
|
18
|
+
end
|
@@ -3,47 +3,51 @@ require 'ansi'
|
|
3
3
|
module MiniTest
|
4
4
|
module Reporters
|
5
5
|
# A reporter identical to the standard MiniTest reporter.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# @see https://github.com/seattlerb/minitest MiniTest
|
10
10
|
class DefaultReporter
|
11
11
|
include MiniTest::Reporter
|
12
|
-
|
12
|
+
|
13
|
+
def initialize(backtrace_filter = MiniTest::BacktraceFilter.default_filter)
|
14
|
+
@backtrace_filter = backtrace_filter
|
15
|
+
end
|
16
|
+
|
13
17
|
def before_suites(suites, type)
|
14
18
|
puts
|
15
19
|
puts "# Running #{type}s:"
|
16
20
|
puts
|
17
21
|
end
|
18
|
-
|
22
|
+
|
19
23
|
def before_test(suite, test)
|
20
|
-
print "#{suite}##{
|
24
|
+
print "#{suite}##{test} = " if verbose?
|
21
25
|
end
|
22
|
-
|
26
|
+
|
23
27
|
def pass(suite, test, test_runner)
|
24
28
|
after_test('.')
|
25
29
|
end
|
26
|
-
|
30
|
+
|
27
31
|
def skip(suite, test, test_runner)
|
28
32
|
after_test('S')
|
29
33
|
end
|
30
|
-
|
34
|
+
|
31
35
|
def failure(suite, test, test_runner)
|
32
36
|
after_test('F')
|
33
37
|
end
|
34
|
-
|
38
|
+
|
35
39
|
def error(suite, test, test_runner)
|
36
40
|
after_test('E')
|
37
41
|
end
|
38
|
-
|
42
|
+
|
39
43
|
def after_suites(suites, type)
|
40
44
|
time = Time.now - runner.start_time
|
41
|
-
|
45
|
+
|
42
46
|
puts
|
43
47
|
puts
|
44
48
|
puts "Finished #{type}s in %.6fs, %.4f tests/s, %.4f assertions/s." %
|
45
49
|
[time, runner.test_count / time, runner.assertion_count / time]
|
46
|
-
|
50
|
+
|
47
51
|
i = 0
|
48
52
|
runner.report.each do |suite, tests|
|
49
53
|
tests.each do |test, test_runner|
|
@@ -54,48 +58,48 @@ module MiniTest
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
end
|
57
|
-
|
61
|
+
|
58
62
|
puts
|
59
|
-
|
63
|
+
|
60
64
|
puts status
|
61
65
|
end
|
62
|
-
|
66
|
+
|
63
67
|
private
|
64
|
-
|
68
|
+
|
65
69
|
def after_test(result)
|
66
70
|
time = Time.now - runner.test_start_time
|
67
|
-
|
71
|
+
|
68
72
|
print '%.2f s = ' % time if verbose?
|
69
73
|
print result
|
70
74
|
puts if verbose?
|
71
75
|
end
|
72
|
-
|
76
|
+
|
73
77
|
def location(exception)
|
74
78
|
last_before_assertion = ''
|
75
|
-
|
79
|
+
|
76
80
|
exception.backtrace.reverse_each do |s|
|
77
81
|
break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
|
78
82
|
last_before_assertion = s
|
79
83
|
end
|
80
|
-
|
84
|
+
|
81
85
|
last_before_assertion.sub(/:in .*$/, '')
|
82
86
|
end
|
83
|
-
|
87
|
+
|
84
88
|
def message_for(test_runner)
|
85
89
|
suite = test_runner.suite
|
86
90
|
test = test_runner.test
|
87
91
|
e = test_runner.exception
|
88
|
-
|
92
|
+
|
89
93
|
case test_runner.result
|
90
94
|
when :pass then nil
|
91
95
|
when :skip then "Skipped:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
92
96
|
when :failure then "Failure:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
93
97
|
when :error
|
94
|
-
bt =
|
98
|
+
bt = @backtrace_filter.filter(test_runner.exception.backtrace).join "\n "
|
95
99
|
"Error:\n#{test}(#{suite}):\n#{e.class}: #{e.message}\n #{bt}\n"
|
96
100
|
end
|
97
101
|
end
|
98
|
-
|
102
|
+
|
99
103
|
def status
|
100
104
|
'%d tests, %d assertions, %d failures, %d errors, %d skips' %
|
101
105
|
[runner.test_count, runner.assertion_count, runner.failures, runner.errors, runner.skips]
|
@@ -4,28 +4,32 @@ require 'progressbar'
|
|
4
4
|
module MiniTest
|
5
5
|
module Reporters
|
6
6
|
# Fuubar-like reporter with a progress bar.
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# Based upon Jeff Kreefmeijer's Fuubar (MIT License) and paydro's
|
9
9
|
# monkey-patch.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# @see https://github.com/jeffkreeftmeijer/fuubar Fuubar
|
12
12
|
# @see https://gist.github.com/356945 paydro's monkey-patch
|
13
13
|
class ProgressReporter
|
14
14
|
include MiniTest::Reporter
|
15
15
|
include ANSI::Code
|
16
|
-
|
16
|
+
|
17
17
|
INFO_PADDING = 2
|
18
|
-
|
18
|
+
|
19
|
+
def initialize(backtrace_filter = MiniTest::BacktraceFilter.default_filter)
|
20
|
+
@backtrace_filter = backtrace_filter
|
21
|
+
end
|
22
|
+
|
19
23
|
def before_suites(suites, type)
|
20
24
|
puts 'Started'
|
21
25
|
puts
|
22
|
-
|
26
|
+
|
23
27
|
@color = GREEN
|
24
28
|
@finished_count = 0
|
25
29
|
@progress = ProgressBar.new("0/#{runner.test_count}", runner.test_count, runner.output)
|
26
30
|
@progress.bar_mark = '='
|
27
31
|
end
|
28
|
-
|
32
|
+
|
29
33
|
def increment
|
30
34
|
with_color do
|
31
35
|
@finished_count += 1
|
@@ -33,11 +37,11 @@ module MiniTest
|
|
33
37
|
@progress.inc
|
34
38
|
end
|
35
39
|
end
|
36
|
-
|
40
|
+
|
37
41
|
def pass(suite, test, test_runner)
|
38
42
|
increment
|
39
43
|
end
|
40
|
-
|
44
|
+
|
41
45
|
def skip(suite, test, test_runner)
|
42
46
|
@color = YELLOW unless @color == RED
|
43
47
|
print(yellow { 'SKIP' })
|
@@ -46,7 +50,7 @@ module MiniTest
|
|
46
50
|
puts
|
47
51
|
increment
|
48
52
|
end
|
49
|
-
|
53
|
+
|
50
54
|
def failure(suite, test, test_runner)
|
51
55
|
@color = RED
|
52
56
|
print(red { 'FAIL' })
|
@@ -56,7 +60,7 @@ module MiniTest
|
|
56
60
|
puts
|
57
61
|
increment
|
58
62
|
end
|
59
|
-
|
63
|
+
|
60
64
|
def error(suite, test, test_runner)
|
61
65
|
@color = RED
|
62
66
|
print(red { 'ERROR' })
|
@@ -66,12 +70,12 @@ module MiniTest
|
|
66
70
|
puts
|
67
71
|
increment
|
68
72
|
end
|
69
|
-
|
73
|
+
|
70
74
|
def after_suites(suites, type)
|
71
75
|
with_color { @progress.finish }
|
72
|
-
|
76
|
+
|
73
77
|
total_time = Time.now - runner.start_time
|
74
|
-
|
78
|
+
|
75
79
|
puts
|
76
80
|
puts('Finished in %.5fs' % total_time)
|
77
81
|
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
@@ -79,25 +83,25 @@ module MiniTest
|
|
79
83
|
print(yellow { '%d skips' } % runner.skips)
|
80
84
|
puts
|
81
85
|
end
|
82
|
-
|
86
|
+
|
83
87
|
private
|
84
|
-
|
88
|
+
|
85
89
|
def print_test_with_time(suite, test)
|
86
90
|
total_time = Time.now - runner.test_start_time
|
87
91
|
print(" #{suite}##{test} (%.2fs)#{clr}" % total_time)
|
88
92
|
end
|
89
|
-
|
93
|
+
|
90
94
|
def print_info(e)
|
91
95
|
e.message.each_line { |line| puts pad(line) }
|
92
|
-
|
93
|
-
trace =
|
96
|
+
|
97
|
+
trace = @backtrace_filter.filter(e.backtrace)
|
94
98
|
trace.each { |line| puts pad(line) }
|
95
99
|
end
|
96
|
-
|
100
|
+
|
97
101
|
def pad(str)
|
98
102
|
' ' * INFO_PADDING + str
|
99
103
|
end
|
100
|
-
|
104
|
+
|
101
105
|
def with_color
|
102
106
|
print @color
|
103
107
|
yield
|
@@ -105,4 +109,4 @@ module MiniTest
|
|
105
109
|
end
|
106
110
|
end
|
107
111
|
end
|
108
|
-
end
|
112
|
+
end
|
@@ -6,21 +6,25 @@ module MiniTest
|
|
6
6
|
# Simple reporter designed for RubyMate.
|
7
7
|
class RubyMateReporter
|
8
8
|
include MiniTest::Reporter
|
9
|
-
|
9
|
+
|
10
10
|
INFO_PADDING = 2
|
11
|
-
|
11
|
+
|
12
|
+
def initialize(backtrace_filter = MiniTest::BacktraceFilter.default_filter)
|
13
|
+
@backtrace_filter = backtrace_filter
|
14
|
+
end
|
15
|
+
|
12
16
|
def before_suites(suites, type)
|
13
17
|
puts 'Started'
|
14
18
|
puts
|
15
19
|
end
|
16
|
-
|
20
|
+
|
17
21
|
def skip(suite, test, test_runner)
|
18
22
|
print 'SKIP'
|
19
23
|
print_test_with_time(suite, test)
|
20
24
|
puts
|
21
25
|
puts
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
def failure(suite, test, test_runner)
|
25
29
|
print 'FAIL'
|
26
30
|
print_test_with_time(suite, test)
|
@@ -28,7 +32,7 @@ module MiniTest
|
|
28
32
|
print_info(test_runner.exception)
|
29
33
|
puts
|
30
34
|
end
|
31
|
-
|
35
|
+
|
32
36
|
def error(suite, test, test_runner)
|
33
37
|
print 'ERROR'
|
34
38
|
print_test_with_time(suite, test)
|
@@ -36,10 +40,10 @@ module MiniTest
|
|
36
40
|
print_info(test_runner.exception)
|
37
41
|
puts
|
38
42
|
end
|
39
|
-
|
43
|
+
|
40
44
|
def after_suites(suites, type)
|
41
45
|
total_time = Time.now - runner.start_time
|
42
|
-
|
46
|
+
|
43
47
|
puts
|
44
48
|
puts('Finished in %.5fs' % total_time)
|
45
49
|
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
@@ -47,24 +51,24 @@ module MiniTest
|
|
47
51
|
print('%d skips' % runner.skips)
|
48
52
|
puts
|
49
53
|
end
|
50
|
-
|
54
|
+
|
51
55
|
private
|
52
|
-
|
56
|
+
|
53
57
|
def print_test_with_time(suite, test)
|
54
58
|
total_time = Time.now - runner.test_start_time
|
55
59
|
print(" #{suite}##{test} (%.2fs)" % total_time)
|
56
60
|
end
|
57
|
-
|
61
|
+
|
58
62
|
def print_info(e)
|
59
63
|
e.message.each_line { |line| puts pad(line) }
|
60
|
-
|
61
|
-
trace =
|
64
|
+
|
65
|
+
trace = @backtrace_filter.filter(e.backtrace)
|
62
66
|
trace.each { |line| puts pad(line) }
|
63
67
|
end
|
64
|
-
|
68
|
+
|
65
69
|
def pad(str)
|
66
70
|
' ' * INFO_PADDING + str
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
70
|
-
end
|
74
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# Test results reporter for RubyMine IDE (http://www.jetbrains.com/ruby/) and
|
2
|
+
# TeamCity(http://www.jetbrains.com/teamcity/) Continuous Integration Server
|
3
|
+
#
|
4
|
+
# Usage:
|
5
|
+
# # in test_helper.rb
|
6
|
+
# ...
|
7
|
+
# if ENV["RM_INFO"] || ENV["TEAMCITY_VERSION"]
|
8
|
+
# MiniTest::Unit.runner.reporters << MiniTest::Reporters::RubyMineReporter.new
|
9
|
+
# else
|
10
|
+
# MiniTest::Unit.runner.reporters << MiniTest::Reporters::DefaultReporter.new
|
11
|
+
# end
|
12
|
+
|
13
|
+
require "ansi"
|
14
|
+
begin
|
15
|
+
require 'teamcity/runner_common'
|
16
|
+
require 'teamcity/utils/service_message_factory'
|
17
|
+
require 'teamcity/utils/runner_utils'
|
18
|
+
require 'teamcity/utils/url_formatter'
|
19
|
+
rescue LoadError
|
20
|
+
MiniTest::Unit.runner.output.puts("====================================================================================================\n")
|
21
|
+
MiniTest::Unit.runner.output.puts("RubyMine reporter works only if it test was launched using RubyMine IDE or TeamCity CI server !!!\n")
|
22
|
+
MiniTest::Unit.runner.output.puts("====================================================================================================\n")
|
23
|
+
MiniTest::Unit.runner.output.puts("Using default results reporter...\n")
|
24
|
+
|
25
|
+
require "minitest/reporters/default_reporter"
|
26
|
+
|
27
|
+
# delegate to default reporter
|
28
|
+
module MiniTest
|
29
|
+
module Reporters
|
30
|
+
class RubyMineReporter < MiniTest::Reporters::DefaultReporter
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
else
|
35
|
+
module MiniTest
|
36
|
+
module Reporters
|
37
|
+
class RubyMineReporter
|
38
|
+
include MiniTest::Reporter
|
39
|
+
include ANSI::Code
|
40
|
+
|
41
|
+
include ::Rake::TeamCity::RunnerCommon
|
42
|
+
include ::Rake::TeamCity::RunnerUtils
|
43
|
+
include ::Rake::TeamCity::Utils::UrlFormatter
|
44
|
+
|
45
|
+
def runner
|
46
|
+
MiniTest::Unit.runner
|
47
|
+
end
|
48
|
+
|
49
|
+
def output
|
50
|
+
runner.output
|
51
|
+
end
|
52
|
+
|
53
|
+
def verbose?
|
54
|
+
runner.verbose
|
55
|
+
end
|
56
|
+
|
57
|
+
def print(*args)
|
58
|
+
runner.output.print(*args)
|
59
|
+
end
|
60
|
+
|
61
|
+
def puts(*args)
|
62
|
+
runner.output.puts(*args)
|
63
|
+
end
|
64
|
+
|
65
|
+
def before_suites(suites, type)
|
66
|
+
puts 'Started'
|
67
|
+
puts
|
68
|
+
|
69
|
+
# Setup test runner's MessageFactory
|
70
|
+
set_message_factory(Rake::TeamCity::MessageFactory)
|
71
|
+
log_test_reporter_attached()
|
72
|
+
|
73
|
+
# Report tests count:
|
74
|
+
test_count = runner.test_count
|
75
|
+
if ::Rake::TeamCity.is_in_idea_mode
|
76
|
+
log(@message_factory.create_tests_count(test_count))
|
77
|
+
elsif ::Rake::TeamCity.is_in_buildserver_mode
|
78
|
+
log(@message_factory.create_progress_message("Starting.. (#{test_count} tests)"))
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def after_suites(suites, type)
|
84
|
+
total_time = Time.now - runner.start_time
|
85
|
+
|
86
|
+
puts('Finished in %.5fs' % total_time)
|
87
|
+
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
88
|
+
print(red { '%d failures, %d errors, ' } % [runner.failures, runner.errors])
|
89
|
+
print(yellow { '%d skips' } % runner.skips)
|
90
|
+
puts
|
91
|
+
end
|
92
|
+
|
93
|
+
def before_suite(suite)
|
94
|
+
fqn = suite.name
|
95
|
+
log(@message_factory.create_suite_started(suite.name, location_from_ruby_qualified_name(fqn)))
|
96
|
+
end
|
97
|
+
|
98
|
+
def after_suite(suite)
|
99
|
+
log(@message_factory.create_suite_finished(suite.name))
|
100
|
+
end
|
101
|
+
|
102
|
+
def before_test(suite, test)
|
103
|
+
fqn = "#{suite.name}.#{test.to_s}"
|
104
|
+
log(@message_factory.create_test_started(test, minitest_test_location(fqn)))
|
105
|
+
end
|
106
|
+
|
107
|
+
def pass(suite, test, test_runner)
|
108
|
+
test_finished(test, test_runner)
|
109
|
+
end
|
110
|
+
|
111
|
+
def skip(suite, test, test_runner)
|
112
|
+
test_finished(test, test_runner) do |exception_msg, backtrace|
|
113
|
+
log(@message_factory.create_test_ignored(test, exception_msg, backtrace))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def failure(suite, test, test_runner)
|
118
|
+
test_finished(test, test_runner) do |exception_msg, backtrace|
|
119
|
+
log(@message_factory.create_test_failed(test, exception_msg, backtrace))
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def error(suite, test, test_runner)
|
124
|
+
test_finished(test, test_runner) do |exception_msg, backtrace|
|
125
|
+
log(@message_factory.create_test_error(test, exception_msg, backtrace))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
#########
|
130
|
+
def log(msg)
|
131
|
+
output.flush
|
132
|
+
output.puts("\n#{msg}")
|
133
|
+
output.flush
|
134
|
+
|
135
|
+
# returns:
|
136
|
+
msg
|
137
|
+
end
|
138
|
+
|
139
|
+
def minitest_test_location(fqn)
|
140
|
+
return nil if (fqn.nil?)
|
141
|
+
"ruby_minitest_qn://#{fqn}"
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_finished(test, test_runner)
|
145
|
+
duration_ms = get_current_time_in_ms() - get_time_in_ms(runner.test_start_time)
|
146
|
+
|
147
|
+
begin
|
148
|
+
if block_given?
|
149
|
+
exception = test_runner.exception
|
150
|
+
msg = exception.nil? ? "" : "#{exception.class.name}: #{exception.message}"
|
151
|
+
backtrace = exception.nil? ? "" : format_backtrace(exception.backtrace)
|
152
|
+
|
153
|
+
yield(msg, backtrace)
|
154
|
+
end
|
155
|
+
ensure
|
156
|
+
log(@message_factory.create_test_finished(test, duration_ms.nil? ? 0 : duration_ms))
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
@@ -3,54 +3,58 @@ require 'ansi'
|
|
3
3
|
module MiniTest
|
4
4
|
module Reporters
|
5
5
|
# Turn-like reporter that reads like a spec.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Based upon TwP's turn (MIT License) and paydro's monkey-patch.
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# @see https://github.com/TwP/turn turn
|
10
10
|
# @see https://gist.github.com/356945 paydro's monkey-patch
|
11
11
|
class SpecReporter
|
12
12
|
include MiniTest::Reporter
|
13
13
|
include ANSI::Code
|
14
|
-
|
14
|
+
|
15
15
|
TEST_PADDING = 2
|
16
16
|
INFO_PADDING = 8
|
17
17
|
MARK_SIZE = 5
|
18
|
-
|
18
|
+
|
19
|
+
def initialize(backtrace_filter = MiniTest::BacktraceFilter.default_filter)
|
20
|
+
@backtrace_filter = backtrace_filter
|
21
|
+
end
|
22
|
+
|
19
23
|
def before_suites(suites, type)
|
20
24
|
puts 'Started'
|
21
25
|
puts
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
def after_suites(suites, type)
|
25
29
|
total_time = Time.now - runner.start_time
|
26
|
-
|
30
|
+
|
27
31
|
puts('Finished in %.5fs' % total_time)
|
28
32
|
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
29
33
|
print(red { '%d failures, %d errors, ' } % [runner.failures, runner.errors])
|
30
34
|
print(yellow { '%d skips' } % runner.skips)
|
31
35
|
puts
|
32
36
|
end
|
33
|
-
|
37
|
+
|
34
38
|
def before_suite(suite)
|
35
|
-
puts suite
|
39
|
+
puts suite.name
|
36
40
|
end
|
37
|
-
|
41
|
+
|
38
42
|
def after_suite(suite)
|
39
43
|
puts
|
40
44
|
end
|
41
|
-
|
45
|
+
|
42
46
|
def pass(suite, test, test_runner)
|
43
47
|
print(green { pad_mark('PASS') })
|
44
48
|
print_test_with_time(test)
|
45
49
|
puts
|
46
50
|
end
|
47
|
-
|
51
|
+
|
48
52
|
def skip(suite, test, test_runner)
|
49
53
|
print(yellow { pad_mark('SKIP') })
|
50
54
|
print_test_with_time(test)
|
51
55
|
puts
|
52
56
|
end
|
53
|
-
|
57
|
+
|
54
58
|
def failure(suite, test, test_runner)
|
55
59
|
print(red { pad_mark('FAIL') })
|
56
60
|
print_test_with_time(test)
|
@@ -58,7 +62,7 @@ module MiniTest
|
|
58
62
|
print_info(test_runner.exception)
|
59
63
|
puts
|
60
64
|
end
|
61
|
-
|
65
|
+
|
62
66
|
def error(suite, test, test_runner)
|
63
67
|
print(red { pad_mark('ERROR') })
|
64
68
|
print_test_with_time(test)
|
@@ -66,28 +70,28 @@ module MiniTest
|
|
66
70
|
print_info(test_runner.exception)
|
67
71
|
puts
|
68
72
|
end
|
69
|
-
|
73
|
+
|
70
74
|
private
|
71
|
-
|
75
|
+
|
72
76
|
def print_test_with_time(test)
|
73
77
|
total_time = Time.now - runner.test_start_time
|
74
|
-
print("
|
78
|
+
print(" %s (%.2fs)" % [test, total_time])
|
75
79
|
end
|
76
|
-
|
80
|
+
|
77
81
|
def print_info(e)
|
78
82
|
e.message.each_line { |line| puts pad(line, INFO_PADDING) }
|
79
|
-
|
80
|
-
trace =
|
83
|
+
|
84
|
+
trace = @backtrace_filter.filter(e.backtrace)
|
81
85
|
trace.each { |line| puts pad(line, INFO_PADDING) }
|
82
86
|
end
|
83
|
-
|
87
|
+
|
84
88
|
def pad(str, size)
|
85
89
|
' ' * size + str
|
86
90
|
end
|
87
|
-
|
91
|
+
|
88
92
|
def pad_mark(str)
|
89
93
|
pad("%#{MARK_SIZE}s" % str, TEST_PADDING)
|
90
94
|
end
|
91
95
|
end
|
92
96
|
end
|
93
|
-
end
|
97
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module MiniTestReportersTest
|
4
|
+
class BacktraceFilterTest < TestCase
|
5
|
+
def setup
|
6
|
+
@default_filter = MiniTest::BacktraceFilter.default_filter
|
7
|
+
@filter = MiniTest::BacktraceFilter.new
|
8
|
+
@backtrace = ["foo", "bar", "baz"]
|
9
|
+
end
|
10
|
+
|
11
|
+
test "adding filters" do
|
12
|
+
@filter.add_filter(/foo/)
|
13
|
+
assert @filter.filters?("foo")
|
14
|
+
refute @filter.filters?("baz")
|
15
|
+
end
|
16
|
+
|
17
|
+
test "filter backtrace when first line is filtered" do
|
18
|
+
@filter.add_filter(/foo/)
|
19
|
+
assert_equal ["bar", "baz"], @filter.filter(@backtrace)
|
20
|
+
end
|
21
|
+
|
22
|
+
test "filter backtrace when middle line is filtered" do
|
23
|
+
@filter.add_filter(/bar/)
|
24
|
+
assert_equal ["foo"], @filter.filter(@backtrace)
|
25
|
+
end
|
26
|
+
|
27
|
+
test "filter backtrace when all lines are filtered" do
|
28
|
+
@filter.add_filter(/./)
|
29
|
+
assert_equal ["foo", "bar", "baz"], @filter.filter(@backtrace)
|
30
|
+
end
|
31
|
+
|
32
|
+
test "default filter" do
|
33
|
+
assert @default_filter.filters?("lib/minitest")
|
34
|
+
assert @default_filter.filters?("lib/minitest/reporters")
|
35
|
+
refute @default_filter.filters?("lib/my_gem")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/test/test_helper.rb
CHANGED
@@ -6,7 +6,7 @@ require 'minitest/reporters'
|
|
6
6
|
|
7
7
|
module MiniTestReportersTest
|
8
8
|
require File.expand_path('../support/test_case', __FILE__)
|
9
|
-
|
9
|
+
|
10
10
|
module Fixtures
|
11
11
|
require File.expand_path('../support/fixtures/test_case_fixture', __FILE__)
|
12
12
|
require File.expand_path('../support/fixtures/empty_test_fixture', __FILE__)
|
@@ -24,13 +24,15 @@ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
|
|
24
24
|
# brittle. Consequently, there are no unit tests for them. Instead, uncomment
|
25
25
|
# the reporter that you'd like to test and run the full test suite. Make sure to
|
26
26
|
# try them with skipped, failing, and error tests as well!
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# Personally, I like the progress reporter. Make sure you don't change that line
|
29
29
|
# when you commit.
|
30
|
-
if ENV[
|
30
|
+
if ENV["TM_PID"]
|
31
31
|
MiniTest::Unit.runner.reporters << MiniTest::Reporters::RubyMateReporter.new
|
32
|
+
elsif ENV["RM_INFO"]
|
33
|
+
MiniTest::Unit.runner.reporters << MiniTest::Reporters::RubyMineReporter.new
|
32
34
|
else
|
33
35
|
# MiniTest::Unit.runner.reporters << MiniTest::Reporters::DefaultReporter.new
|
34
36
|
# MiniTest::Unit.runner.reporters << MiniTest::Reporters::SpecReporter.new
|
35
37
|
MiniTest::Unit.runner.reporters << MiniTest::Reporters::ProgressReporter.new
|
36
|
-
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-reporters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-22 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
16
|
-
requirement: &
|
16
|
+
requirement: &70355216336440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '2.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70355216336440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ansi
|
27
|
-
requirement: &
|
27
|
+
requirement: &70355216335720 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70355216335720
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ruby-progressbar
|
38
|
-
requirement: &
|
38
|
+
requirement: &70355216335180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70355216335180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: mocha
|
49
|
-
requirement: &
|
49
|
+
requirement: &70355216334660 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70355216334660
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: maruku
|
60
|
-
requirement: &
|
60
|
+
requirement: &70355216334060 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70355216334060
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: test_declarative
|
71
|
-
requirement: &
|
71
|
+
requirement: &70355216333360 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70355216333360
|
80
80
|
description: Death to haphazard monkey-patching! Extend MiniTest through simple hooks.
|
81
81
|
email:
|
82
82
|
- alex@kernul.com
|
@@ -91,19 +91,22 @@ files:
|
|
91
91
|
- LICENSE
|
92
92
|
- README.md
|
93
93
|
- Rakefile
|
94
|
+
- lib/minitest/backtrace_filter.rb
|
94
95
|
- lib/minitest/reporter.rb
|
95
96
|
- lib/minitest/reporters.rb
|
96
97
|
- lib/minitest/reporters/default_reporter.rb
|
97
98
|
- lib/minitest/reporters/progress_reporter.rb
|
98
99
|
- lib/minitest/reporters/ruby_mate_reporter.rb
|
100
|
+
- lib/minitest/reporters/rubymine_reporter.rb
|
99
101
|
- lib/minitest/reporters/spec_reporter.rb
|
100
102
|
- lib/minitest/reporters/version.rb
|
101
103
|
- lib/minitest/suite_runner.rb
|
102
104
|
- lib/minitest/test_runner.rb
|
103
105
|
- minitest-reporters.gemspec
|
104
|
-
- test/
|
105
|
-
- test/
|
106
|
-
- test/
|
106
|
+
- test/minitest/backtrace_filter_test.rb
|
107
|
+
- test/minitest/reporter_test.rb
|
108
|
+
- test/minitest/suite_runner_test.rb
|
109
|
+
- test/minitest/test_runner_test.rb
|
107
110
|
- test/support/fixtures/empty_test_fixture.rb
|
108
111
|
- test/support/fixtures/error_test_fixture.rb
|
109
112
|
- test/support/fixtures/failure_test_fixture.rb
|
@@ -133,14 +136,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
136
|
version: '0'
|
134
137
|
requirements: []
|
135
138
|
rubyforge_project: minitest-reporters
|
136
|
-
rubygems_version: 1.8.
|
139
|
+
rubygems_version: 1.8.10
|
137
140
|
signing_key:
|
138
141
|
specification_version: 3
|
139
142
|
summary: Create customizable MiniTest output formats
|
140
143
|
test_files:
|
141
|
-
- test/
|
142
|
-
- test/
|
143
|
-
- test/
|
144
|
+
- test/minitest/backtrace_filter_test.rb
|
145
|
+
- test/minitest/reporter_test.rb
|
146
|
+
- test/minitest/suite_runner_test.rb
|
147
|
+
- test/minitest/test_runner_test.rb
|
144
148
|
- test/support/fixtures/empty_test_fixture.rb
|
145
149
|
- test/support/fixtures/error_test_fixture.rb
|
146
150
|
- test/support/fixtures/failure_test_fixture.rb
|
@@ -150,3 +154,4 @@ test_files:
|
|
150
154
|
- test/support/fixtures/test_case_fixture.rb
|
151
155
|
- test/support/test_case.rb
|
152
156
|
- test/test_helper.rb
|
157
|
+
has_rdoc:
|