Skip to content

Commit 932af45

Browse files
committed
Implement Rails::TestUnitReporter#prerecord
This is invoked by Minitest before invoking the test, allowing to print the test name in advance. This is useful to debug slow and stuck tests by turning on verbose mode. This way the stuck test name is printed before the process deadlock. Otherwise you have to resort to dirty tricks to figure out which test is not returning. This is also how the default Minitest reporter works in verbose mode.
1 parent 6b2a9f1 commit 932af45

File tree

2 files changed

+43
-32
lines changed

2 files changed

+43
-32
lines changed

railties/lib/rails/test_unit/reporter.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ class TestUnitReporter < Minitest::StatisticsReporter
88
class_attribute :app_root
99
class_attribute :executable, default: "bin/rails test"
1010

11+
def prerecord(test_class, test_name)
12+
super
13+
if options[:verbose]
14+
io.print "%s#%s = " % [test_class.name, test_name]
15+
end
16+
end
17+
1118
def record(result)
1219
super
1320

@@ -69,8 +76,7 @@ def fail_fast?
6976
end
7077

7178
def format_line(result)
72-
klass = result.respond_to?(:klass) ? result.klass : result.class
73-
"%s#%s = %.2f s = %s" % [klass, result.name, result.time, result.result_code]
79+
"%.2f s = %s" % [result.time, result.result_code]
7480
end
7581

7682
def format_rerun_snippet(result)

railties/test/test_unit/reporter_test.rb

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,34 @@ def woot; end
1515
end
1616

1717
test "prints rerun snippet to run a single failed test" do
18-
@reporter.record(failed_test)
18+
record(failed_test)
1919
@reporter.report
2020

2121
assert_match %r{^bin/rails test .*test/test_unit/reporter_test\.rb:\d+$}, @output.string
2222
assert_rerun_snippet_count 1
2323
end
2424

2525
test "prints rerun snippet for every failed test" do
26-
@reporter.record(failed_test)
27-
@reporter.record(failed_test)
28-
@reporter.record(failed_test)
26+
record(failed_test)
27+
record(failed_test)
28+
record(failed_test)
2929
@reporter.report
3030

3131
assert_rerun_snippet_count 3
3232
end
3333

3434
test "does not print snippet for successful and skipped tests" do
35-
@reporter.record(passing_test)
36-
@reporter.record(skipped_test)
35+
record(passing_test)
36+
record(skipped_test)
3737
@reporter.report
3838
assert_no_match "Failed tests:", @output.string
3939
assert_rerun_snippet_count 0
4040
end
4141

4242
test "prints rerun snippet for skipped tests if run in verbose mode" do
43-
verbose = Rails::TestUnitReporter.new @output, verbose: true
44-
verbose.record(skipped_test)
45-
verbose.report
43+
@reporter = Rails::TestUnitReporter.new @output, verbose: true
44+
record(skipped_test)
45+
@reporter.report
4646

4747
assert_rerun_snippet_count 1
4848
end
@@ -51,7 +51,7 @@ def woot; end
5151
original_executable = Rails::TestUnitReporter.executable
5252
begin
5353
Rails::TestUnitReporter.executable = "bin/test"
54-
@reporter.record(failed_test)
54+
record(failed_test)
5555
@reporter.report
5656

5757
assert_match %r{^bin/test .*test/test_unit/reporter_test\.rb:\d+$}, @output.string
@@ -61,44 +61,44 @@ def woot; end
6161
end
6262

6363
test "outputs failures inline" do
64-
@reporter.record(failed_test)
64+
record(failed_test)
6565
@reporter.report
6666

6767
expect = %r{\AF\n\nFailure:\nTestUnitReporterTest::ExampleTest#woot \[[^\]]+\]:\nboo\n\nbin/rails test test/test_unit/reporter_test\.rb:\d+\n\n\z}
6868
assert_match expect, @output.string
6969
end
7070

7171
test "outputs errors inline" do
72-
@reporter.record(errored_test)
72+
record(errored_test)
7373
@reporter.report
7474

7575
expect = %r{\AE\n\nError:\nTestUnitReporterTest::ExampleTest#woot:\nArgumentError: wups\n some_test.rb:4\n\nbin/rails test .*test/test_unit/reporter_test\.rb:\d+\n\n\z}
7676
assert_match expect, @output.string
7777
end
7878

7979
test "outputs skipped tests inline if verbose" do
80-
verbose = Rails::TestUnitReporter.new @output, verbose: true, output_inline: true
81-
verbose.record(skipped_test)
82-
verbose.report
80+
@reporter = Rails::TestUnitReporter.new @output, verbose: true, output_inline: true
81+
record(skipped_test)
82+
@reporter.report
8383

8484
expect = %r{\ATestUnitReporterTest::ExampleTest#woot = 10\.00 s = S\n\n\nSkipped:\nTestUnitReporterTest::ExampleTest#woot \[[^\]]+\]:\nskipchurches, misstemples\n\nbin/rails test test/test_unit/reporter_test\.rb:\d+\n\n\z}
8585
assert_match expect, @output.string
8686
end
8787

8888
test "does not output rerun snippets after run" do
89-
@reporter.record(failed_test)
89+
record(failed_test)
9090
@reporter.report
9191

9292
assert_no_match "Failed tests:", @output.string
9393
end
9494

9595
test "fail fast interrupts run on failure" do
96-
fail_fast = Rails::TestUnitReporter.new @output, fail_fast: true
96+
@reporter = Rails::TestUnitReporter.new @output, fail_fast: true
9797
interrupt_raised = false
9898

9999
# Minitest passes through Interrupt, catch it manually.
100100
begin
101-
fail_fast.record(failed_test)
101+
record(failed_test)
102102
rescue Interrupt
103103
interrupt_raised = true
104104
ensure
@@ -107,12 +107,12 @@ def woot; end
107107
end
108108

109109
test "fail fast interrupts run on error" do
110-
fail_fast = Rails::TestUnitReporter.new @output, fail_fast: true
110+
@reporter = Rails::TestUnitReporter.new @output, fail_fast: true
111111
interrupt_raised = false
112112

113113
# Minitest passes through Interrupt, catch it manually.
114114
begin
115-
fail_fast.record(errored_test)
115+
record(errored_test)
116116
rescue Interrupt
117117
interrupt_raised = true
118118
ensure
@@ -121,16 +121,16 @@ def woot; end
121121
end
122122

123123
test "fail fast does not interrupt run skips" do
124-
fail_fast = Rails::TestUnitReporter.new @output, fail_fast: true
124+
@reporter = Rails::TestUnitReporter.new @output, fail_fast: true
125125

126-
fail_fast.record(skipped_test)
126+
record(skipped_test)
127127
assert_no_match "Failed tests:", @output.string
128128
end
129129

130130
test "outputs colored passing results" do
131131
@output.stub(:tty?, true) do
132-
colored = Rails::TestUnitReporter.new @output, color: true, output_inline: true
133-
colored.record(passing_test)
132+
@reporter = Rails::TestUnitReporter.new @output, color: true, output_inline: true
133+
record(passing_test)
134134

135135
expect = %r{\e\[32m\.\e\[0m}
136136
assert_match expect, @output.string
@@ -139,8 +139,8 @@ def woot; end
139139

140140
test "outputs colored skipped results" do
141141
@output.stub(:tty?, true) do
142-
colored = Rails::TestUnitReporter.new @output, color: true, output_inline: true
143-
colored.record(skipped_test)
142+
@reporter = Rails::TestUnitReporter.new @output, color: true, output_inline: true
143+
record(skipped_test)
144144

145145
expect = %r{\e\[33mS\e\[0m}
146146
assert_match expect, @output.string
@@ -149,8 +149,8 @@ def woot; end
149149

150150
test "outputs colored failed results" do
151151
@output.stub(:tty?, true) do
152-
colored = Rails::TestUnitReporter.new @output, color: true, output_inline: true
153-
colored.record(failed_test)
152+
@reporter = Rails::TestUnitReporter.new @output, color: true, output_inline: true
153+
record(failed_test)
154154

155155
expected = %r{\e\[31mF\e\[0m\n\n\e\[31mFailure:\nTestUnitReporterTest::ExampleTest#woot \[test/test_unit/reporter_test.rb:\d+\]:\nboo\n\e\[0m\n\nbin/rails test .*test/test_unit/reporter_test.rb:\d+\n\n}
156156
assert_match expected, @output.string
@@ -159,15 +159,20 @@ def woot; end
159159

160160
test "outputs colored error results" do
161161
@output.stub(:tty?, true) do
162-
colored = Rails::TestUnitReporter.new @output, color: true, output_inline: true
163-
colored.record(errored_test)
162+
@reporter = Rails::TestUnitReporter.new @output, color: true, output_inline: true
163+
record(errored_test)
164164

165165
expected = %r{\e\[31mE\e\[0m\n\n\e\[31mError:\nTestUnitReporterTest::ExampleTest#woot:\nArgumentError: wups\n some_test.rb:4\n\e\[0m}
166166
assert_match expected, @output.string
167167
end
168168
end
169169

170170
private
171+
def record(test_result)
172+
@reporter.prerecord(test_result.klass.constantize, test_result.name)
173+
@reporter.record(test_result)
174+
end
175+
171176
def assert_rerun_snippet_count(snippet_count)
172177
assert_equal snippet_count, @output.string.scan(%r{^bin/rails test }).size
173178
end

0 commit comments

Comments
 (0)