parallel_split_test 0.2.0 → 0.2.1
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/.gitignore +1 -0
- data/.rspec +2 -0
- data/.travis.yml +1 -2
- data/Gemfile +3 -4
- data/Gemfile.lock +15 -13
- data/Rakefile +4 -11
- data/Readme.md +7 -4
- data/bin/parallel_split_test +3 -1
- data/lib/parallel_split_test.rb +14 -14
- data/lib/parallel_split_test/command_line.rb +1 -1
- data/lib/parallel_split_test/output_recorder.rb +4 -4
- data/lib/parallel_split_test/runner.rb +10 -2
- data/lib/parallel_split_test/version.rb +1 -1
- data/spec/parallel_split_test_spec.rb +41 -14
- metadata +21 -9
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
spec/tmp*
|
data/.rspec
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,28 +1,30 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
parallel_split_test (0.2.
|
4
|
+
parallel_split_test (0.2.1)
|
5
5
|
parallel (>= 0.5.13)
|
6
6
|
rspec (>= 2)
|
7
7
|
|
8
8
|
GEM
|
9
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
rspec-
|
17
|
-
rspec-
|
18
|
-
|
19
|
-
rspec-
|
20
|
-
|
21
|
-
|
11
|
+
bump (0.4.1)
|
12
|
+
diff-lcs (1.2.3)
|
13
|
+
parallel (0.6.4)
|
14
|
+
rake (10.0.4)
|
15
|
+
rspec (2.13.0)
|
16
|
+
rspec-core (~> 2.13.0)
|
17
|
+
rspec-expectations (~> 2.13.0)
|
18
|
+
rspec-mocks (~> 2.13.0)
|
19
|
+
rspec-core (2.13.1)
|
20
|
+
rspec-expectations (2.13.0)
|
21
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
22
|
+
rspec-mocks (2.13.1)
|
22
23
|
|
23
24
|
PLATFORMS
|
24
25
|
ruby
|
25
26
|
|
26
27
|
DEPENDENCIES
|
28
|
+
bump
|
27
29
|
parallel_split_test!
|
28
30
|
rake
|
data/Rakefile
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
+
require 'bundler/setup'
|
1
2
|
require 'bundler/gem_tasks'
|
3
|
+
require 'bump/tasks'
|
2
4
|
|
3
5
|
task :default do
|
4
6
|
sh "rspec spec/"
|
5
7
|
end
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
10
|
-
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
11
|
-
version_file = File.read(file)
|
12
|
-
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
13
|
-
version_parts[index] = version_parts[index].to_i + 1
|
14
|
-
new_version = version_parts * '.'
|
15
|
-
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
16
|
-
|
17
|
-
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
9
|
+
task :selftest do
|
10
|
+
sh "./bin/parallel_split_test spec/"
|
18
11
|
end
|
data/Readme.md
CHANGED
@@ -2,10 +2,7 @@ Split a big test file into multiple chunks and run them in parallel
|
|
2
2
|
|
3
3
|
Install
|
4
4
|
=======
|
5
|
-
|
6
|
-
Or
|
7
|
-
|
8
|
-
rails plugin install git://github.com/grosser/parallel_split_test.git
|
5
|
+
gem install parallel_split_test
|
9
6
|
|
10
7
|
Usage
|
11
8
|
=====
|
@@ -56,6 +53,12 @@ Output
|
|
56
53
|
Took 10.06 seconds with 2 processes
|
57
54
|
|
58
55
|
|
56
|
+
Options
|
57
|
+
=======
|
58
|
+
<!-- last section of ./bin/parallel_split_test -h -->
|
59
|
+
|
60
|
+
-o, --test-options STRING Run tests with these options
|
61
|
+
|
59
62
|
TIPS
|
60
63
|
====
|
61
64
|
- set number of processes to use with `PARALLEL_SPLIT_TEST_PROCESSES` environment variable
|
data/bin/parallel_split_test
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require "optparse"
|
3
3
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
4
|
|
5
|
+
options = {}
|
5
6
|
parser = OptionParser.new do |opts|
|
6
7
|
opts.banner = <<BANNER
|
7
8
|
Split a big test file into multiple chunks and run them in parallel, giving ENV['TEST_ENV_NUMBER'] ('', '2', '3', ...)
|
@@ -13,6 +14,7 @@ Options are:
|
|
13
14
|
BANNER
|
14
15
|
opts.on("-v", "--version", "Show Version"){ require 'parallel_split_test/version'; puts ParallelSplitTest::VERSION; exit}
|
15
16
|
opts.on("-h", "--help", "Show this.") { puts opts; exit }
|
17
|
+
opts.on("-o", "--test-options STRING", "Run tests with these options") { |test_options| options[:test_options] = test_options }
|
16
18
|
end
|
17
19
|
|
18
20
|
parser.parse!
|
@@ -23,4 +25,4 @@ if ARGV.empty?
|
|
23
25
|
end
|
24
26
|
|
25
27
|
require 'parallel_split_test/runner'
|
26
|
-
exit ParallelSplitTest::Runner.run(ARGV)
|
28
|
+
exit ParallelSplitTest::Runner.run(ARGV, options)
|
data/lib/parallel_split_test.rb
CHANGED
@@ -3,22 +3,22 @@ require 'parallel'
|
|
3
3
|
module ParallelSplitTest
|
4
4
|
class << self
|
5
5
|
attr_accessor :example_counter, :processes, :process_number
|
6
|
-
end
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def run_example?
|
8
|
+
self.example_counter += 1
|
9
|
+
(example_counter - 1) % processes == process_number
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
def choose_number_of_processes
|
13
|
+
self.processes = best_number_of_processes
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
def best_number_of_processes
|
17
|
+
[
|
18
|
+
ENV['PARALLEL_SPLIT_TEST_PROCESSES'],
|
19
|
+
Parallel.physical_processor_count,
|
20
|
+
Parallel.processor_count
|
21
|
+
].map(&:to_i).find{|number| number > 0 }
|
22
|
+
end
|
23
23
|
end
|
24
24
|
end
|
@@ -7,11 +7,11 @@ module ParallelSplitTest
|
|
7
7
|
@out = out
|
8
8
|
end
|
9
9
|
|
10
|
-
%w[puts write print putc].each do |method|
|
10
|
+
%w[puts write print putc flush].each do |method|
|
11
11
|
class_eval <<-RUBY, __FILE__, __LINE__
|
12
12
|
def #{method}(*args)
|
13
|
-
@recorded
|
14
|
-
@out
|
13
|
+
@recorded.#{method}(*args)
|
14
|
+
@out.#{method}(*args)
|
15
15
|
end
|
16
16
|
RUBY
|
17
17
|
end
|
@@ -21,4 +21,4 @@ module ParallelSplitTest
|
|
21
21
|
@recorded.read
|
22
22
|
end
|
23
23
|
end
|
24
|
-
end
|
24
|
+
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
require 'parallel_split_test/command_line'
|
2
|
+
require 'shellwords'
|
2
3
|
|
3
4
|
# a cleaned up version of the RSpec runner, e.g. no drb support
|
4
5
|
module ParallelSplitTest
|
5
6
|
class Runner < RSpec::Core::Runner
|
6
|
-
def self.run(args,
|
7
|
+
def self.run(args, options={})
|
8
|
+
err = $stderr
|
9
|
+
out = $stdout
|
7
10
|
trap_interrupt
|
11
|
+
|
12
|
+
args += Shellwords.shellwords(options[:test_options]) if options[:test_options] # TODO smarter parsing ...
|
13
|
+
|
8
14
|
options = RSpec::Core::ConfigurationOptions.new(args)
|
9
15
|
options.parse_options
|
10
16
|
|
@@ -18,6 +24,8 @@ module ParallelSplitTest
|
|
18
24
|
RSpec.reset
|
19
25
|
end
|
20
26
|
|
27
|
+
private
|
28
|
+
|
21
29
|
def self.report_execution_time(out)
|
22
30
|
start = Time.now.to_f
|
23
31
|
result = yield
|
@@ -26,4 +34,4 @@ module ParallelSplitTest
|
|
26
34
|
result
|
27
35
|
end
|
28
36
|
end
|
29
|
-
end
|
37
|
+
end
|
@@ -44,7 +44,7 @@ describe ParallelSplitTest do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def parallel_split_test(x, options={})
|
47
|
-
run "PARALLEL_SPLIT_TEST_PROCESSES
|
47
|
+
run "PARALLEL_SPLIT_TEST_PROCESSES=#{options[:process_count] || 2} ../../bin/parallel_split_test #{x}", options
|
48
48
|
end
|
49
49
|
|
50
50
|
def time
|
@@ -55,13 +55,11 @@ describe ParallelSplitTest do
|
|
55
55
|
|
56
56
|
let(:root) { File.expand_path('../../', __FILE__) }
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
after do
|
64
|
-
Dir.chdir root
|
58
|
+
around do |example|
|
59
|
+
dir = "spec/tmp#{ENV['TEST_ENV_NUMBER']}"
|
60
|
+
run "rm -rf #{dir} ; mkdir #{dir}"
|
61
|
+
Dir.chdir(dir, &example)
|
62
|
+
run "rm -rf #{dir}"
|
65
63
|
end
|
66
64
|
|
67
65
|
describe "printing version" do
|
@@ -108,32 +106,49 @@ describe ParallelSplitTest do
|
|
108
106
|
result.scan(/it-ran-.-in-.?-/).sort.should == ["it-ran-a-in--", "it-ran-b-in-2-"]
|
109
107
|
end
|
110
108
|
|
109
|
+
it "runs in different processes for many examples/processes" do
|
110
|
+
write "xxx_spec.rb", <<-RUBY
|
111
|
+
describe "X" do
|
112
|
+
#{(0...3).to_a.map{|i| "it{ puts 'it-ran-"+ i.to_s+"-in-'+ENV['TEST_ENV_NUMBER'].to_s + '-' }" }.join("\n")}
|
113
|
+
describe "Y" do
|
114
|
+
#{(3...6).to_a.map{|i| "it{ puts 'it-ran-"+ i.to_s+"-in-'+ENV['TEST_ENV_NUMBER'].to_s + '-' }" }.join("\n")}
|
115
|
+
describe "Y" do
|
116
|
+
#{(6...9).to_a.map{|i| "it{ puts 'it-ran-"+ i.to_s+"-in-'+ENV['TEST_ENV_NUMBER'].to_s + '-' }" }.join("\n")}
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
RUBY
|
121
|
+
result = parallel_split_test "xxx_spec.rb", :process_count => 3
|
122
|
+
result.scan('3 examples, 0 failures').size.should == 6
|
123
|
+
result.scan(/it-ran-.-in-.?-/).size.should == 9
|
124
|
+
end
|
125
|
+
|
111
126
|
it "runs faster" do
|
112
127
|
write "xxx_spec.rb", <<-RUBY
|
113
128
|
describe "X" do
|
114
|
-
it { sleep 1 }
|
129
|
+
it { sleep 1.5 }
|
115
130
|
end
|
116
131
|
|
117
132
|
describe "Y" do
|
118
|
-
it { sleep 1 }
|
133
|
+
it { sleep 1.5 }
|
119
134
|
end
|
120
135
|
RUBY
|
121
136
|
|
122
|
-
time{ parallel_split_test "xxx_spec.rb" }.should <
|
137
|
+
time{ parallel_split_test "xxx_spec.rb" }.should < 3
|
123
138
|
end
|
124
139
|
|
125
140
|
it "splits based on examples" do
|
126
141
|
write "xxx_spec.rb", <<-RUBY
|
127
142
|
describe "X" do
|
128
143
|
describe "Y" do
|
129
|
-
it { sleep 1 }
|
130
|
-
it { sleep 1 }
|
144
|
+
it { sleep 1.5 }
|
145
|
+
it { sleep 1.5 }
|
131
146
|
end
|
132
147
|
end
|
133
148
|
RUBY
|
134
149
|
|
135
150
|
result = nil
|
136
|
-
time{ result = parallel_split_test "xxx_spec.rb" }.should <
|
151
|
+
time{ result = parallel_split_test "xxx_spec.rb" }.should < 3
|
137
152
|
result.scan('1 example, 0 failures').size.should == 4
|
138
153
|
end
|
139
154
|
|
@@ -207,6 +222,18 @@ describe ParallelSplitTest do
|
|
207
222
|
result = parallel_split_test "xxx_spec.rb"
|
208
223
|
result.should include("1 example, 0 failures\n1 example, 0 failures")
|
209
224
|
end
|
225
|
+
|
226
|
+
it "can use --test-options" do
|
227
|
+
write "xxx_spec.rb", <<-RUBY
|
228
|
+
describe "xxx" do
|
229
|
+
it "yyy" do
|
230
|
+
end
|
231
|
+
end
|
232
|
+
RUBY
|
233
|
+
|
234
|
+
result = parallel_split_test "xxx_spec.rb --test-options '--format html'"
|
235
|
+
result.should include "</body>"
|
236
|
+
end
|
210
237
|
end
|
211
238
|
end
|
212
239
|
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.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-04-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: parallel
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,7 +37,12 @@ dependencies:
|
|
32
37
|
version: 0.5.13
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.5.13
|
36
46
|
description:
|
37
47
|
email: michael@grosser.it
|
38
48
|
executables:
|
@@ -40,6 +50,8 @@ executables:
|
|
40
50
|
extensions: []
|
41
51
|
extra_rdoc_files: []
|
42
52
|
files:
|
53
|
+
- .gitignore
|
54
|
+
- .rspec
|
43
55
|
- .travis.yml
|
44
56
|
- Gemfile
|
45
57
|
- Gemfile.lock
|
@@ -71,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
83
|
version: '0'
|
72
84
|
segments:
|
73
85
|
- 0
|
74
|
-
hash:
|
86
|
+
hash: 4510026555026143828
|
75
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
88
|
none: false
|
77
89
|
requirements:
|
@@ -80,10 +92,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
92
|
version: '0'
|
81
93
|
segments:
|
82
94
|
- 0
|
83
|
-
hash:
|
95
|
+
hash: 4510026555026143828
|
84
96
|
requirements: []
|
85
97
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.8.
|
98
|
+
rubygems_version: 1.8.25
|
87
99
|
signing_key:
|
88
100
|
specification_version: 3
|
89
101
|
summary: Split a big test file into multiple chunks and run them in parallel
|