minitest-ci 3.2.0 → 3.3.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.rdoc +12 -0
- data/lib/minitest/ci.rb +2 -136
- data/lib/minitest/ci_plugin.rb +169 -6
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a89fdbe89e6a7888a4bd89af927b956760cbd5cd
|
4
|
+
data.tar.gz: d98276bb6a0356e48e64ed9dbced315c2cb43af5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5fe3944ec63ec15e9aa93954160cd2ac08dc7b06e326d201c369d354c1224b276f8bd44306dfecbdb46d7412c30c74fbb77299bfc0564b36ca3c3fbfc4f60db
|
7
|
+
data.tar.gz: 3e79116f6edd9bae67c7566bed0b3d6c6a7966a2c6e4dddf1c11ea2431fd512128fd2c55b3cfb02ab920535d364e45e97800f5644824f9f7ca0e7648e2f77984
|
data/README.rdoc
CHANGED
@@ -80,6 +80,18 @@ Alternatively, you can add the following code to your test runner setup:
|
|
80
80
|
end
|
81
81
|
task :test => %w[ci_cleanup test:one test:two]
|
82
82
|
|
83
|
+
To configure report filename, use the `report_name` option like
|
84
|
+
|
85
|
+
Minitest::Ci.new $ci_io, { :report_name => :sha1 }
|
86
|
+
|
87
|
+
or like
|
88
|
+
|
89
|
+
machine:
|
90
|
+
environment:
|
91
|
+
TESTOPTS: "--report-name=sha1"
|
92
|
+
|
93
|
+
Supported options are: `:test_name` (default), `:sha1`, or a `Proc` (not supported through ENV var)
|
94
|
+
|
83
95
|
== REQUIREMENTS:
|
84
96
|
|
85
97
|
* Minitest > version 5
|
data/lib/minitest/ci.rb
CHANGED
@@ -1,136 +1,2 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
module Minitest
|
5
|
-
class Ci < Reporter
|
6
|
-
class << self
|
7
|
-
|
8
|
-
##
|
9
|
-
# Change the report directory. (defaults to "test/reports")
|
10
|
-
|
11
|
-
attr_accessor :report_dir
|
12
|
-
|
13
|
-
##
|
14
|
-
# Clean the report_dir between test runs? (defaults to true)
|
15
|
-
|
16
|
-
attr_accessor :clean
|
17
|
-
|
18
|
-
##
|
19
|
-
# Change the working directory. (defaults to `$PWD`)
|
20
|
-
attr_accessor :working_dir
|
21
|
-
end
|
22
|
-
|
23
|
-
self.report_dir = 'test/reports'
|
24
|
-
self.clean = true
|
25
|
-
self.working_dir = Dir.pwd
|
26
|
-
|
27
|
-
attr_accessor :io
|
28
|
-
attr_accessor :options
|
29
|
-
attr_accessor :results
|
30
|
-
|
31
|
-
def initialize io = $stdout, options = {}
|
32
|
-
self.io = io
|
33
|
-
self.options = options
|
34
|
-
self.results = Hash.new {|h,k| h[k] = []}
|
35
|
-
end
|
36
|
-
|
37
|
-
def passed?
|
38
|
-
true # don't care?
|
39
|
-
end
|
40
|
-
|
41
|
-
def start # clean
|
42
|
-
FileUtils.rm_rf report_dir if clean?
|
43
|
-
FileUtils.mkdir_p report_dir
|
44
|
-
end
|
45
|
-
|
46
|
-
def record result
|
47
|
-
results[result.class] << result
|
48
|
-
end
|
49
|
-
|
50
|
-
##
|
51
|
-
# Generate test report
|
52
|
-
def report
|
53
|
-
io.puts
|
54
|
-
io.puts '[Minitest::CI] Generating test report in JUnit XML format...'
|
55
|
-
|
56
|
-
Dir.chdir report_dir do
|
57
|
-
results.each do |name, result|
|
58
|
-
File.open(report_name(name), "w") do |f|
|
59
|
-
f.puts( generate_results(name, result) )
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def escape o
|
68
|
-
CGI.escapeHTML(o.to_s)
|
69
|
-
end
|
70
|
-
|
71
|
-
def generate_results name, results
|
72
|
-
total_time = assertions = errors = failures = skips = 0
|
73
|
-
results.each do |result|
|
74
|
-
total_time += result.time
|
75
|
-
assertions += result.assertions
|
76
|
-
|
77
|
-
case result.failure
|
78
|
-
when Skip
|
79
|
-
skips += 1
|
80
|
-
when UnexpectedError
|
81
|
-
errors += 1
|
82
|
-
when Assertion
|
83
|
-
failures += 1
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
base = working_dir + '/'
|
88
|
-
xml = []
|
89
|
-
|
90
|
-
xml << '<?xml version="1.0" encoding="UTF-8"?>'
|
91
|
-
xml << "<testsuite time='%6f' skipped='%d' failures='%d' errors='%d' name=%p assertions='%d' tests='%d'>" %
|
92
|
-
[total_time, skips, failures, errors, escape(name), assertions, results.count]
|
93
|
-
|
94
|
-
results.each do |result|
|
95
|
-
xml << " <testcase time='%6f' file=%p name=%p assertions='%s'>" %
|
96
|
-
[result.time, escape(result.method(result.name).source_location[0].gsub(base, '')), escape(result.name), result.assertions]
|
97
|
-
if failure = result.failure
|
98
|
-
label = failure.result_label.downcase
|
99
|
-
|
100
|
-
if failure.is_a?(UnexpectedError)
|
101
|
-
failure = failure.error
|
102
|
-
end
|
103
|
-
|
104
|
-
klass = failure.class
|
105
|
-
msg = failure.message
|
106
|
-
bt = Minitest::filter_backtrace failure.backtrace
|
107
|
-
|
108
|
-
xml << " <%s type='%s' message=%s>%s" %
|
109
|
-
[label, escape(klass), escape(msg).inspect.gsub('\n', " "), escape(bt.join("\n"))]
|
110
|
-
xml << " </%s>" % label
|
111
|
-
end
|
112
|
-
xml << " </testcase>"
|
113
|
-
end
|
114
|
-
|
115
|
-
xml << "</testsuite>"
|
116
|
-
|
117
|
-
xml
|
118
|
-
end
|
119
|
-
|
120
|
-
def working_dir
|
121
|
-
options.fetch(:working_dir, self.class.working_dir)
|
122
|
-
end
|
123
|
-
|
124
|
-
def report_dir
|
125
|
-
options.fetch(:ci_dir, self.class.report_dir)
|
126
|
-
end
|
127
|
-
|
128
|
-
def clean?
|
129
|
-
options.fetch(:ci_clean, self.class.clean)
|
130
|
-
end
|
131
|
-
|
132
|
-
def report_name(name)
|
133
|
-
"TEST-#{CGI.escape(name.to_s.gsub(/\W+/, '_'))}.xml"[0, 255]
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
1
|
+
require 'minitest/ci_plugin'
|
2
|
+
Minitest::Ci.report!
|
data/lib/minitest/ci_plugin.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
require '
|
1
|
+
require 'fileutils'
|
2
|
+
require 'cgi'
|
3
|
+
require 'time'
|
2
4
|
|
3
5
|
module Minitest
|
4
|
-
|
5
|
-
def self.plugin_ci_init options
|
6
|
-
self.reporter << Ci.new(options[:io], options)
|
7
|
-
end
|
8
|
-
|
9
6
|
def self.plugin_ci_options opts, options
|
7
|
+
opts.on "--ci-report", "Enable Minitest::Ci Reporting." do |dir|
|
8
|
+
Ci.report!
|
9
|
+
end
|
10
|
+
|
10
11
|
opts.on "--ci-dir DIR", "Set the CI report dir. Default to #{Ci.report_dir}" do |dir|
|
11
12
|
options[:ci_dir] = dir
|
12
13
|
end
|
@@ -18,6 +19,168 @@ module Minitest
|
|
18
19
|
opts.on "--working-dir DIR", "Set the working dir. Default to #{Ci.working_dir}" do |dir|
|
19
20
|
options[:working_dir] = dir
|
20
21
|
end
|
22
|
+
|
23
|
+
opts.on "--report-name REPORT_NAME_OPTION", "Set report name option. Default to :test_name" do |report_name_option|
|
24
|
+
options[:report_name] = report_name_option
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
28
|
+
def self.plugin_ci_init options
|
29
|
+
if Ci.report?
|
30
|
+
self.reporter << Ci.new(options[:io], options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Ci < Reporter
|
35
|
+
class << self
|
36
|
+
##
|
37
|
+
# Activates minitest/ci plugin as a Minitest reporter
|
38
|
+
def report!
|
39
|
+
@report = true
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Is minitest/ci activated as a Minitest reporter?
|
44
|
+
def report?
|
45
|
+
@report ||= false
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Change the report directory. (defaults to "test/reports")
|
50
|
+
attr_accessor :report_dir
|
51
|
+
|
52
|
+
##
|
53
|
+
# Clean the report_dir between test runs? (defaults to true)
|
54
|
+
attr_accessor :clean
|
55
|
+
|
56
|
+
##
|
57
|
+
# Change the working directory. (defaults to `$PWD`)
|
58
|
+
attr_accessor :working_dir
|
59
|
+
end
|
60
|
+
|
61
|
+
self.report_dir = 'test/reports'
|
62
|
+
self.clean = true
|
63
|
+
self.working_dir = Dir.pwd
|
64
|
+
|
65
|
+
attr_accessor :io
|
66
|
+
attr_accessor :options
|
67
|
+
attr_accessor :results
|
68
|
+
|
69
|
+
def initialize io = $stdout, options = {}
|
70
|
+
self.io = io
|
71
|
+
self.options = options
|
72
|
+
self.results = Hash.new {|h,k| h[k] = []}
|
73
|
+
end
|
74
|
+
|
75
|
+
def passed?
|
76
|
+
true # don't care?
|
77
|
+
end
|
78
|
+
|
79
|
+
def start # clean
|
80
|
+
FileUtils.rm_rf report_dir if clean?
|
81
|
+
FileUtils.mkdir_p report_dir
|
82
|
+
end
|
83
|
+
|
84
|
+
def record result
|
85
|
+
results[result.class] << result
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# Generate test report
|
90
|
+
def report
|
91
|
+
io.puts
|
92
|
+
io.puts '[Minitest::CI] Generating test report in JUnit XML format...'
|
93
|
+
|
94
|
+
Dir.chdir report_dir do
|
95
|
+
results.each do |name, result|
|
96
|
+
File.open(report_name(name), "w") do |f|
|
97
|
+
f.puts( generate_results(name, result) )
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def escape o
|
106
|
+
CGI.escapeHTML(o.to_s)
|
107
|
+
end
|
108
|
+
|
109
|
+
def generate_results name, results
|
110
|
+
total_time = assertions = errors = failures = skips = 0
|
111
|
+
timestamp = Time.now.iso8601
|
112
|
+
results.each do |result|
|
113
|
+
total_time += result.time
|
114
|
+
assertions += result.assertions
|
115
|
+
|
116
|
+
case result.failure
|
117
|
+
when Skip
|
118
|
+
skips += 1
|
119
|
+
when UnexpectedError
|
120
|
+
errors += 1
|
121
|
+
when Assertion
|
122
|
+
failures += 1
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
base = working_dir + '/'
|
127
|
+
xml = []
|
128
|
+
|
129
|
+
xml << '<?xml version="1.0" encoding="UTF-8"?>'
|
130
|
+
xml << "<testsuite time='%6f' skipped='%d' failures='%d' errors='%d' name=%p assertions='%d' tests='%d' timestamp=%p>" %
|
131
|
+
[total_time, skips, failures, errors, escape(name), assertions, results.count, timestamp]
|
132
|
+
|
133
|
+
results.each do |result|
|
134
|
+
xml << " <testcase time='%6f' file=%p name=%p assertions='%s'>" %
|
135
|
+
[result.time, escape(result.method(result.name).source_location[0].gsub(base, '')), escape(result.name), result.assertions]
|
136
|
+
if failure = result.failure
|
137
|
+
label = failure.result_label.downcase
|
138
|
+
|
139
|
+
if failure.is_a?(UnexpectedError)
|
140
|
+
failure = failure.error
|
141
|
+
end
|
142
|
+
|
143
|
+
klass = failure.class
|
144
|
+
msg = failure.message
|
145
|
+
bt = Minitest::filter_backtrace failure.backtrace
|
146
|
+
|
147
|
+
xml << " <%s type='%s' message=%s>%s" %
|
148
|
+
[label, escape(klass), escape(msg).inspect.gsub('\n', " "), escape(bt.join("\n"))]
|
149
|
+
xml << " </%s>" % label
|
150
|
+
end
|
151
|
+
xml << " </testcase>"
|
152
|
+
end
|
153
|
+
|
154
|
+
xml << "</testsuite>"
|
155
|
+
|
156
|
+
xml
|
157
|
+
end
|
158
|
+
|
159
|
+
def working_dir
|
160
|
+
options.fetch(:working_dir, self.class.working_dir)
|
161
|
+
end
|
162
|
+
|
163
|
+
def report_dir
|
164
|
+
options.fetch(:ci_dir, self.class.report_dir)
|
165
|
+
end
|
166
|
+
|
167
|
+
def clean?
|
168
|
+
options.fetch(:ci_clean, self.class.clean)
|
169
|
+
end
|
170
|
+
|
171
|
+
def report_name(name)
|
172
|
+
report_name_opt = options.fetch(:report_name, :test_name)
|
173
|
+
return report_name_opt.call(name) if report_name_opt.is_a? Proc
|
174
|
+
return sha1_report_name(name) if report_name_opt.to_sym == :sha1
|
175
|
+
test_name_report_name(name)
|
176
|
+
end
|
177
|
+
|
178
|
+
def sha1_report_name(name)
|
179
|
+
"TEST-#{Digest::SHA1.hexdigest(name.to_s)}.xml"
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_name_report_name(name)
|
183
|
+
"TEST-#{CGI.escape(name.to_s.gsub(/\W+/, '_'))[0, 246]}.xml"
|
184
|
+
end
|
185
|
+
end
|
23
186
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-ci
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zzak
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-09-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: minitest
|
@@ -32,42 +32,42 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '1.
|
35
|
+
version: '1.14'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '1.
|
42
|
+
version: '1.14'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: rake
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: 12.0.0
|
50
50
|
type: :development
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
56
|
+
version: 12.0.0
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: nokogiri
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
61
|
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 1.
|
63
|
+
version: 1.7.1
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
68
|
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 1.
|
70
|
+
version: 1.7.1
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: rdoc
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
141
|
version: 1.3.6
|
142
142
|
requirements: []
|
143
143
|
rubyforge_project:
|
144
|
-
rubygems_version: 2.6.
|
144
|
+
rubygems_version: 2.6.11
|
145
145
|
signing_key:
|
146
146
|
specification_version: 4
|
147
147
|
summary: Minitest JUnit XML formatter
|