parallel_split_test 0.1.1 → 0.1.2
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.
- data/Gemfile.lock +1 -1
- data/Readme.md +17 -8
- data/lib/parallel_split_test.rb +8 -0
- data/lib/parallel_split_test/command_line.rb +9 -11
- data/lib/parallel_split_test/core_ext/rspec_example.rb +11 -0
- data/lib/parallel_split_test/version.rb +1 -1
- data/spec/parallel_split_test_spec.rb +16 -0
- metadata +8 -7
data/Gemfile.lock
CHANGED
data/Readme.md
CHANGED
@@ -9,21 +9,30 @@ Or
|
|
9
9
|
|
10
10
|
Usage
|
11
11
|
=====
|
12
|
+
|
13
|
+
### 1: prepare your databases
|
14
|
+
To use 1 database per test-process, add this to your `config/database.yml`<br/>
|
15
|
+
|
16
|
+
test:
|
17
|
+
database: yourproject_test<%= ENV['TEST_ENV_NUMBER'] %>
|
18
|
+
|
19
|
+
|
20
|
+
- `TEST_ENV_NUMBER` is '' for the first process and 2 for the 2nd, it reuses your normal test database
|
21
|
+
- Optionally install [parallel_tests](https://github.com/grosser/parallel_tests) to get database helper tasks like `rake parallel:prepare`
|
22
|
+
|
23
|
+
|
24
|
+
### 2: find a slow/big test file
|
25
|
+
|
12
26
|
# spec/xxx_spec.rb
|
13
27
|
require "spec_helper"
|
14
28
|
|
15
29
|
describe "X" do
|
16
30
|
it {sleep 5}
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "Y" do
|
20
31
|
it {sleep 5}
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "Z" do
|
24
32
|
it {sleep 5}
|
25
33
|
end
|
26
34
|
|
35
|
+
### 3: run
|
27
36
|
parallel_split_test spec/xxx_spec.rb [regular rspec options]
|
28
37
|
|
29
38
|
Output
|
@@ -51,9 +60,9 @@ TIPS
|
|
51
60
|
TODO
|
52
61
|
====
|
53
62
|
- combine exit status (1 + 0 == 1)
|
54
|
-
-
|
55
|
-
- Test::Unit support
|
63
|
+
- re-print summary of all test results
|
56
64
|
- Cucumber support
|
65
|
+
- Test::Unit support
|
57
66
|
|
58
67
|
Author
|
59
68
|
======
|
data/lib/parallel_split_test.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
require 'parallel_split_test'
|
1
2
|
require 'parallel'
|
2
3
|
require 'rspec/core/command_line'
|
4
|
+
require 'parallel_split_test/core_ext/rspec_example'
|
3
5
|
|
4
6
|
module ParallelSplitTest
|
5
7
|
class CommandLine < RSpec::Core::CommandLine
|
@@ -8,20 +10,24 @@ module ParallelSplitTest
|
|
8
10
|
processes = (ENV['PARALLEL_SPLIT_TEST_PROCESSES'] || Parallel.processor_count).to_i
|
9
11
|
|
10
12
|
Parallel.in_processes(processes) do |process_number|
|
13
|
+
ParallelSplitTest.example_counter = 0
|
14
|
+
ParallelSplitTest.process_count = processes
|
15
|
+
ParallelSplitTest.process_number = process_number
|
16
|
+
|
11
17
|
ENV['TEST_ENV_NUMBER'] = (process_number == 0 ? '' : (process_number + 1).to_s)
|
12
|
-
run_group_of_tests(processes
|
18
|
+
run_group_of_tests(processes)
|
13
19
|
end
|
14
20
|
end
|
15
21
|
|
16
22
|
private
|
17
23
|
|
18
|
-
def run_group_of_tests(processes
|
24
|
+
def run_group_of_tests(processes)
|
19
25
|
example_count = @world.example_count / processes
|
20
26
|
|
21
27
|
@configuration.reporter.report(example_count, seed) do |reporter|
|
22
28
|
begin
|
23
29
|
@configuration.run_hook(:before, :suite)
|
24
|
-
groups =
|
30
|
+
groups = @world.example_groups.ordered
|
25
31
|
groups.map {|g| g.run(reporter)}.all? ? 0 : @configuration.failure_exit_code
|
26
32
|
ensure
|
27
33
|
@configuration.run_hook(:after, :suite)
|
@@ -33,14 +39,6 @@ module ParallelSplitTest
|
|
33
39
|
@configuration.randomize? ? @configuration.seed : nil
|
34
40
|
end
|
35
41
|
|
36
|
-
def groups_for_this_process(groups, number, count)
|
37
|
-
selected = []
|
38
|
-
groups.each_with_index do |group, i|
|
39
|
-
selected << group if i % count == number
|
40
|
-
end
|
41
|
-
selected
|
42
|
-
end
|
43
|
-
|
44
42
|
def setup_copied_from_rspec(err, out)
|
45
43
|
@configuration.error_stream = err
|
46
44
|
@configuration.output_stream ||= out
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'parallel_split_test'
|
2
|
+
require 'rspec/core/example'
|
3
|
+
|
4
|
+
RSpec::Core::Example.class_eval do
|
5
|
+
alias :run_without_parallel_split_test :run
|
6
|
+
def run(*args, &block)
|
7
|
+
if ParallelSplitTest.run_example?
|
8
|
+
run_without_parallel_split_test(*args, &block)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -80,6 +80,7 @@ describe ParallelSplitTest do
|
|
80
80
|
end
|
81
81
|
RUBY
|
82
82
|
result = parallel_split_test "xxx_spec.rb"
|
83
|
+
result.scan('1 example, 0 failures').size.should == 2
|
83
84
|
|
84
85
|
processes = ["a","b"].map do |process|
|
85
86
|
rex = /it-ran-#{process}-in-(\d)-/
|
@@ -103,6 +104,21 @@ describe ParallelSplitTest do
|
|
103
104
|
|
104
105
|
time{ parallel_split_test "xxx_spec.rb" }.should < 2
|
105
106
|
end
|
107
|
+
|
108
|
+
it "splits based on examples" do
|
109
|
+
write "xxx_spec.rb", <<-RUBY
|
110
|
+
describe "X" do
|
111
|
+
describe "Y" do
|
112
|
+
it { sleep 1 }
|
113
|
+
it { sleep 1 }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
RUBY
|
117
|
+
|
118
|
+
result = nil
|
119
|
+
time{ result = parallel_split_test "xxx_spec.rb" }.should < 2
|
120
|
+
result.scan('1 example, 0 failures').size.should == 2
|
121
|
+
end
|
106
122
|
end
|
107
123
|
end
|
108
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel_split_test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-01 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &83628200 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *83628200
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: parallel
|
27
|
-
requirement: &
|
27
|
+
requirement: &83627950 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: 0.5.12
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *83627950
|
36
36
|
description:
|
37
37
|
email: michael@grosser.it
|
38
38
|
executables:
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- bin/parallel_split_test
|
49
49
|
- lib/parallel_split_test.rb
|
50
50
|
- lib/parallel_split_test/command_line.rb
|
51
|
+
- lib/parallel_split_test/core_ext/rspec_example.rb
|
51
52
|
- lib/parallel_split_test/runner.rb
|
52
53
|
- lib/parallel_split_test/version.rb
|
53
54
|
- parallel_split_test.gemspec
|
@@ -68,7 +69,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
69
|
version: '0'
|
69
70
|
segments:
|
70
71
|
- 0
|
71
|
-
hash:
|
72
|
+
hash: 40026127
|
72
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
74
|
none: false
|
74
75
|
requirements:
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
version: '0'
|
78
79
|
segments:
|
79
80
|
- 0
|
80
|
-
hash:
|
81
|
+
hash: 40026127
|
81
82
|
requirements: []
|
82
83
|
rubyforge_project:
|
83
84
|
rubygems_version: 1.8.10
|