test-queue 0.2.13 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +18 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile-cucumber1-3 +4 -0
  6. data/Gemfile-cucumber1-3.lock +33 -0
  7. data/Gemfile-cucumber2-4 +4 -0
  8. data/Gemfile-cucumber2-4.lock +37 -0
  9. data/Gemfile-minitest4.lock +4 -23
  10. data/Gemfile-minitest5 +3 -0
  11. data/Gemfile-minitest5.lock +19 -0
  12. data/Gemfile-rspec2-1 +3 -0
  13. data/Gemfile-rspec2-1.lock +27 -0
  14. data/Gemfile-rspec3-0.lock +4 -13
  15. data/Gemfile-rspec3-1.lock +4 -13
  16. data/Gemfile-rspec3-2.lock +4 -13
  17. data/Gemfile-testunit.lock +4 -27
  18. data/Gemfile.lock +4 -1
  19. data/README.md +4 -0
  20. data/bin/minitest-queue +0 -1
  21. data/bin/testunit-queue +0 -1
  22. data/lib/test_queue/iterator.rb +41 -10
  23. data/lib/test_queue/runner.rb +167 -58
  24. data/lib/test_queue/runner/cucumber.rb +81 -12
  25. data/lib/test_queue/runner/minitest.rb +0 -4
  26. data/lib/test_queue/runner/minitest4.rb +25 -2
  27. data/lib/test_queue/runner/minitest5.rb +36 -11
  28. data/lib/test_queue/runner/rspec.rb +55 -7
  29. data/lib/test_queue/runner/rspec2.rb +11 -8
  30. data/lib/test_queue/runner/rspec3.rb +10 -7
  31. data/lib/test_queue/runner/sample.rb +0 -2
  32. data/lib/test_queue/runner/testunit.rb +25 -7
  33. data/lib/test_queue/stats.rb +95 -0
  34. data/lib/test_queue/test_framework.rb +29 -0
  35. data/script/bootstrap +12 -0
  36. data/script/cibuild +19 -0
  37. data/script/spec +7 -0
  38. data/spec/stats_spec.rb +76 -0
  39. data/test-queue.gemspec +1 -4
  40. data/test/cucumber.bats +57 -0
  41. data/test/minitest4.bats +34 -0
  42. data/test/minitest5.bats +111 -0
  43. data/test/rspec.bats +38 -0
  44. data/{features → test/samples/features}/bad.feature +0 -0
  45. data/{features → test/samples/features}/sample.feature +0 -0
  46. data/{features → test/samples/features}/sample2.feature +0 -0
  47. data/{features → test/samples/features}/step_definitions/common.rb +5 -1
  48. data/test/{sample_minispec.rb → samples/sample_minispec.rb} +6 -0
  49. data/test/{sample_minitest4.rb → samples/sample_minitest4.rb} +5 -3
  50. data/test/{sample_minitest5.rb → samples/sample_minitest5.rb} +5 -3
  51. data/test/{sample_spec.rb → samples/sample_spec.rb} +5 -3
  52. data/test/samples/sample_split_spec.rb +17 -0
  53. data/test/{sample_testunit.rb → samples/sample_testunit.rb} +5 -3
  54. data/test/testlib.bash +81 -0
  55. data/test/testunit.bats +20 -0
  56. metadata +40 -60
  57. data/test-multi.sh +0 -8
  58. data/test.sh +0 -23
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fbdc02f98f8e6e07a67693e13a244f5d50f5b6e5
4
+ data.tar.gz: 377d47b3e6b54fd3bbcb5d526d749480df6265dc
5
+ SHA512:
6
+ metadata.gz: 6bc6bc66ba5d4e4fe5a5a7c6a19522f0cf5dc1e3d044d33c9b462b36ad01097cdbaf133102f53bc61e0559bb33419574a10f4d17af0e20449b80a346eeb36440
7
+ data.tar.gz: 90885077e4c321b0f7c576b3ff7814e46aa43a98e7fb723cfbd770a2874f7655639cc5d4e8e1e943247779a31d092941303a03ebd8b3e886197ffbb09cd44033
@@ -0,0 +1 @@
1
+ .test_queue_stats
@@ -0,0 +1,18 @@
1
+ language: ruby
2
+ install: script/bootstrap
3
+ rvm:
4
+ - 2.2
5
+ env:
6
+ - SUITE=ruby
7
+ - SUITE=cucumber1-3
8
+ - SUITE=cucumber2-4
9
+ - SUITE=minitest4
10
+ - SUITE=minitest5
11
+ - SUITE=rspec2-1
12
+ - SUITE=rspec3-0
13
+ - SUITE=rspec3-1
14
+ - SUITE=rspec3-2
15
+ - SUITE=testunit
16
+ script: script/cibuild
17
+ notifications:
18
+ email: false
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
  gem 'minitest', '5.3.3'
4
+ gem 'rspec', '>= 2.13', '< 4.0'
5
+ gem 'cucumber', '~> 1.3.10'
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+ gem 'cucumber', '~> 1.3.10'
4
+ gem 'rspec-expectations', '~> 2.14.4'
@@ -0,0 +1,33 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ test-queue (0.3.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ builder (3.2.2)
10
+ cucumber (1.3.20)
11
+ builder (>= 2.1.2)
12
+ diff-lcs (>= 1.1.3)
13
+ gherkin (~> 2.12)
14
+ multi_json (>= 1.7.5, < 2.0)
15
+ multi_test (>= 0.1.2)
16
+ diff-lcs (1.2.5)
17
+ gherkin (2.12.2)
18
+ multi_json (~> 1.3)
19
+ multi_json (1.12.1)
20
+ multi_test (0.1.2)
21
+ rspec-expectations (2.14.5)
22
+ diff-lcs (>= 1.1.3, < 2.0)
23
+
24
+ PLATFORMS
25
+ ruby
26
+
27
+ DEPENDENCIES
28
+ cucumber (~> 1.3.10)
29
+ rspec-expectations (~> 2.14.4)
30
+ test-queue!
31
+
32
+ BUNDLED WITH
33
+ 1.13.1
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+ gem 'cucumber', '2.4.0'
4
+ gem 'rspec-expectations', '2.14.4'
@@ -0,0 +1,37 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ test-queue (0.3.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ builder (3.2.2)
10
+ cucumber (2.4.0)
11
+ builder (>= 2.1.2)
12
+ cucumber-core (~> 1.5.0)
13
+ cucumber-wire (~> 0.0.1)
14
+ diff-lcs (>= 1.1.3)
15
+ gherkin (~> 4.0)
16
+ multi_json (>= 1.7.5, < 2.0)
17
+ multi_test (>= 0.1.2)
18
+ cucumber-core (1.5.0)
19
+ gherkin (~> 4.0)
20
+ cucumber-wire (0.0.1)
21
+ diff-lcs (1.2.5)
22
+ gherkin (4.0.0)
23
+ multi_json (1.12.1)
24
+ multi_test (0.1.2)
25
+ rspec-expectations (2.14.4)
26
+ diff-lcs (>= 1.1.3, < 2.0)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ cucumber (= 2.4.0)
33
+ rspec-expectations (= 2.14.4)
34
+ test-queue!
35
+
36
+ BUNDLED WITH
37
+ 1.13.1
@@ -1,38 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.13)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- builder (3.2.2)
10
- cucumber (1.3.15)
11
- builder (>= 2.1.2)
12
- diff-lcs (>= 1.1.3)
13
- gherkin (~> 2.12)
14
- multi_json (>= 1.7.5, < 2.0)
15
- multi_test (>= 0.1.1)
16
- diff-lcs (1.2.5)
17
- gherkin (2.12.2)
18
- multi_json (~> 1.3)
19
9
  minitest (4.7.3)
20
- multi_json (1.10.1)
21
- multi_test (0.1.1)
22
- rspec (2.99.0)
23
- rspec-core (~> 2.99.0)
24
- rspec-expectations (~> 2.99.0)
25
- rspec-mocks (~> 2.99.0)
26
- rspec-core (2.99.1)
27
- rspec-expectations (2.99.1)
28
- diff-lcs (>= 1.1.3, < 2.0)
29
- rspec-mocks (2.99.1)
30
10
 
31
11
  PLATFORMS
32
12
  ruby
33
13
 
34
14
  DEPENDENCIES
35
- cucumber (~> 1.3.10)
36
15
  minitest (= 4.7.3)
37
- rspec (>= 2.13, < 4.0)
38
16
  test-queue!
17
+
18
+ BUNDLED WITH
19
+ 1.13.1
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+ gem 'minitest', '5.3.3'
@@ -0,0 +1,19 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ test-queue (0.3.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.3.3)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ minitest (= 5.3.3)
16
+ test-queue!
17
+
18
+ BUNDLED WITH
19
+ 1.13.1
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+ gem 'rspec', '2.13.0'
@@ -0,0 +1,27 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ test-queue (0.3.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.2.5)
10
+ rspec (2.13.0)
11
+ rspec-core (~> 2.13.0)
12
+ rspec-expectations (~> 2.13.0)
13
+ rspec-mocks (~> 2.13.0)
14
+ rspec-core (2.13.1)
15
+ rspec-expectations (2.13.0)
16
+ diff-lcs (>= 1.1.3, < 2.0)
17
+ rspec-mocks (2.13.1)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ rspec (= 2.13.0)
24
+ test-queue!
25
+
26
+ BUNDLED WITH
27
+ 1.13.1
@@ -1,23 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.12)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- builder (3.2.2)
10
- cucumber (1.3.19)
11
- builder (>= 2.1.2)
12
- diff-lcs (>= 1.1.3)
13
- gherkin (~> 2.12)
14
- multi_json (>= 1.7.5, < 2.0)
15
- multi_test (>= 0.1.2)
16
9
  diff-lcs (1.2.5)
17
- gherkin (2.12.2)
18
- multi_json (~> 1.3)
19
- multi_json (1.11.0)
20
- multi_test (0.1.2)
21
10
  rspec (3.0.0)
22
11
  rspec-core (~> 3.0.0)
23
12
  rspec-expectations (~> 3.0.0)
@@ -35,6 +24,8 @@ PLATFORMS
35
24
  ruby
36
25
 
37
26
  DEPENDENCIES
38
- cucumber (~> 1.3.10)
39
27
  rspec (~> 3.0.0)
40
28
  test-queue!
29
+
30
+ BUNDLED WITH
31
+ 1.13.1
@@ -1,23 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.12)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- builder (3.2.2)
10
- cucumber (1.3.19)
11
- builder (>= 2.1.2)
12
- diff-lcs (>= 1.1.3)
13
- gherkin (~> 2.12)
14
- multi_json (>= 1.7.5, < 2.0)
15
- multi_test (>= 0.1.2)
16
9
  diff-lcs (1.2.5)
17
- gherkin (2.12.2)
18
- multi_json (~> 1.3)
19
- multi_json (1.11.0)
20
- multi_test (0.1.2)
21
10
  rspec (3.1.0)
22
11
  rspec-core (~> 3.1.0)
23
12
  rspec-expectations (~> 3.1.0)
@@ -35,6 +24,8 @@ PLATFORMS
35
24
  ruby
36
25
 
37
26
  DEPENDENCIES
38
- cucumber (~> 1.3.10)
39
27
  rspec (~> 3.1.0)
40
28
  test-queue!
29
+
30
+ BUNDLED WITH
31
+ 1.13.1
@@ -1,23 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.12)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- builder (3.2.2)
10
- cucumber (1.3.19)
11
- builder (>= 2.1.2)
12
- diff-lcs (>= 1.1.3)
13
- gherkin (~> 2.12)
14
- multi_json (>= 1.7.5, < 2.0)
15
- multi_test (>= 0.1.2)
16
9
  diff-lcs (1.2.5)
17
- gherkin (2.12.2)
18
- multi_json (~> 1.3)
19
- multi_json (1.11.0)
20
- multi_test (0.1.2)
21
10
  rspec (3.2.0)
22
11
  rspec-core (~> 3.2.0)
23
12
  rspec-expectations (~> 3.2.0)
@@ -36,6 +25,8 @@ PLATFORMS
36
25
  ruby
37
26
 
38
27
  DEPENDENCIES
39
- cucumber (~> 1.3.10)
40
28
  rspec (~> 3.2.0)
41
29
  test-queue!
30
+
31
+ BUNDLED WITH
32
+ 1.13.1
@@ -1,36 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.13)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- builder (3.2.2)
10
- cucumber (1.3.18)
11
- builder (>= 2.1.2)
12
- diff-lcs (>= 1.1.3)
13
- gherkin (~> 2.12)
14
- multi_json (>= 1.7.5, < 2.0)
15
- multi_test (>= 0.1.1)
16
- diff-lcs (1.2.5)
17
- gherkin (2.12.2)
18
- multi_json (~> 1.3)
19
- multi_json (1.10.1)
20
- multi_test (0.1.1)
21
9
  power_assert (0.2.2)
22
- rspec (3.1.0)
23
- rspec-core (~> 3.1.0)
24
- rspec-expectations (~> 3.1.0)
25
- rspec-mocks (~> 3.1.0)
26
- rspec-core (3.1.7)
27
- rspec-support (~> 3.1.0)
28
- rspec-expectations (3.1.2)
29
- diff-lcs (>= 1.2.0, < 2.0)
30
- rspec-support (~> 3.1.0)
31
- rspec-mocks (3.1.3)
32
- rspec-support (~> 3.1.0)
33
- rspec-support (3.1.2)
34
10
  test-unit (3.0.8)
35
11
  power_assert
36
12
 
@@ -38,7 +14,8 @@ PLATFORMS
38
14
  ruby
39
15
 
40
16
  DEPENDENCIES
41
- cucumber (~> 1.3.10)
42
- rspec (>= 2.13, < 4.0)
43
17
  test-queue!
44
18
  test-unit (= 3.0.8)
19
+
20
+ BUNDLED WITH
21
+ 1.13.1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- test-queue (0.2.13)
4
+ test-queue (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -36,3 +36,6 @@ DEPENDENCIES
36
36
  minitest (= 5.3.3)
37
37
  rspec (>= 2.13, < 4.0)
38
38
  test-queue!
39
+
40
+ BUNDLED WITH
41
+ 1.13.1
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  ## test-queue
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/test-queue.svg)](https://rubygems.org/gems/test-queue)
4
+ [![Build Status](https://travis-ci.org/tmm1/test-queue.svg?branch=master)](https://travis-ci.org/tmm1/test-queue)
5
+
3
6
  Yet another parallel test runner, built using a centralized queue to ensure
4
7
  optimal distribution of tests between workers.
5
8
 
@@ -35,6 +38,7 @@ the workload and relay results back to a central master.
35
38
  - `TEST_QUEUE_RELAY_TIMEOUT`: when using remote workers, the amount of time a worker will try to reconnect to start work
36
39
  - `TEST_QUEUE_RELAY_TOKEN`: when using remote workers, this must be the same on both workers and the server for remote workers to run tests.
37
40
  - `TEST_QUEUE_SLAVE_MESSAGE`: when using remote workers, set this on a slave worker and it will appear on the slave's connection message on the master.
41
+ - `TEST_QUEUE_SPLIT_GROUPS`: split tests up by example rather than example group. Faster for tests with short setup time such as selenium. RSpec only. Add the :no_split tag to ExampleGroups you don't want split.
38
42
 
39
43
  ### usage
40
44
 
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'test_queue'
3
3
  require 'test_queue/runner/minitest'
4
- ARGV.each{ |f| require(f) }
5
4
  TestQueue::Runner::MiniTest.new.execute
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'test_queue'
3
3
  require 'test_queue/runner/testunit'
4
- ARGV.each{ |f| require(f) }
5
4
  TestQueue::Runner::TestUnit.new.execute
@@ -1,34 +1,53 @@
1
1
  module TestQueue
2
2
  class Iterator
3
- attr_reader :stats, :sock
3
+ attr_reader :sock
4
4
 
5
- def initialize(sock, suites, filter=nil)
5
+ def initialize(test_framework, sock, filter=nil, early_failure_limit: nil)
6
+ @test_framework = test_framework
6
7
  @done = false
7
- @stats = {}
8
+ @suite_stats = []
8
9
  @procline = $0
9
10
  @sock = sock
10
- @suites = suites
11
11
  @filter = filter
12
12
  if @sock =~ /^(.+):(\d+)$/
13
13
  @tcp_address = $1
14
14
  @tcp_port = $2.to_i
15
15
  end
16
+ @failures = 0
17
+ @early_failure_limit = early_failure_limit
16
18
  end
17
19
 
18
20
  def each
19
21
  fail "already used this iterator. previous caller: #@done" if @done
20
22
 
21
23
  while true
22
- client = connect_to_master('POP')
24
+ # If we've hit too many failures in one worker, assume the entire
25
+ # test suite is broken, and notify master so the run
26
+ # can be immediately halted.
27
+ if @early_failure_limit && @failures >= @early_failure_limit
28
+ connect_to_master("KABOOM")
29
+ break
30
+ else
31
+ client = connect_to_master('POP')
32
+ end
23
33
  break if client.nil?
24
- r, w, e = IO.select([client], nil, [client], nil)
34
+ _r, _w, e = IO.select([client], nil, [client], nil)
25
35
  break if !e.empty?
26
36
 
27
37
  if data = client.read(65536)
28
38
  client.close
29
39
  item = Marshal.load(data)
30
40
  break if item.nil? || item.empty?
31
- suite = @suites[item]
41
+ if item == "WAIT"
42
+ $0 = "#{@procline} - Waiting for work"
43
+ sleep 0.1
44
+ next
45
+ end
46
+ suite_name, path = item
47
+ suite = load_suite(suite_name, path)
48
+
49
+ # Maybe we were told to load a suite that doesn't exist anymore.
50
+ next unless suite
32
51
 
33
52
  $0 = "#{@procline} - #{suite.respond_to?(:description) ? suite.description : suite}"
34
53
  start = Time.now
@@ -37,7 +56,8 @@ module TestQueue
37
56
  else
38
57
  yield suite
39
58
  end
40
- @stats[suite.to_s] = Time.now - start
59
+ @suite_stats << TestQueue::Stats::Suite.new(suite_name, path, Time.now - start, Time.now)
60
+ @failures += suite.failure_count if suite.respond_to? :failure_count
41
61
  else
42
62
  break
43
63
  end
@@ -45,8 +65,8 @@ module TestQueue
45
65
  rescue Errno::ENOENT, Errno::ECONNRESET, Errno::ECONNREFUSED
46
66
  ensure
47
67
  @done = caller.first
48
- File.open("/tmp/test_queue_worker_#{$$}_stats", "wb") do |f|
49
- f.write Marshal.dump(@stats)
68
+ File.open("/tmp/test_queue_worker_#{$$}_suites", "wb") do |f|
69
+ Marshal.dump(@suite_stats, f)
50
70
  end
51
71
  end
52
72
 
@@ -68,5 +88,16 @@ module TestQueue
68
88
  def empty?
69
89
  false
70
90
  end
91
+
92
+ def load_suite(suite_name, path)
93
+ @loaded_suites ||= {}
94
+ suite = @loaded_suites[suite_name]
95
+ return suite if suite
96
+
97
+ @test_framework.suites_from_file(path).each do |name, suite|
98
+ @loaded_suites[name] = suite
99
+ end
100
+ @loaded_suites[suite_name]
101
+ end
71
102
  end
72
103
  end