Skip to content

Commit ce96809

Browse files
authored
Merge pull request rails#54425 from zzak/ci-verbose-tests
Run tests with --profile in CI
2 parents 8c39c74 + 4246668 commit ce96809

File tree

13 files changed

+79
-14
lines changed

13 files changed

+79
-14
lines changed

actioncable/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Rake::TestTask.new do |t|
1515
t.test_files = FileList["#{__dir__}/test/**/*_test.rb"]
1616
t.warning = true
1717
t.verbose = true
18+
t.options = "--profile" if ENV["CI"]
1819
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
1920
end
2021

actionmailbox/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Rake::TestTask.new do |t|
1010
t.libs << "test"
1111
t.pattern = "test/**/*_test.rb"
1212
t.verbose = true
13+
t.options = "--profile" if ENV["CI"]
1314
end
1415

1516
namespace :test do

actionmailer/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Rake::TestTask.new { |t|
1313
t.pattern = "test/**/*_test.rb"
1414
t.warning = true
1515
t.verbose = true
16+
t.options = "--profile" if ENV["CI"]
1617
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
1718
}
1819

actionpack/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Rake::TestTask.new do |t|
1616

1717
t.warning = true
1818
t.verbose = true
19+
t.options = "--profile" if ENV["CI"]
1920
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
2021
end
2122

actiontext/Rakefile

+2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ Rake::TestTask.new do |t|
1010
t.libs << "test"
1111
t.test_files = FileList["test/**/*_test.rb"].exclude("test/system/**/*", "test/dummy/**/*")
1212
t.verbose = true
13+
t.options = "--profile" if ENV["CI"]
1314
end
1415

1516
Rake::TestTask.new "test:system" do |t|
1617
t.libs << "test"
1718
t.test_files = FileList["test/system/**/*_test.rb"]
1819
t.verbose = true
20+
t.options = "--profile" if ENV["CI"]
1921
end
2022

2123
namespace :test do

actionview/Rakefile

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace :test do
2727
t.test_files = FileList["test/template/**/*_test.rb"]
2828
t.warning = true
2929
t.verbose = true
30+
t.options = "--profile" if ENV["CI"]
3031
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
3132
end
3233

@@ -37,6 +38,7 @@ namespace :test do
3738
t.test_files = FileList["test/activerecord/*_test.rb"]
3839
t.warning = true
3940
t.verbose = true
41+
t.options = "--profile" if ENV["CI"]
4042
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
4143
end
4244

@@ -46,6 +48,7 @@ namespace :test do
4648
t.test_files = FileList["test/actionpack/**/*_test.rb"]
4749
t.warning = true
4850
t.verbose = true
51+
t.options = "--profile" if ENV["CI"]
4952
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
5053
end
5154
end

activejob/Rakefile

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ namespace :test do
4141
(x.include?("async") && adapter != "async")
4242
}
4343
t.verbose = true
44+
t.options = "--profile" if ENV["CI"]
4445
t.warning = true
4546
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
4647
end
@@ -62,6 +63,7 @@ namespace :test do
6263
t.libs << "test"
6364
t.test_files = FileList["test/integration/**/*_test.rb"]
6465
t.verbose = true
66+
t.options = "--profile" if ENV["CI"]
6567
t.warning = true
6668
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
6769
end

activemodel/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Rake::TestTask.new do |t|
1111
t.test_files = FileList["#{__dir__}/test/cases/**/*_test.rb"]
1212
t.warning = true
1313
t.verbose = true
14+
t.options = "--profile" if ENV["CI"]
1415
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
1516
end
1617

activerecord/Rakefile

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace :test do
4545

4646
t.warning = true
4747
t.verbose = true
48+
t.options = "--profile" if ENV["CI"]
4849
end
4950
end
5051

@@ -69,6 +70,7 @@ end
6970
t.test_files = files
7071
t.warning = true
7172
t.verbose = true
73+
t.options = "--profile" if ENV["CI"]
7274
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
7375
end
7476

@@ -80,6 +82,7 @@ end
8082
t.test_files = FileList["test/activejob/*_test.rb"]
8183
t.warning = true
8284
t.verbose = true
85+
t.options = "--profile" if ENV["CI"]
8386
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
8487
end
8588
end
@@ -186,6 +189,7 @@ end
186189

187190
t.warning = true
188191
t.verbose = true
192+
t.options = "--profile" if ENV["CI"]
189193
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
190194
end
191195
end

activestorage/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Rake::TestTask.new do |t|
1111
t.libs << "test"
1212
t.test_files = FileList["test/**/*_test.rb"]
1313
t.verbose = true
14+
t.options = "--profile" if ENV["CI"]
1415
t.warning = true
1516
end
1617

activesupport/Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Rake::TestTask.new do |t|
1010
t.pattern = "test/**/*_test.rb"
1111
t.warning = true
1212
t.verbose = true
13+
t.options = "--profile" if ENV["CI"]
1314
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
1415
end
1516

railties/Rakefile

+24-2
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,13 @@ namespace :test do
6666

6767
# Only generate the template app once.
6868
require_relative "test/isolation/abstract_unit"
69+
require "minitest/rails_plugin"
6970

7071
failing_files = []
7172

7273
dirs = (ENV["TEST_DIR"] || ENV["TEST_DIRS"] || "**").split(",")
7374
test_options = ENV["TESTOPTS"].to_s.split(/[\s]+/)
75+
test_options << "--profile" if ENV["BUILDKITE"]
7476

7577
test_patterns = dirs.map { |dir| "test/#{dir}/*_test.rb" }
7678
test_files = Dir[*test_patterns].select do |file|
@@ -94,6 +96,8 @@ namespace :test do
9496
test_files = buckets[n]
9597
end
9698

99+
output_file = Tempfile.new("railties_test_reporter")
100+
97101
test_files.each do |file|
98102
puts "--- #{file}"
99103
fake_command = Shellwords.join([
@@ -108,6 +112,7 @@ namespace :test do
108112
# We could run these in parallel, but pretty much all of the
109113
# railties tests already run in parallel, so ¯\_(⊙︿⊙)_/¯
110114
Process.waitpid fork {
115+
ENV["RAILTIES_OUTPUT_FILE"] = output_file.path
111116
ARGV.clear.concat test_options
112117
Rake.application = nil
113118

@@ -123,9 +128,22 @@ namespace :test do
123128
end
124129
end
125130

126-
puts "--- All tests completed"
131+
puts "+++ All tests completed"
132+
133+
if ENV["BUILDKITE"]
134+
TestResult = Struct.new(:NAME, :failures, :assertions, :klass, :time, :source_location, :location)
135+
profile = Minitest::ProfileReporter.new($stdout, profile: 10)
136+
output_file.rewind
137+
output_file.each_line do |result|
138+
data = JSON.parse(result)
139+
profile.results << TestResult.new(*data.values)
140+
end
141+
142+
profile.summary
143+
end
144+
127145
unless failing_files.empty?
128-
puts "^^^ +++"
146+
puts "+++"
129147
puts
130148
puts "Failed in:"
131149
failing_files.each do |file|
@@ -135,6 +153,9 @@ namespace :test do
135153

136154
exit 1
137155
end
156+
ensure
157+
output_file&.close
158+
output_file&.unlink
138159
end
139160
end
140161

@@ -143,5 +164,6 @@ Rake::TestTask.new("test:regular") do |t|
143164
t.pattern = "test/**/*_test.rb"
144165
t.warning = true
145166
t.verbose = true
167+
t.options = "--profile" if ENV["BUILDKITE"]
146168
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
147169
end

railties/lib/minitest/rails_plugin.rb

+37-12
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,58 @@ def aggregated_results(*)
2626
end
2727

2828
class ProfileReporter < Reporter
29+
attr_accessor :results
30+
2931
def initialize(io = $stdout, options = {})
3032
super
3133
@results = []
3234
@count = options[:profile]
3335
end
3436

3537
def record(result)
36-
@results << result
38+
if output_file = ENV["RAILTIES_OUTPUT_FILE"]
39+
File.open(output_file, "a") do |f|
40+
# Round-trip for re-serialization
41+
data = JSON.parse(result.to_json)
42+
data[:location] = result.location
43+
f.puts(data.to_json)
44+
end
45+
else
46+
@results << result
47+
end
48+
end
49+
50+
def passed?
51+
true
3752
end
3853

3954
def report
40-
total_time = @results.sum(&:time)
55+
# Skip if we're outputting to a file
56+
return if ENV["RAILTIES_OUTPUT_FILE"]
57+
print_summary
58+
end
4159

42-
@results.sort! { |a, b| b.time <=> a.time }
43-
slow_results = @results.take(@count)
44-
slow_tests_total_time = slow_results.sum(&:time)
60+
def summary
61+
print_summary
62+
end
63+
64+
private
65+
def print_summary
66+
total_time = @results.sum(&:time)
67+
68+
@results.sort! { |a, b| b.time <=> a.time }
69+
slow_results = @results.take(@count)
70+
slow_tests_total_time = slow_results.sum(&:time)
4571

46-
ratio = (total_time == 0) ? 0.0 : (slow_tests_total_time / total_time) * 100
72+
ratio = (total_time == 0) ? 0.0 : (slow_tests_total_time / total_time) * 100
4773

48-
io.puts("\nTop %d slowest tests (%.2f seconds, %.1f%% of total time):\n" % [slow_results.size, slow_tests_total_time, ratio])
49-
slow_results.each do |result|
50-
io.puts(" %s\n %.4f seconds %s\n" % [result.location, result.time, source_location(result)])
74+
io.puts("\nTop %d slowest tests (%.2f seconds, %.1f%% of total time):\n" % [slow_results.size, slow_tests_total_time, ratio])
75+
slow_results.each do |result|
76+
io.puts(" %s\n %.4f seconds %s\n" % [result.location, result.time, source_location(result)])
77+
end
78+
io.puts("\n")
5179
end
52-
io.puts("\n")
53-
end
5480

55-
private
5681
def source_location(result)
5782
filename, line = result.source_location
5883
return "" unless filename

0 commit comments

Comments
 (0)