minitest-junit 1.1.0 → 2.0.1
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/.github/workflows/main.yml +34 -0
- data/lib/minitest/junit/version.rb +1 -1
- data/lib/minitest/junit.rb +56 -27
- data/minitest-junit.gemspec +5 -3
- data/test/reporter_test.rb +35 -6
- data/test/testcase_formatter_test.rb +5 -2
- data/test/tmp/.keep +0 -0
- metadata +46 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a6272dfe9b52525afbcfc9a98fa0610bca6531d685f2e1c2bb5c838ac55480
|
4
|
+
data.tar.gz: 561f4eb58db6d84edd0c6da41aa463f736a14984870aa7b4f00e6bdefae09133
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57482ae234635c9a5f9f697d964361b614e8d47da5a5a60e9e49ae4a7f1aab7b7771af7f902f0cbb49272c2404bd9e612913d7926a7c8c437a116d9b01dc2f58
|
7
|
+
data.tar.gz: 33b11351e74c51bd4ba23549165b4138837574396d08a2da97c0e33e51ae0efcf9a84c5367d1d2f328005deb66763372462ef209968b96d0ae20111a71715dfc
|
@@ -0,0 +1,34 @@
|
|
1
|
+
name: Main
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches: [release]
|
5
|
+
pull_request:
|
6
|
+
types: [opened, synchronize]
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
tests:
|
10
|
+
name: Tests
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
fail-fast: false
|
14
|
+
matrix:
|
15
|
+
ruby: ["2.7", "3.0", "3.1", "3.2"]
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- name: Checkout code
|
19
|
+
uses: actions/checkout@v4
|
20
|
+
|
21
|
+
- name: Setup Ruby
|
22
|
+
uses: ruby/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.ruby }}
|
25
|
+
bundler-cache: true
|
26
|
+
|
27
|
+
- name: Generate lockfile
|
28
|
+
run: bundle lock
|
29
|
+
|
30
|
+
- name: Bundle
|
31
|
+
run: bundle check || bundle install
|
32
|
+
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake test
|
data/lib/minitest/junit.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'minitest/junit/version'
|
2
2
|
require 'minitest'
|
3
|
-
require '
|
3
|
+
require 'ox'
|
4
4
|
require 'socket'
|
5
5
|
require 'time'
|
6
6
|
|
@@ -28,36 +28,55 @@ module Minitest
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def report
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
@
|
31
|
+
doc = Ox::Document.new(version: '1.0', encoding: 'UTF-8')
|
32
|
+
instruct = Ox::Instruct.new(:xml)
|
33
|
+
instruct[:version] = '1.0'
|
34
|
+
instruct[:encoding] = 'UTF-8'
|
35
|
+
doc << instruct
|
36
|
+
|
37
|
+
testsuite = Ox::Element.new('testsuite')
|
38
|
+
testsuite['name'] = @options[:name] || 'minitest'
|
39
|
+
testsuite['timestamp'] = @options[:timestamp]
|
40
|
+
testsuite['hostname'] = @options[:hostname]
|
41
|
+
testsuite['tests'] = @results.size
|
42
|
+
testsuite['skipped'] = @results.count(&:skipped?)
|
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, :+))
|
46
|
+
@results.each do |result|
|
47
|
+
testsuite << format(result)
|
48
|
+
end
|
49
|
+
|
50
|
+
testsuites = Ox::Element.new('testsuites')
|
51
|
+
testsuites << testsuite
|
52
|
+
|
53
|
+
doc << testsuites
|
54
|
+
@io << Ox.dump(doc)
|
43
55
|
end
|
44
56
|
|
45
57
|
def format(result, parent = nil)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
+
testcase = Ox::Element.new('testcase')
|
59
|
+
testcase['classname'] = format_class(result)
|
60
|
+
testcase['name'] = format_name(result)
|
61
|
+
testcase['time'] = format_time(result.time)
|
62
|
+
testcase['file'] = relative_to_cwd(result.source_location.first)
|
63
|
+
testcase['line'] = result.source_location.last
|
64
|
+
testcase['assertions'] = result.assertions
|
65
|
+
if result.skipped?
|
66
|
+
skipped = Ox::Element.new('skipped')
|
67
|
+
skipped['message'] = result
|
68
|
+
skipped << ""
|
69
|
+
testcase << skipped
|
70
|
+
else
|
71
|
+
result.failures.each do |failure|
|
72
|
+
failure_tag = Ox::Element.new(classify(failure))
|
73
|
+
failure_tag['message'] = result
|
74
|
+
failure_tag << format_backtrace(failure)
|
75
|
+
testcase << failure_tag
|
58
76
|
end
|
59
77
|
end
|
60
|
-
|
78
|
+
|
79
|
+
testcase
|
61
80
|
end
|
62
81
|
|
63
82
|
private
|
@@ -70,8 +89,18 @@ module Minitest
|
|
70
89
|
end
|
71
90
|
end
|
72
91
|
|
92
|
+
def working_directory
|
93
|
+
@working_directory ||= Dir.getwd
|
94
|
+
end
|
95
|
+
|
96
|
+
def relative_to_cwd(path)
|
97
|
+
path.sub(working_directory, '.')
|
98
|
+
end
|
99
|
+
|
73
100
|
def format_backtrace(failure)
|
74
|
-
failure.backtrace.
|
101
|
+
Minitest.filter_backtrace(failure.backtrace).map do |line|
|
102
|
+
relative_to_cwd(line)
|
103
|
+
end.join("\n")
|
75
104
|
end
|
76
105
|
|
77
106
|
def format_class(result)
|
data/minitest-junit.gemspec
CHANGED
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_dependency 'minitest', '~> 5.11'
|
22
|
-
spec.add_dependency '
|
22
|
+
spec.add_dependency 'ox', '~> 2', '>= 2.14.2'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler'
|
25
|
-
spec.add_development_dependency '
|
26
|
-
spec.add_development_dependency '
|
25
|
+
spec.add_development_dependency 'nokogiri'
|
26
|
+
spec.add_development_dependency 'pry-byebug'
|
27
|
+
spec.add_development_dependency 'rake', '~> 13'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 1'
|
27
29
|
end
|
data/test/reporter_test.rb
CHANGED
@@ -1,17 +1,34 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
-
require 'builder'
|
3
2
|
require 'stringio'
|
4
3
|
require 'time'
|
4
|
+
require 'nokogiri'
|
5
5
|
|
6
6
|
require 'minitest/junit'
|
7
7
|
|
8
|
+
class FakeTestName; end
|
9
|
+
|
8
10
|
class ReporterTest < Minitest::Test
|
9
11
|
def test_no_tests_generates_an_empty_suite
|
10
12
|
reporter = create_reporter
|
11
13
|
|
12
14
|
reporter.report
|
13
15
|
|
14
|
-
assert_match(
|
16
|
+
assert_match(
|
17
|
+
%r{<?xml version="1.0" encoding="UTF-8"\?>\n<testsuites>\n <testsuite name="minitest" timestamp="[^"]+" hostname="[^"]+" tests="0" skipped="0" failures="0" errors="0" time="0.000000"\/>\n<\/testsuites>\n},
|
18
|
+
reporter.output
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
# NOTE: This test will generate a temp file: "test/tmp/report.xml"
|
23
|
+
def test_encoding
|
24
|
+
# Enforce File.external_encoding to UTF-8 to ensure that ASCII character will be correctly converted to UTF-8
|
25
|
+
file = File.new('test/tmp/report.xml', 'w:UTF-8')
|
26
|
+
reporter = Minitest::Junit::Reporter.new file, { hostname: '‹foo›' }
|
27
|
+
reporter.start
|
28
|
+
reporter.report
|
29
|
+
file.close
|
30
|
+
|
31
|
+
assert_match(/hostname="‹foo›"/, File.new('test/tmp/report.xml', 'r:UTF-8').read)
|
15
32
|
end
|
16
33
|
|
17
34
|
def test_formats_each_successful_result_with_a_formatter
|
@@ -28,11 +45,23 @@ class ReporterTest < Minitest::Test
|
|
28
45
|
reporter = create_reporter
|
29
46
|
|
30
47
|
results = do_formatting_test(reporter, count: rand(100), cause_failures: 1)
|
31
|
-
|
48
|
+
parsed_report = Nokogiri::XML(reporter.output)
|
32
49
|
results.each do |result|
|
33
|
-
|
34
|
-
assert_match(/<failure/, reporter.output)
|
50
|
+
parsed_report.xpath("//testcase[@name='#{result.name}']").any?
|
35
51
|
end
|
52
|
+
# Check if some testcase has a failure
|
53
|
+
assert parsed_report.xpath("//testcase//failure").any?
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_xml_nodes_has_file_and_line_attributes
|
57
|
+
reporter = create_reporter
|
58
|
+
results = do_formatting_test(reporter, count: 2, cause_failures: 1)
|
59
|
+
parsed_report = Nokogiri::XML(reporter.output)
|
60
|
+
example_node = parsed_report.xpath("//testcase").first
|
61
|
+
assert example_node.has_attribute?('file')
|
62
|
+
assert example_node.has_attribute?('line')
|
63
|
+
assert_equal 'unknown', example_node.attribute('file').value
|
64
|
+
assert_equal '-1', example_node.attribute('line').value
|
36
65
|
end
|
37
66
|
|
38
67
|
private
|
@@ -60,7 +89,7 @@ class ReporterTest < Minitest::Test
|
|
60
89
|
test.failures = failures.times.map do |i|
|
61
90
|
Class.new Minitest::Assertion do
|
62
91
|
define_method 'backtrace' do
|
63
|
-
["Model failure \##{i}", 'This is a test backtrace']
|
92
|
+
["Model failure \##{i}", 'This is a test backtrace', "#{__FILE__}:#{__LINE__}"]
|
64
93
|
end
|
65
94
|
end.new
|
66
95
|
end
|
@@ -17,7 +17,10 @@ class TestCaseFormatter < Minitest::Test
|
|
17
17
|
test = create_test_result
|
18
18
|
reporter = create_reporter
|
19
19
|
|
20
|
-
assert_match
|
20
|
+
assert_match(
|
21
|
+
test.name,
|
22
|
+
reporter.format(test).attributes['name']
|
23
|
+
)
|
21
24
|
end
|
22
25
|
|
23
26
|
def test_skipped_tests_generates_skipped_tag
|
@@ -28,7 +31,7 @@ class TestCaseFormatter < Minitest::Test
|
|
28
31
|
|
29
32
|
reporter.report
|
30
33
|
|
31
|
-
assert_match(/<skipped message="[^<>]+"
|
34
|
+
assert_match(/<skipped message="[^<>]+"\><\/skipped>\n\s+<\/testcase>\n\s*<\/testsuite>\n/, reporter.output)
|
32
35
|
end
|
33
36
|
|
34
37
|
def test_failing_tests_creates_failure_tag
|
data/test/tmp/.keep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-junit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Allan Espinosa
|
@@ -25,19 +25,25 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ox
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.14.2
|
34
37
|
type: :runtime
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
41
|
- - "~>"
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
43
|
+
version: '2'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.14.2
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: bundler
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,34 +58,62 @@ dependencies:
|
|
52
58
|
- - ">="
|
53
59
|
- !ruby/object:Gem::Version
|
54
60
|
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: nokogiri
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: pry-byebug
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
55
89
|
- !ruby/object:Gem::Dependency
|
56
90
|
name: rake
|
57
91
|
requirement: !ruby/object:Gem::Requirement
|
58
92
|
requirements:
|
59
93
|
- - "~>"
|
60
94
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
95
|
+
version: '13'
|
62
96
|
type: :development
|
63
97
|
prerelease: false
|
64
98
|
version_requirements: !ruby/object:Gem::Requirement
|
65
99
|
requirements:
|
66
100
|
- - "~>"
|
67
101
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
102
|
+
version: '13'
|
69
103
|
- !ruby/object:Gem::Dependency
|
70
104
|
name: rubocop
|
71
105
|
requirement: !ruby/object:Gem::Requirement
|
72
106
|
requirements:
|
73
107
|
- - "~>"
|
74
108
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
109
|
+
version: '1'
|
76
110
|
type: :development
|
77
111
|
prerelease: false
|
78
112
|
version_requirements: !ruby/object:Gem::Requirement
|
79
113
|
requirements:
|
80
114
|
- - "~>"
|
81
115
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
116
|
+
version: '1'
|
83
117
|
description: Junit reporter for Minitest ~> 5.0
|
84
118
|
email:
|
85
119
|
- allan.espinosa@outlook.com
|
@@ -87,6 +121,7 @@ executables: []
|
|
87
121
|
extensions: []
|
88
122
|
extra_rdoc_files: []
|
89
123
|
files:
|
124
|
+
- ".github/workflows/main.yml"
|
90
125
|
- ".gitignore"
|
91
126
|
- Gemfile
|
92
127
|
- LICENSE.txt
|
@@ -100,6 +135,7 @@ files:
|
|
100
135
|
- test/junit_plugin_test.rb
|
101
136
|
- test/reporter_test.rb
|
102
137
|
- test/testcase_formatter_test.rb
|
138
|
+
- test/tmp/.keep
|
103
139
|
homepage: http://github.com/aespinosa/minitest-junit
|
104
140
|
licenses:
|
105
141
|
- MIT
|
@@ -119,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
155
|
- !ruby/object:Gem::Version
|
120
156
|
version: '0'
|
121
157
|
requirements: []
|
122
|
-
rubygems_version: 3.
|
158
|
+
rubygems_version: 3.4.13
|
123
159
|
signing_key:
|
124
160
|
specification_version: 4
|
125
161
|
summary: Junit reporter for Minitest ~> 5.0
|
@@ -128,3 +164,4 @@ test_files:
|
|
128
164
|
- test/junit_plugin_test.rb
|
129
165
|
- test/reporter_test.rb
|
130
166
|
- test/testcase_formatter_test.rb
|
167
|
+
- test/tmp/.keep
|