minitest-junit 0.3.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ee1107bc68ec72b4bd9472bc262f60de897b404f4fc41bf819d366655217ca0
4
- data.tar.gz: edff04e8a7625631e4253eda27fb2b6e7bbad68e64a63af81cc764e807bd83b8
3
+ metadata.gz: 4e9e6fe53a55b11d36289c47953e13279e41afff916cb27a7161d64baa61d914
4
+ data.tar.gz: 9311c1d71be9be105f06c0f035bd8411e74f7c3a468d77e85a9cca34b11097f7
5
5
  SHA512:
6
- metadata.gz: 9e53812e887116df0a408dba93453f81cc32bd40f909bd52b9f4daf4c15f64bc632bfd340920e3f9ac4ad3642df3797722be6334a7b7e951b5a3f3304e626c30
7
- data.tar.gz: 2b94a3901ea1fe4c51a2a37fa7f76d120aa8335bd9f23a8319d5a78f40f970709f3573d63d92c2d992c13485e4b4c17ac50355d0a400d10c70eabd3897b94c29
6
+ metadata.gz: 5fd510f4009f0c504c3d7c75f8dc8c217c61a895c92fabb912908d20ccfdfb63454152cf56257e5deb16ae499244505bfbbae768a26b9894650f1a8fa0733d9c
7
+ data.tar.gz: d47bf2f92fb7a8814be1a4337826cbe4e0cb803ac8f6d0a55e285b2a77e3ae642f7f2c597127300f080f25305d887b5a433da6e1906ff81dcca64d4d9734d18a
@@ -1,6 +1,6 @@
1
1
  module Minitest
2
2
  # :nodoc:
3
3
  module Junit
4
- VERSION = '0.3.0'
4
+ VERSION = '1.1.0'
5
5
  end
6
6
  end
@@ -1,6 +1,8 @@
1
1
  require 'minitest/junit/version'
2
2
  require 'minitest'
3
3
  require 'builder'
4
+ require 'socket'
5
+ require 'time'
4
6
 
5
7
  # :nodoc:
6
8
  module Minitest
@@ -11,6 +13,8 @@ module Minitest
11
13
  @io = io
12
14
  @results = []
13
15
  @options = options
16
+ @options[:timestamp] = options.fetch(:timestamp, Time.now.iso8601)
17
+ @options[:hostname] = options.fetch(:hostname, Socket.gethostname)
14
18
  end
15
19
 
16
20
  def passed?
@@ -24,15 +28,26 @@ module Minitest
24
28
  end
25
29
 
26
30
  def report
27
- @io.puts '<testsuite>'
28
- @results.each { |result| @io.puts format(result) }
29
- @io.puts '</testsuite>'
31
+ xml = Builder::XmlMarkup.new(:indent => 2)
32
+ xml.testsuite(name: 'minitest',
33
+ timestamp: @options[:timestamp],
34
+ hostname: @options[:hostname],
35
+ tests: @results.count,
36
+ skipped: @results.count { |result| result.skipped? },
37
+ failures: @results.count { |result| !result.error? && result.failure },
38
+ errors: @results.count { |result| result.error? },
39
+ time: format_time(@results.inject(0) { |a, e| a += e.time })) do
40
+ @results.each { |result| format(result, xml) }
41
+ end
42
+ @io.puts xml.target!
30
43
  end
31
44
 
32
- def format(result)
33
- xml = Builder::XmlMarkup.new
34
- xml.testcase classname: format_class(result), name: format_name(result),
35
- time: result.time, assertions: result.assertions do |t|
45
+ def format(result, parent = nil)
46
+ xml = Builder::XmlMarkup.new(:target => parent, :indent => 2)
47
+ xml.testcase classname: format_class(result),
48
+ name: format_name(result),
49
+ time: format_time(result.time),
50
+ assertions: result.assertions do |t|
36
51
  if result.skipped?
37
52
  t.skipped message: result
38
53
  else
@@ -42,7 +57,7 @@ module Minitest
42
57
  end
43
58
  end
44
59
  end
45
- xml.target!
60
+ xml
46
61
  end
47
62
 
48
63
  private
@@ -61,15 +76,19 @@ module Minitest
61
76
 
62
77
  def format_class(result)
63
78
  if @options[:junit_jenkins]
64
- result.class.to_s.gsub(/(.*)::(.*)/, '\1.\2')
79
+ result.klass.to_s.gsub(/(.*)::(.*)/, '\1.\2')
65
80
  else
66
- result.class
81
+ result.klass
67
82
  end
68
83
  end
69
84
 
70
85
  def format_name(result)
71
86
  result.name
72
87
  end
88
+
89
+ def format_time(time)
90
+ Kernel::format('%.6f', time)
91
+ end
73
92
  end
74
93
  end
75
94
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(/^(test)\//)
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'minitest', '~> 5.0'
21
+ spec.add_dependency 'minitest', '~> 5.11'
22
22
  spec.add_dependency 'builder', '~> 3.2'
23
23
 
24
24
  spec.add_development_dependency 'bundler'
@@ -1,4 +1,5 @@
1
1
  require 'minitest/autorun'
2
+ require 'builder'
2
3
  require 'stringio'
3
4
  require 'time'
4
5
 
@@ -10,34 +11,68 @@ class ReporterTest < Minitest::Test
10
11
 
11
12
  reporter.report
12
13
 
13
- assert_equal "<testsuite>\n</testsuite>\n", reporter.output
14
+ assert_match(/^<testsuite name="minitest" timestamp="[^"]+" hostname="[^"]+" tests="0" skipped="0" failures="0" errors="0" time="0.000000">\n<\/testsuite>\n$/, reporter.output)
14
15
  end
15
16
 
16
- def test_formats_each_result_with_a_formatter
17
+ def test_formats_each_successful_result_with_a_formatter
17
18
  reporter = create_reporter
18
- results = rand(100).times.map do |i|
19
- result = "test_name#{i}"
19
+
20
+ results = do_formatting_test(reporter, count: rand(100), cause_failures: 0)
21
+
22
+ results.each do |result|
23
+ assert_match("<testcase classname=\"FakeTestName\" name=\"#{result.name}\"", reporter.output)
24
+ end
25
+ end
26
+
27
+ def test_formats_each_failed_result_with_a_formatter
28
+ reporter = create_reporter
29
+
30
+ results = do_formatting_test(reporter, count: rand(100), cause_failures: 1)
31
+
32
+ results.each do |result|
33
+ assert_match("<testcase classname=\"FakeTestName\" name=\"#{result.name}\"", reporter.output)
34
+ assert_match(/<failure/, reporter.output)
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def do_formatting_test(reporter, count: 1, cause_failures: 0)
41
+ results = count.times.map do |i|
42
+ result = create_test_result(methodname: "test_name#{i}", failures: cause_failures)
20
43
  reporter.record result
21
44
  result
22
45
  end
23
46
 
24
47
  reporter.report
25
48
 
26
- expected = "<testsuite>\n#{results.join "\n"}\n</testsuite>\n"
27
- assert_equal expected, reporter.output
49
+ results
28
50
  end
29
51
 
30
- private
52
+ def create_test_result(name: FakeTestName, methodname: 'test_method_name', successes: 1, failures: 0)
53
+ test = Class.new Minitest::Test do
54
+ define_method 'class' do
55
+ name
56
+ end
57
+ end.new methodname
58
+ test.time = rand(100)
59
+ test.assertions = successes + failures
60
+ test.failures = failures.times.map do |i|
61
+ Class.new Minitest::Assertion do
62
+ define_method 'backtrace' do
63
+ ["Model failure \##{i}", 'This is a test backtrace']
64
+ end
65
+ end.new
66
+ end
67
+ Minitest::Result.from test
68
+ end
31
69
 
32
- def create_reporter
33
- io = StringIO.new
34
- reporter = Minitest::Junit::Reporter.new io, {}
70
+ def create_reporter(options = {})
71
+ io = StringIO.new ''
72
+ reporter = Minitest::Junit::Reporter.new io, options
35
73
  def reporter.output
36
74
  @io.string
37
75
  end
38
- def reporter.format(result)
39
- result
40
- end
41
76
  reporter.start
42
77
  reporter
43
78
  end
@@ -4,12 +4,20 @@ require 'time'
4
4
 
5
5
  require 'minitest/junit'
6
6
 
7
+ class FakeTestName; end
8
+
9
+ module FirstModule
10
+ module SecondModule
11
+ class TestClass; end
12
+ end
13
+ end
14
+
7
15
  class TestCaseFormatter < Minitest::Test
8
16
  def test_all_tests_generate_testcase_tag
9
17
  test = create_test_result
10
18
  reporter = create_reporter
11
19
 
12
- assert_match test.name, reporter.format(test)
20
+ assert_match test.name, reporter.format(test).target!
13
21
  end
14
22
 
15
23
  def test_skipped_tests_generates_skipped_tag
@@ -20,7 +28,7 @@ class TestCaseFormatter < Minitest::Test
20
28
 
21
29
  reporter.report
22
30
 
23
- assert_match(/<skipped message="[^<>]+"\/><\/testcase>\n<\/testsuite>\n/, reporter.output)
31
+ assert_match(/<skipped message="[^<>]+"\/>\n<\/testcase>\n<\/testsuite>\n/, reporter.output)
24
32
  end
25
33
 
26
34
  def test_failing_tests_creates_failure_tag
@@ -46,7 +54,7 @@ class TestCaseFormatter < Minitest::Test
46
54
  end
47
55
 
48
56
  def test_jenkins_sanitizer_uses_modules_as_packages
49
- test = create_test_result 'FirstModule::SecondModule::TestClass'
57
+ test = create_test_result FirstModule::SecondModule::TestClass
50
58
  reporter = create_reporter junit_jenkins: true
51
59
  reporter.record test
52
60
 
@@ -63,7 +71,7 @@ class TestCaseFormatter < Minitest::Test
63
71
  e
64
72
  end
65
73
 
66
- def create_test_result(name = 'ATestClass')
74
+ def create_test_result(name = FakeTestName)
67
75
  test = Class.new Minitest::Test do
68
76
  define_method 'class' do
69
77
  name
@@ -71,7 +79,7 @@ class TestCaseFormatter < Minitest::Test
71
79
  end.new 'test_method_name'
72
80
  test.time = a_number
73
81
  test.assertions = a_number
74
- test
82
+ Minitest::Result.from test
75
83
  end
76
84
 
77
85
  def a_number
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: 0.3.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allan Espinosa
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
19
+ version: '5.11'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.0'
26
+ version: '5.11'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: builder
29
29
  requirement: !ruby/object:Gem::Requirement