minitest-reporters 0.6.0 → 0.7.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.
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'ansi'
|
2
|
+
require 'builder'
|
3
|
+
require 'fileutils'
|
4
|
+
module MiniTest
|
5
|
+
module Reporters
|
6
|
+
# A reporter for writing JUnit test reports
|
7
|
+
# Intended for easy integration with CI servers - tested on JetBrains TeamCity
|
8
|
+
#
|
9
|
+
# Inspired by ci_reporter (see https://github.com/nicksieger/ci_reporter)
|
10
|
+
# Also inspired by Marc Seeger's attempt at producing a JUnitReporter (see https://github.com/rb2k/minitest-reporters/commit/e13d95b5f884453a9c77f62bc5cba3fa1df30ef5)
|
11
|
+
# Also inspired by minitest-ci (see https://github.com/bhenderson/minitest-ci)
|
12
|
+
class JUnitReporter
|
13
|
+
include MiniTest::Reporter
|
14
|
+
|
15
|
+
def initialize(reports_dir = "test/reports", backtrace_filter = MiniTest::BacktraceFilter.default_filter)
|
16
|
+
@backtrace_filter = backtrace_filter
|
17
|
+
@reports_path = File.join(Dir.getwd, reports_dir)
|
18
|
+
p "Emptying #{@reports_path}"
|
19
|
+
FileUtils.remove_dir(@reports_path) if File.exists?(@reports_path)
|
20
|
+
FileUtils.mkdir_p(@reports_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def after_suites(suites, type)
|
24
|
+
p "Writing XML reports to #{@reports_path}"
|
25
|
+
runner.report.each do |suite, tests|
|
26
|
+
suite_result = analyze_suite(suite, tests)
|
27
|
+
|
28
|
+
xml = Builder::XmlMarkup.new(:indent => 2)
|
29
|
+
xml.instruct!
|
30
|
+
xml.testsuite(:name => suite, :skipped => suite_result[:skip_count], :failures => suite_result[:failure_count], :errors => suite_result[:error_count], :tests => suite_result[:test_count], :assertions => suite_result[:assertion_count]) do
|
31
|
+
tests.each do |test, test_runner|
|
32
|
+
xml.testcase(:name => test_runner.test, :classname => suite, :assertions => test_runner.assertions) do
|
33
|
+
xml << xml_message_for(test_runner) if test_runner.result != :pass
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
IO.write(filename_for(suite), xml.target!)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def xml_message_for(test_runner)
|
44
|
+
# This is a trick lifted from ci_reporter
|
45
|
+
xml = Builder::XmlMarkup.new(:indent => 2, :margin => 2)
|
46
|
+
def xml.trunc!(txt)
|
47
|
+
txt.sub(/\n.*/m, '...')
|
48
|
+
end
|
49
|
+
|
50
|
+
test = test_runner.test
|
51
|
+
e = test_runner.exception
|
52
|
+
|
53
|
+
case test_runner.result
|
54
|
+
when :skip
|
55
|
+
xml.skipped(:type => test)
|
56
|
+
when :error
|
57
|
+
xml.error(:type => test, :message => xml.trunc!(e.message)) do
|
58
|
+
xml.text!(message_for(test_runner))
|
59
|
+
end
|
60
|
+
when :failure
|
61
|
+
xml.failure(:type => test, :message => xml.trunc!(e.message)) do
|
62
|
+
xml.text!(message_for(test_runner))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def message_for(test_runner)
|
68
|
+
suite = test_runner.suite
|
69
|
+
test = test_runner.test
|
70
|
+
e = test_runner.exception
|
71
|
+
|
72
|
+
case test_runner.result
|
73
|
+
when :pass then nil
|
74
|
+
when :skip then "Skipped:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
75
|
+
when :failure then "Failure:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
76
|
+
when :error
|
77
|
+
bt = @backtrace_filter.filter(test_runner.exception.backtrace).join "\n "
|
78
|
+
"Error:\n#{test}(#{suite}):\n#{e.class}: #{e.message}\n #{bt}\n"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def location(exception)
|
84
|
+
last_before_assertion = ''
|
85
|
+
exception.backtrace.reverse_each do |s|
|
86
|
+
break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
|
87
|
+
last_before_assertion = s
|
88
|
+
end
|
89
|
+
last_before_assertion.sub(/:in .*$/, '')
|
90
|
+
end
|
91
|
+
|
92
|
+
def analyze_suite(suite, tests)
|
93
|
+
result = Hash.new(0)
|
94
|
+
tests.each do |test, test_runner|
|
95
|
+
result[:"#{test_runner.result}_count"] += 1
|
96
|
+
result[:assertion_count] += test_runner.assertions
|
97
|
+
result[:test_count] += 1
|
98
|
+
end
|
99
|
+
result
|
100
|
+
end
|
101
|
+
|
102
|
+
def filename_for(suite)
|
103
|
+
file_counter = 0
|
104
|
+
filename = "TEST-#{suite.to_s[0..240]}.xml" #restrict max filename length, to be kind to filesystems
|
105
|
+
while File.exists?(File.join(@reports_path, filename)) # restrict number of tries, to avoid infinite loops
|
106
|
+
file_counter += 1
|
107
|
+
filename = "TEST-#{suite}-#{file_counter}.xml"
|
108
|
+
p "Too many duplicate files, overwriting earlier report #{filename}" and break if file_counter >= 99
|
109
|
+
end
|
110
|
+
File.join(@reports_path, filename)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/minitest/reporters.rb
CHANGED
@@ -15,5 +15,6 @@ module MiniTest
|
|
15
15
|
autoload :RubyMateReporter, "minitest/reporters/ruby_mate_reporter"
|
16
16
|
autoload :RubyMineReporter, "minitest/reporters/rubymine_reporter"
|
17
17
|
autoload :GuardReporter, "minitest/reporters/guard_reporter"
|
18
|
+
autoload :JUnitReporter, "minitest/reporters/junit_reporter"
|
18
19
|
end
|
19
20
|
end
|
data/minitest-reporters.gemspec
CHANGED
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.7.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04
|
12
|
+
date: 2012-05-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: builder
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
79
|
name: mocha
|
64
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,6 +158,7 @@ files:
|
|
142
158
|
- lib/minitest/reporters.rb
|
143
159
|
- lib/minitest/reporters/default_reporter.rb
|
144
160
|
- lib/minitest/reporters/guard_reporter.rb
|
161
|
+
- lib/minitest/reporters/junit_reporter.rb
|
145
162
|
- lib/minitest/reporters/progress_reporter.rb
|
146
163
|
- lib/minitest/reporters/ruby_mate_reporter.rb
|
147
164
|
- lib/minitest/reporters/rubymine_reporter.rb
|
@@ -177,7 +194,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
177
194
|
version: '0'
|
178
195
|
segments:
|
179
196
|
- 0
|
180
|
-
hash:
|
197
|
+
hash: 1544985441330807724
|
181
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
199
|
none: false
|
183
200
|
requirements:
|
@@ -186,10 +203,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
203
|
version: '0'
|
187
204
|
segments:
|
188
205
|
- 0
|
189
|
-
hash:
|
206
|
+
hash: 1544985441330807724
|
190
207
|
requirements: []
|
191
208
|
rubyforge_project: minitest-reporters
|
192
|
-
rubygems_version: 1.8.
|
209
|
+
rubygems_version: 1.8.22
|
193
210
|
signing_key:
|
194
211
|
specification_version: 3
|
195
212
|
summary: Create customizable MiniTest output formats
|