Skip to content

Commit 91c7e63

Browse files
committed
Support parallel_test options: pattern, exclude-pattern & group-by
1 parent ce2ea87 commit 91c7e63

2 files changed

Lines changed: 50 additions & 17 deletions

File tree

lib/turbo_tests/cli.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def run
1717
verbose = false
1818
fail_fast = nil
1919
seed = nil
20+
parallel_options = {}
2021

2122
OptionParser.new { |opts|
2223
opts.banner = <<~BANNER
@@ -47,6 +48,29 @@ def run
4748
}
4849
end
4950

51+
opts.on("-p", "--pattern [PATTERN]", "run tests matching this regex pattern") do |pattern|
52+
parallel_options[:pattern] = /#{pattern}/
53+
end
54+
55+
opts.on("--exclude-pattern", "--exclude-pattern [PATTERN]", "exclude tests matching this regex pattern") do |pattern|
56+
parallel_options[:exclude_pattern] = /#{pattern}/
57+
end
58+
59+
opts.on(
60+
"--group-by [TYPE]",
61+
<<~TEXT.rstrip.split("\n").join("\n#{' ' * 37}")
62+
group tests by:
63+
found - order of finding files
64+
steps - number of cucumber/spinach steps
65+
scenarios - individual cucumber scenarios
66+
filesize - by size of the file
67+
runtime - info from runtime log
68+
default - runtime when runtime log is filled otherwise filesize
69+
TEXT
70+
) do |type|
71+
parallel_options[:group_by] = type.to_sym
72+
end
73+
5074
opts.on("-t", "--tag TAG", "Run examples with the specified tag.") do |tag|
5175
tags << tag
5276
end
@@ -98,16 +122,17 @@ def run
98122
end
99123
end
100124

101-
success = TurboTests::Runner.run(
125+
success = TurboTests::Runner.run({
102126
formatters: formatters,
103127
tags: tags,
104128
files: @argv.empty? ? ["spec"] : @argv,
105129
runtime_log: runtime_log,
106130
verbose: verbose,
107131
fail_fast: fail_fast,
108132
count: count,
109-
seed: seed
110-
)
133+
seed: seed,
134+
parallel_options: parallel_options
135+
})
111136

112137
if success
113138
exit 0

lib/turbo_tests/runner.rb

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def self.run(opts = {})
1313
files = opts[:files]
1414
formatters = opts[:formatters]
1515
tags = opts[:tags]
16+
parallel_options = opts[:parallel_options]
1617

1718
# SEE: https://bit.ly/2NP87Cz
1819
start_time = opts.fetch(:start_time) { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
@@ -38,15 +39,15 @@ def self.run(opts = {})
3839
fail_fast: fail_fast,
3940
count: count,
4041
seed: seed,
41-
seed_used: seed_used
42+
seed_used: seed_used,
43+
parallel_options: parallel_options
4244
).run
4345
end
4446

4547
def initialize(opts)
4648
@reporter = opts[:reporter]
4749
@files = opts[:files]
4850
@tags = opts[:tags]
49-
@runtime_log = opts[:runtime_log] || "tmp/turbo_rspec_runtime.log"
5051
@verbose = opts[:verbose]
5152
@fail_fast = opts[:fail_fast]
5253
@count = opts[:count]
@@ -56,6 +57,10 @@ def initialize(opts)
5657
@seed = opts[:seed]
5758
@seed_used = opts[:seed_used]
5859

60+
@runtime_log = opts[:runtime_log] || "tmp/turbo_rspec_runtime.log"
61+
@parallel_options = opts.fetch(:parallel_options, {})
62+
@parallel_options[:runtime_log] = @runtime_log
63+
5964
@messages = Thread::Queue.new
6065
@threads = []
6166
@error = false
@@ -67,27 +72,17 @@ def run
6772
ParallelTests::RSpec::Runner.tests_with_size(@files, {}).size
6873
].min
6974

70-
use_runtime_info = @files == ["spec"]
71-
72-
group_opts = {}
73-
74-
if use_runtime_info
75-
group_opts[:runtime_log] = @runtime_log
76-
else
77-
group_opts[:group_by] = :filesize
78-
end
79-
8075
tests_in_groups =
8176
ParallelTests::RSpec::Runner.tests_in_groups(
8277
@files,
8378
@num_processes,
84-
**group_opts
79+
@parallel_options.merge(quiet: true)
8580
)
8681

8782
setup_tmp_dir
8883

8984
subprocess_opts = {
90-
record_runtime: use_runtime_info
85+
record_runtime: use_runtime_info?
9186
}
9287

9388
report_number_of_tests(tests_in_groups)
@@ -111,6 +106,19 @@ def run
111106

112107
private
113108

109+
def tests_files
110+
@tests_files ||= ParallelTests::RSpec::Runner.send(:find_tests, @files, @parallel_options)
111+
end
112+
113+
def use_runtime_info?
114+
return true if @parallel_options[:group_by] == :runtime
115+
116+
runtimes = ParallelTests::RSpec::Runner.send(:runtimes, tests_files, @parallel_options)
117+
runtimes.size * 1.5 > tests_files.size
118+
rescue StandardError
119+
false
120+
end
121+
114122
def setup_tmp_dir
115123
begin
116124
FileUtils.rm_r("tmp/test-pipes")

0 commit comments

Comments
 (0)