minitest-junit_formatter 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +6 -7
- data/lib/minitest/junit_formatter/version.rb +1 -1
- data/lib/minitest/junit_formatter/xml_nokogiri.rb +31 -0
- data/lib/minitest/junit_formatter/xml_rexml.rb +35 -0
- data/lib/minitest/junit_formatter.rb +53 -40
- data/minitest-junit_formatter.gemspec +0 -1
- metadata +3 -21
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2244c89fd3b7c3f76b0ce49128493d789c1bea57596822f91b299f13d4366d02
|
|
4
|
+
data.tar.gz: ba60d1e162b3bf1aefcb7191a73265aad154b57e426f888831a6844bc5d44348
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 15616fc36e4d49e9424a978bea0d9b862da6e8e87f33e361ad7edbb9c0e62d47bcc4b08cbbcd6bc26d036da121804186f3a7617edd150ae2f5b6778b212a436e
|
|
7
|
+
data.tar.gz: 3097d847d538b471f8d780e7247b3609f492e39301b010dbf739b38d5276ba903d566b87507447a97bfd4e830a4f6c019e347e78fbd5daccf11b62f4601fe000
|
data/README.md
CHANGED
|
@@ -14,7 +14,7 @@ And then execute:
|
|
|
14
14
|
|
|
15
15
|
Or install it yourself as:
|
|
16
16
|
|
|
17
|
-
$ gem install minitest-
|
|
17
|
+
$ gem install minitest-junit_formatter
|
|
18
18
|
|
|
19
19
|
## Usage
|
|
20
20
|
|
|
@@ -27,10 +27,9 @@ Or install it yourself as:
|
|
|
27
27
|
--junit-jenkins Sanitize test names for Jenkins display
|
|
28
28
|
...
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Acknowledgment
|
|
31
|
+
|
|
32
|
+
This project is based on
|
|
33
|
+
|
|
34
|
+
https://github.com/aespinosa/minitest-junit
|
|
31
35
|
|
|
32
|
-
1. Fork it ( https://github.com/aespinosa/minitest-junit/fork )
|
|
33
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
34
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
35
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
|
36
|
-
5. Create a new Pull Request
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Minitest
|
|
2
|
+
module JunitFormatter
|
|
3
|
+
class NokogiriDocument
|
|
4
|
+
def document
|
|
5
|
+
@doc = Nokogiri::XML::Document.new
|
|
6
|
+
@doc.encoding = 'UTF-8'
|
|
7
|
+
@doc
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def element(name)
|
|
11
|
+
Nokogiri::XML::Node.new(name, @doc)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def set_attr(el, name, value)
|
|
15
|
+
el[name.to_s] = value.to_s
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_child(parent, child)
|
|
19
|
+
parent << child
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_text(el, text)
|
|
23
|
+
el.content = text.to_s
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def dump(doc)
|
|
27
|
+
doc.to_xml(indent: 2)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Minitest
|
|
2
|
+
module JunitFormatter
|
|
3
|
+
class RexmlDocument
|
|
4
|
+
def document
|
|
5
|
+
doc = REXML::Document.new
|
|
6
|
+
doc << REXML::XMLDecl.new('1.0', 'UTF-8')
|
|
7
|
+
doc
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def element(name)
|
|
11
|
+
REXML::Element.new(name)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def set_attr(el, name, value)
|
|
15
|
+
el.add_attribute(name, value.to_s)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_child(parent, child)
|
|
19
|
+
parent << child
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_text(el, text)
|
|
23
|
+
el.add_text(text.to_s)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def dump(doc)
|
|
27
|
+
output = String.new
|
|
28
|
+
formatter = REXML::Formatters::Pretty.new(2)
|
|
29
|
+
formatter.compact = true
|
|
30
|
+
formatter.write(doc, output)
|
|
31
|
+
output + "\n"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
require "minitest/junit_formatter/version"
|
|
2
2
|
require 'minitest'
|
|
3
|
-
require 'ox'
|
|
4
3
|
require 'socket'
|
|
5
4
|
require 'time'
|
|
6
5
|
|
|
6
|
+
# XML backend: Nokogiri (fast) > REXML (stdlib fallback).
|
|
7
|
+
begin
|
|
8
|
+
require 'nokogiri'
|
|
9
|
+
require "minitest/junit_formatter/xml_nokogiri"
|
|
10
|
+
rescue LoadError
|
|
11
|
+
require 'rexml/document'
|
|
12
|
+
require "minitest/junit_formatter/xml_rexml"
|
|
13
|
+
end
|
|
14
|
+
|
|
7
15
|
# :nodoc:
|
|
8
16
|
module Minitest
|
|
9
17
|
module JunitFormatter
|
|
@@ -15,6 +23,8 @@ module Minitest
|
|
|
15
23
|
@options = options
|
|
16
24
|
@options[:timestamp] = options.fetch(:timestamp, Time.now.iso8601)
|
|
17
25
|
@options[:hostname] = options.fetch(:hostname, Socket.gethostname)
|
|
26
|
+
|
|
27
|
+
@doc = document_factory.new
|
|
18
28
|
end
|
|
19
29
|
|
|
20
30
|
def passed?
|
|
@@ -28,52 +38,47 @@ module Minitest
|
|
|
28
38
|
end
|
|
29
39
|
|
|
30
40
|
def report
|
|
31
|
-
doc =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
doc
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
testsuite
|
|
39
|
-
testsuite
|
|
40
|
-
testsuite
|
|
41
|
-
testsuite
|
|
42
|
-
testsuite
|
|
43
|
-
testsuite['failures'] = @results.count { |result| !result.error? && result.failure }
|
|
44
|
-
testsuite['errors'] = @results.count(&:error?)
|
|
45
|
-
testsuite['time'] = format_time(@results.map(&:time).inject(0, :+))
|
|
41
|
+
doc = @doc.document
|
|
42
|
+
|
|
43
|
+
testsuites = @doc.element('testsuites')
|
|
44
|
+
testsuite = @doc.element('testsuite')
|
|
45
|
+
@doc.set_attr(testsuite, 'name', @options[:name] || 'minitest')
|
|
46
|
+
@doc.set_attr(testsuite, 'timestamp', @options[:timestamp])
|
|
47
|
+
@doc.set_attr(testsuite, 'hostname', @options[:hostname])
|
|
48
|
+
@doc.set_attr(testsuite, 'tests', @results.size)
|
|
49
|
+
@doc.set_attr(testsuite, 'skipped', @results.count(&:skipped?))
|
|
50
|
+
@doc.set_attr(testsuite, 'failures', @results.count { |result| !result.error? && result.failure })
|
|
51
|
+
@doc.set_attr(testsuite, 'errors', @results.count(&:error?))
|
|
52
|
+
@doc.set_attr(testsuite, 'time', format_time(@results.map(&:time).inject(0, :+)))
|
|
46
53
|
@results.each do |result|
|
|
47
|
-
testsuite
|
|
54
|
+
@doc.add_child(testsuite, format(result))
|
|
48
55
|
end
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
testsuites
|
|
52
|
-
|
|
53
|
-
doc << testsuites
|
|
54
|
-
@io << Ox.dump(doc)
|
|
57
|
+
@doc.add_child(testsuites, testsuite)
|
|
58
|
+
@doc.add_child(doc, testsuites)
|
|
59
|
+
@io << @doc.dump(doc)
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
def format(result, parent = nil)
|
|
58
|
-
testcase =
|
|
59
|
-
testcase
|
|
60
|
-
testcase
|
|
61
|
-
testcase
|
|
62
|
-
testcase
|
|
63
|
-
testcase
|
|
64
|
-
testcase
|
|
63
|
+
testcase = @doc.element('testcase')
|
|
64
|
+
@doc.set_attr(testcase, 'classname', format_class(result))
|
|
65
|
+
@doc.set_attr(testcase, 'name', format_name(result))
|
|
66
|
+
@doc.set_attr(testcase, 'time', format_time(result.time))
|
|
67
|
+
@doc.set_attr(testcase, 'file', relative_to_cwd(result.source_location.first))
|
|
68
|
+
@doc.set_attr(testcase, 'line', result.source_location.last)
|
|
69
|
+
@doc.set_attr(testcase, 'assertions', result.assertions)
|
|
65
70
|
|
|
66
71
|
if result.skipped?
|
|
67
|
-
skipped =
|
|
68
|
-
skipped
|
|
69
|
-
skipped
|
|
70
|
-
testcase
|
|
72
|
+
skipped = @doc.element('skipped')
|
|
73
|
+
@doc.set_attr(skipped, 'message', result)
|
|
74
|
+
@doc.add_text(skipped, '')
|
|
75
|
+
@doc.add_child(testcase, skipped)
|
|
71
76
|
else
|
|
72
77
|
result.failures.each do |failure|
|
|
73
|
-
failure_tag =
|
|
74
|
-
failure_tag
|
|
75
|
-
failure_tag
|
|
76
|
-
testcase
|
|
78
|
+
failure_tag = @doc.element(classify(failure))
|
|
79
|
+
@doc.set_attr(failure_tag, 'message', result)
|
|
80
|
+
@doc.add_text(failure_tag, format_backtrace(failure))
|
|
81
|
+
@doc.add_child(testcase, failure_tag)
|
|
77
82
|
end
|
|
78
83
|
end
|
|
79
84
|
|
|
@@ -82,9 +87,9 @@ module Minitest
|
|
|
82
87
|
# Output according to Gitlab format
|
|
83
88
|
# https://docs.gitlab.com/ee/ci/testing/unit_test_reports.html#view-junit-screenshots-on-gitlab
|
|
84
89
|
if result.respond_to?("metadata") && result.metadata[:failure_screenshot_path]
|
|
85
|
-
screenshot =
|
|
86
|
-
screenshot
|
|
87
|
-
testcase
|
|
90
|
+
screenshot = @doc.element("system-out")
|
|
91
|
+
@doc.add_text(screenshot, "[[ATTACHMENT|#{result.metadata[:failure_screenshot_path]}]]")
|
|
92
|
+
@doc.add_child(testcase, screenshot)
|
|
88
93
|
end
|
|
89
94
|
|
|
90
95
|
testcase
|
|
@@ -92,6 +97,14 @@ module Minitest
|
|
|
92
97
|
|
|
93
98
|
private
|
|
94
99
|
|
|
100
|
+
def document_factory
|
|
101
|
+
if defined?(Nokogiri)
|
|
102
|
+
NokogiriDocument
|
|
103
|
+
else
|
|
104
|
+
RexmlDocument
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
95
108
|
def classify(failure)
|
|
96
109
|
if failure.instance_of? UnexpectedError
|
|
97
110
|
'error'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: minitest-junit_formatter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jesse Chavez
|
|
@@ -24,26 +24,6 @@ dependencies:
|
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '5.11'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: ox
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '2'
|
|
34
|
-
- - ">="
|
|
35
|
-
- !ruby/object:Gem::Version
|
|
36
|
-
version: 2.14.2
|
|
37
|
-
type: :runtime
|
|
38
|
-
prerelease: false
|
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
40
|
-
requirements:
|
|
41
|
-
- - "~>"
|
|
42
|
-
- !ruby/object:Gem::Version
|
|
43
|
-
version: '2'
|
|
44
|
-
- - ">="
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: 2.14.2
|
|
47
27
|
- !ruby/object:Gem::Dependency
|
|
48
28
|
name: bundler
|
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -115,6 +95,8 @@ files:
|
|
|
115
95
|
- Rakefile
|
|
116
96
|
- lib/minitest/junit_formatter.rb
|
|
117
97
|
- lib/minitest/junit_formatter/version.rb
|
|
98
|
+
- lib/minitest/junit_formatter/xml_nokogiri.rb
|
|
99
|
+
- lib/minitest/junit_formatter/xml_rexml.rb
|
|
118
100
|
- lib/minitest/junit_formatter_plugin.rb
|
|
119
101
|
- minitest-junit_formatter.gemspec
|
|
120
102
|
- test/.rubocop.yml
|