Skip to content

Commit 3aa6eb6

Browse files
committed
feat: support <system-out> and <system-err>
1 parent ffe0fcd commit 3aa6eb6

File tree

4 files changed

+145
-20
lines changed

4 files changed

+145
-20
lines changed

lib/test/unit/ui/junitxml/testrunner.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'erb'
2+
require 'stringio'
23
require 'test/unit/ui/testrunner'
34
require 'test/unit/ui/testrunnermediator'
45

@@ -48,12 +49,18 @@ def test_suite_finished(suite)
4849
end
4950

5051
def test_started(test)
51-
@junit_test_suites.last << JUnitTestCase.new(test.class.name,
52-
test.description)
52+
test_case = JUnitTestCase.new(test.class.name, test.description)
53+
@junit_test_suites.last << test_case
54+
@stdout_org = $stdout
55+
@stderr_org = $stderr
56+
$stdout = test_case.stdout
57+
$stderr = test_case.stderr
5358
end
5459

5560
def test_finished(test)
5661
@junit_test_suites.last.test_cases.last.time = test.elapsed_time
62+
$stdout = @stdout_org
63+
$stderr = @stderr_org
5764
end
5865

5966
def result_pass_assertion(result)
@@ -116,15 +123,16 @@ def errors
116123
class JUnitTestCase
117124
attr_reader :class_name, :name
118125
attr_reader :failure, :error, :omission, :pending
126+
attr_reader :stdout, :stderr
119127
attr_accessor :assertion_count, :time
120128

121129
def initialize(class_name, name)
122130
@class_name = class_name
123131
@name = name
132+
@stdout = StringIO.new
133+
@stderr = StringIO.new
124134
@assertion_count = 0
125135
@time = 0
126-
@omission = nil
127-
@pending = nil
128136
end
129137

130138
def <<(fault)

lib/test/unit/ui/junitxml/xml.erb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616
<skipped message="<%=h test_case.omission.message %>"/>
1717
% elsif test_case.pending
1818
<skipped message="<%=h test_case.pending.message %>"/>
19+
% end
20+
% if test_case.stdout.size > 0
21+
<system-out><%=h test_case.stdout.string %></system-out>
22+
% end
23+
% if test_case.stderr.size > 0
24+
<system-err><%=h test_case.stderr.string %></system-err>
1925
% end
2026
</testcase>
2127
% end

test/check.rb

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,16 @@ def check_testsuite(testsuite, name, tests, errors, failures, skipped)
1111
assert_compare(0, "<", Float(testsuite.attribute("time").value))
1212
end
1313

14-
def check_testcase_success(testcase, class_name, assertions)
15-
assert_equal(class_name, testcase.attribute("classname").value)
16-
assert_equal(assertions.to_s, testcase.attribute("assertions").value)
17-
assert_compare(0, "<", Float(testcase.attribute("time").value))
14+
def check_testcase_success(testcase, class_name, assertions, out = nil, err = nil)
15+
check_test_case(testcase, class_name, assertions, out, err)
1816

1917
assert_equal(0, testcase.get_elements("failure").size)
2018
assert_equal(0, testcase.get_elements("error").size)
2119
assert_equal(0, testcase.get_elements("skipped").size)
2220
end
2321

24-
def check_testcase_failure(testcase, class_name, assertions, message = nil)
25-
assert_equal(class_name, testcase.attribute("classname").value)
26-
assert_equal(assertions.to_s, testcase.attribute("assertions").value)
27-
assert_compare(0, "<", Float(testcase.attribute("time").value))
22+
def check_testcase_failure(testcase, class_name, assertions, message = nil, out = nil, err = nil)
23+
check_test_case(testcase, class_name, assertions, out, err)
2824

2925
failures = testcase.get_elements("failure")
3026
assert_equal(1, failures.size)
@@ -38,10 +34,8 @@ def check_testcase_failure(testcase, class_name, assertions, message = nil)
3834
assert_equal(0, testcase.get_elements("skipped").size)
3935
end
4036

41-
def check_testcase_error(testcase, class_name, assertions, message = nil)
42-
assert_equal(class_name, testcase.attribute("classname").value)
43-
assert_equal(assertions.to_s, testcase.attribute("assertions").value)
44-
assert_compare(0, "<", Float(testcase.attribute("time").value))
37+
def check_testcase_error(testcase, class_name, assertions, message = nil, out = nil, err = nil)
38+
check_test_case(testcase, class_name, assertions, out, err)
4539

4640
errors = testcase.get_elements("error")
4741
assert_equal(1, errors.size)
@@ -56,10 +50,8 @@ def check_testcase_error(testcase, class_name, assertions, message = nil)
5650
assert_equal(0, testcase.get_elements("skipped").size)
5751
end
5852

59-
def check_testcase_skipped(testcase, class_name, assertions, message = nil)
60-
assert_equal(class_name, testcase.attribute("classname").value)
61-
assert_equal(assertions.to_s, testcase.attribute("assertions").value)
62-
assert_compare(0, "<", Float(testcase.attribute("time").value))
53+
def check_testcase_skipped(testcase, class_name, assertions, message = nil, out = nil, err = nil)
54+
check_test_case(testcase, class_name, assertions, out, err)
6355

6456
skipped = testcase.get_elements("skipped")
6557
assert_equal(1, skipped.size)
@@ -68,4 +60,26 @@ def check_testcase_skipped(testcase, class_name, assertions, message = nil)
6860
assert_equal(0, testcase.get_elements("failure").size)
6961
assert_equal(0, testcase.get_elements("error").size)
7062
end
63+
64+
def check_test_case(testcase, class_name, assertions, out = nil, err = nil)
65+
assert_equal(class_name, testcase.attribute("classname").value)
66+
assert_equal(assertions.to_s, testcase.attribute("assertions").value)
67+
assert_compare(0, "<", Float(testcase.attribute("time").value))
68+
69+
system_outs = testcase.get_elements("system-out")
70+
if out
71+
assert_equal(1, system_outs.size)
72+
assert_match(out, system_outs.first.text)
73+
else
74+
assert_equal(0, system_outs.size)
75+
end
76+
77+
system_errs = testcase.get_elements("system-err")
78+
if err
79+
assert_equal(1, system_errs.size)
80+
assert_match(err, system_errs.first.text)
81+
else
82+
assert_equal(0, system_errs.size)
83+
end
84+
end
7185
end

test/test_xml_with_output.rb

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
require "stringio"
2+
require 'rexml/document'
3+
require "test/unit"
4+
require "test/unit/ui/junitxml/testrunner"
5+
require_relative "check"
6+
7+
class TestXmlWithOutput < Test::Unit::TestCase
8+
include Check
9+
10+
setup do
11+
test_case = Class.new(Test::Unit::TestCase) do
12+
test "success" do
13+
assert_equal(1, 1)
14+
puts("out 1")
15+
end
16+
17+
def test_failure
18+
assert_equal(1, 1)
19+
warn("warn 1")
20+
assert_equal(1, 2)
21+
end
22+
23+
def test_error
24+
warn("warn 2")
25+
puts("out 2")
26+
assert_equal(1, 1)
27+
assert_equal(1, 1)
28+
assert_equal(1, 1)
29+
raise "hello"
30+
end
31+
32+
def test_omission
33+
puts("out 3")
34+
omit("omission 1")
35+
end
36+
37+
def test_pending
38+
warn("warn 3")
39+
pend("pending 1")
40+
end
41+
end
42+
43+
output = StringIO.new
44+
runner = Test::Unit::UI::JUnitXml::TestRunner.new(
45+
test_case.suite, :output => output)
46+
runner.start
47+
48+
output.rewind
49+
@doc = REXML::Document.new(output)
50+
end
51+
52+
test "testsuites" do
53+
testsuites_array = @doc.get_elements("/testsuites")
54+
assert_equal(1, testsuites_array.size)
55+
end
56+
57+
test "testsuite" do
58+
testsuite_array = @doc.get_elements("/testsuites/testsuite")
59+
assert_equal(1, testsuite_array.size)
60+
check_testsuite(testsuite_array.first, "", 5, 1, 1, 2)
61+
end
62+
63+
test "testcase success" do
64+
testcase_array = @doc.get_elements(
65+
"/testsuites/testsuite/testcase[@name='success']")
66+
assert_equal(1, testcase_array.size)
67+
check_testcase_success(testcase_array.first, "", 1, "out 1")
68+
end
69+
70+
test "testcase failure" do
71+
testcase_array = @doc.get_elements(
72+
"/testsuites/testsuite/testcase[@name='test_failure()']")
73+
assert_equal(1, testcase_array.size)
74+
check_testcase_failure(testcase_array.first, "", 2, /.+/, nil, "warn 1")
75+
end
76+
77+
test "testcase error" do
78+
testcase_array = @doc.get_elements(
79+
"/testsuites/testsuite/testcase[@name='test_error()']")
80+
assert_equal(1, testcase_array.size)
81+
check_testcase_error(testcase_array.first, "", 3, "hello", "out 2", "warn 2")
82+
end
83+
84+
test "testcase omission" do
85+
testcase_array = @doc.get_elements(
86+
"/testsuites/testsuite/testcase[@name='test_omission()']")
87+
assert_equal(1, testcase_array.size)
88+
check_testcase_skipped(testcase_array.first, "", 0, "omission 1", "out 3")
89+
end
90+
91+
test "testcase pending" do
92+
testcase_array = @doc.get_elements(
93+
"/testsuites/testsuite/testcase[@name='test_pending()']")
94+
assert_equal(1, testcase_array.size)
95+
check_testcase_skipped(testcase_array.first, "", 0, "pending 1", nil, "warn 3")
96+
end
97+
end

0 commit comments

Comments
 (0)