test-queue 0.9.0 → 0.11.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 +4 -4
- data/lib/test_queue/iterator.rb +0 -2
- data/lib/test_queue/runner/rspec.rb +16 -2
- data/lib/test_queue/runner/testunit.rb +75 -39
- data/lib/test_queue/runner.rb +6 -3
- data/lib/test_queue/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa0c2ad5105a1578394da94c17d2a8c72d330023d66bd5f0df79300b848cd123
|
4
|
+
data.tar.gz: 1a623275a814f8c505241de2b85af5447567b5a089760192e2126479b43004b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cc7375bc4a6b845d9ea035351adefc425945560e4fc4cf3338eabce02bf72a6a4a92625bc1ac872d537e4202112cfb570d6d59c4b566ab4fc6203a3532d21aa
|
7
|
+
data.tar.gz: 60d073987945502fc020b45d3e936045940e2167d58750f10795d8cce3d008c9585ed2b053dde8c6950e54d664d13ac0a6e5659c271abec78c8062a94e10d280
|
data/lib/test_queue/iterator.rb
CHANGED
@@ -38,10 +38,8 @@ module TestQueue
|
|
38
38
|
end
|
39
39
|
break if client.nil?
|
40
40
|
|
41
|
-
# rubocop:disable Lint/IncompatibleIoSelectWithFiberScheduler
|
42
41
|
# This false positive will be resolved by https://github.com/rubocop/rubocop/pull/11830.
|
43
42
|
_r, _w, e = IO.select([client], nil, [client], nil)
|
44
|
-
# rubocop:enable Lint/IncompatibleIoSelectWithFiberScheduler
|
45
43
|
break unless e.empty?
|
46
44
|
|
47
45
|
if (data = client.read(65536))
|
@@ -12,17 +12,31 @@ module TestQueue
|
|
12
12
|
class RSpec < Runner
|
13
13
|
def initialize
|
14
14
|
super(TestFramework::RSpec.new)
|
15
|
+
|
16
|
+
@rspec = ::RSpec::Core::QueueRunner.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def start_master
|
20
|
+
seed_notification = ::RSpec::Core::Notifications::SeedNotification.new(@rspec.configuration.seed, seed_used?)
|
21
|
+
puts "#{seed_notification.fully_formatted}\n"
|
22
|
+
|
23
|
+
super
|
15
24
|
end
|
16
25
|
|
17
26
|
def run_worker(iterator)
|
18
|
-
rspec
|
19
|
-
rspec.run_each(iterator).to_i
|
27
|
+
@rspec.run_each(iterator).to_i
|
20
28
|
end
|
21
29
|
|
22
30
|
def summarize_worker(worker)
|
23
31
|
worker.summary = worker.lines.grep(/ examples?, /).first
|
24
32
|
worker.failure_output = worker.output[/^Failures:\n\n(.*)\n^Finished/m, 1]
|
25
33
|
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def seed_used?
|
38
|
+
@rspec.configuration.seed && @rspec.configuration.seed_used?
|
39
|
+
end
|
26
40
|
end
|
27
41
|
end
|
28
42
|
|
@@ -4,57 +4,65 @@ require_relative '../runner'
|
|
4
4
|
|
5
5
|
gem 'test-unit'
|
6
6
|
require 'test/unit'
|
7
|
-
require 'test/unit/collector/
|
8
|
-
require 'test/unit/testresult'
|
9
|
-
require 'test/unit/testsuite'
|
7
|
+
require 'test/unit/collector/load'
|
10
8
|
require 'test/unit/ui/console/testrunner'
|
11
9
|
|
12
|
-
class Test::Unit::TestSuite
|
13
|
-
attr_accessor :iterator
|
14
|
-
|
15
|
-
def run(result, &progress_block)
|
16
|
-
@start_time = Time.now
|
17
|
-
yield(STARTED, name)
|
18
|
-
yield(STARTED_OBJECT, self)
|
19
|
-
run_startup(result)
|
20
|
-
(@iterator || @tests).each do |test|
|
21
|
-
@n_tests += test.size
|
22
|
-
run_test(test, result, &progress_block)
|
23
|
-
@passed = false unless test.passed?
|
24
|
-
end
|
25
|
-
run_shutdown(result)
|
26
|
-
ensure
|
27
|
-
@elapsed_time = Time.now - @start_time
|
28
|
-
yield(FINISHED, name)
|
29
|
-
yield(FINISHED_OBJECT, self)
|
30
|
-
end
|
31
|
-
|
32
|
-
def failure_count
|
33
|
-
(@iterator || @tests).sum { |t| t.instance_variable_get(:@_result).failure_count }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
10
|
module TestQueue
|
38
11
|
class Runner
|
39
12
|
class TestUnit < Runner
|
40
|
-
|
41
|
-
|
42
|
-
|
13
|
+
class TestSuite < ::Test::Unit::TestSuite
|
14
|
+
def initialize(name, iterator)
|
15
|
+
super(name)
|
16
|
+
@tests = IteratorWrapper.new(iterator)
|
17
|
+
end
|
18
|
+
|
19
|
+
def run(*)
|
20
|
+
@started = true
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def size
|
25
|
+
return 0 unless @started
|
26
|
+
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class IteratorWrapper
|
32
|
+
def initialize(iterator)
|
33
|
+
@generator = Fiber.new do
|
34
|
+
iterator.each do |test|
|
35
|
+
Fiber.yield(test)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def shift
|
41
|
+
@generator.resume
|
42
|
+
rescue FiberError
|
43
|
+
nil
|
43
44
|
end
|
44
45
|
|
46
|
+
def each
|
47
|
+
while (test = shift)
|
48
|
+
yield(test)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize
|
45
54
|
super(TestFramework::TestUnit.new)
|
46
55
|
end
|
47
56
|
|
48
57
|
def run_worker(iterator)
|
49
|
-
@suite =
|
50
|
-
@suite.iterator = iterator
|
58
|
+
@suite = TestSuite.new('specified by test-queue master', iterator)
|
51
59
|
res = Test::Unit::UI::Console::TestRunner.new(@suite).start
|
52
60
|
res.run_count - res.pass_count
|
53
61
|
end
|
54
62
|
|
55
63
|
def summarize_worker(worker)
|
56
64
|
worker.summary = worker.output.split("\n").grep(/^\d+ tests?/).first
|
57
|
-
worker.failure_output = worker.output.scan(/^Failure
|
65
|
+
worker.failure_output = worker.output.scan(/^Failure:[^\n]*\n(.*?)\n=======================*/m).join("\n")
|
58
66
|
end
|
59
67
|
end
|
60
68
|
end
|
@@ -66,11 +74,39 @@ module TestQueue
|
|
66
74
|
end
|
67
75
|
|
68
76
|
def suites_from_file(path)
|
69
|
-
Test::Unit::
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
77
|
+
test_suite = Test::Unit::Collector::Load.new.collect(path)
|
78
|
+
return [] unless test_suite
|
79
|
+
return test_suite.tests.map { [_1.name, _1] } unless split_groups?
|
80
|
+
|
81
|
+
split_groups(test_suite)
|
82
|
+
end
|
83
|
+
|
84
|
+
def split_groups?
|
85
|
+
return @split_groups if defined?(@split_groups)
|
86
|
+
|
87
|
+
@split_groups = ENV['TEST_QUEUE_SPLIT_GROUPS'] && ENV['TEST_QUEUE_SPLIT_GROUPS'].strip.downcase == 'true'
|
88
|
+
end
|
89
|
+
|
90
|
+
def split_groups(test_suite, groups = [])
|
91
|
+
unless splittable?(test_suite)
|
92
|
+
groups << [test_suite.name, test_suite]
|
93
|
+
return groups
|
94
|
+
end
|
95
|
+
|
96
|
+
test_suite.tests.each do |suite|
|
97
|
+
if suite.is_a?(Test::Unit::TestSuite)
|
98
|
+
split_groups(suite, groups)
|
99
|
+
else
|
100
|
+
groups << [suite.name, suite]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
groups
|
104
|
+
end
|
105
|
+
|
106
|
+
def splittable?(test_suite)
|
107
|
+
test_suite.tests.none? do |test|
|
108
|
+
test.is_a?(Test::Unit::TestCase) && test[:no_split]
|
109
|
+
end
|
74
110
|
end
|
75
111
|
end
|
76
112
|
end
|
data/lib/test_queue/runner.rb
CHANGED
@@ -317,7 +317,9 @@ module TestQueue
|
|
317
317
|
|
318
318
|
@server.connect_address.connect do |sock|
|
319
319
|
sock.puts("TOKEN=#{@run_token}")
|
320
|
-
|
320
|
+
data = Marshal.dump([suite_name, path])
|
321
|
+
sock.puts("NEW SUITE #{data.bytesize}")
|
322
|
+
sock.write(data)
|
321
323
|
end
|
322
324
|
end
|
323
325
|
end
|
@@ -507,8 +509,9 @@ module TestQueue
|
|
507
509
|
worker = Marshal.load(data)
|
508
510
|
worker_completed(worker)
|
509
511
|
remote_workers -= 1
|
510
|
-
when /\ANEW SUITE (
|
511
|
-
|
512
|
+
when /\ANEW SUITE (\d+)/
|
513
|
+
data = sock.read($1.to_i)
|
514
|
+
suite_name, path = Marshal.load(data)
|
512
515
|
enqueue_discovered_suite(suite_name, path)
|
513
516
|
when /\AKABOOM/
|
514
517
|
# worker reporting an abnormal number of test failures;
|
data/lib/test_queue/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-queue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aman Gupta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: minitest/rspec parallel test runner for CI environments
|
14
14
|
email: ruby@tmm1.net
|