moxiesoft_parallel_tests 0.4.13 → 0.6.18
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 +4 -2
- data/Gemfile.lock +26 -18
- data/Rakefile +3 -3
- data/Readme.md +105 -21
- data/VERSION +1 -1
- data/bin/parallel_test +21 -18
- data/lib/parallel_cucumber.rb +10 -3
- data/lib/parallel_specs/spec_runtime_logger.rb +16 -31
- data/lib/parallel_specs.rb +20 -16
- data/lib/parallel_tests/grouper.rb +34 -16
- data/lib/parallel_tests/tasks.rb +9 -9
- data/lib/parallel_tests.rb +83 -39
- data/parallel_tests.gemspec +64 -0
- data/spec/integration_spec.rb +77 -30
- data/spec/parallel_cucumber_spec.rb +10 -10
- data/spec/parallel_specs_spec.rb +49 -25
- data/spec/parallel_tests_spec.rb +100 -13
- data/spec/spec_helper.rb +48 -9
- metadata +30 -40
- data/moxiesoft_parallel_tests.gemspec +0 -65
data/spec/parallel_tests_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ParallelTests do
|
4
4
|
test_tests_in_groups(ParallelTests, 'test', '_test.rb')
|
@@ -14,38 +14,49 @@ describe ParallelTests do
|
|
14
14
|
ParallelTests.parse_rake_args(args).should == [Parallel.processor_count, "models", ""]
|
15
15
|
end
|
16
16
|
|
17
|
-
it "should return the count and
|
18
|
-
args = {:count => 2, :
|
17
|
+
it "should return the count and pattern" do
|
18
|
+
args = {:count => 2, :pattern => "models"}
|
19
19
|
ParallelTests.parse_rake_args(args).should == [2, "models", ""]
|
20
20
|
end
|
21
21
|
|
22
|
-
it "should return the count,
|
23
|
-
args = {:count => 2, :
|
22
|
+
it "should return the count, pattern, and options" do
|
23
|
+
args = {:count => 2, :pattern => "plain", :options => "-p default" }
|
24
24
|
ParallelTests.parse_rake_args(args).should == [2, "plain", "-p default"]
|
25
25
|
end
|
26
|
+
|
27
|
+
it "should use the PARALLEL_TEST_PROCESSORS env var for processor_count if set" do
|
28
|
+
ENV['PARALLEL_TEST_PROCESSORS'] = '28'
|
29
|
+
ParallelTests.parse_rake_args({}).should == [28, '', '']
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should use count over PARALLEL_TEST_PROCESSORS env var" do
|
33
|
+
ENV['PARALLEL_TEST_PROCESSORS'] = '28'
|
34
|
+
args = {:count => 2}
|
35
|
+
ParallelTests.parse_rake_args(args).should == [2, '', ""]
|
36
|
+
end
|
26
37
|
end
|
27
38
|
|
28
39
|
describe :run_tests do
|
29
40
|
it "uses TEST_ENV_NUMBER=blank when called for process 0" do
|
30
41
|
ParallelTests.should_receive(:open).with{|x,y|x=~/TEST_ENV_NUMBER= /}.and_return mocked_process
|
31
|
-
ParallelTests.run_tests(['xxx'],0,
|
42
|
+
ParallelTests.run_tests(['xxx'],0,{})
|
32
43
|
end
|
33
44
|
|
34
45
|
it "uses TEST_ENV_NUMBER=2 when called for process 1" do
|
35
46
|
ParallelTests.should_receive(:open).with{|x,y| x=~/TEST_ENV_NUMBER=2/}.and_return mocked_process
|
36
|
-
ParallelTests.run_tests(['xxx'],1,
|
47
|
+
ParallelTests.run_tests(['xxx'],1,{})
|
37
48
|
end
|
38
49
|
|
39
50
|
it "uses options" do
|
40
|
-
ParallelTests.should_receive(:open).with{|x,y| x=~ %r{ruby -Itest -v}}.and_return mocked_process
|
41
|
-
ParallelTests.run_tests(['xxx'],1
|
51
|
+
ParallelTests.should_receive(:open).with{|x,y| x=~ %r{ruby -Itest .* -- -v}}.and_return mocked_process
|
52
|
+
ParallelTests.run_tests(['xxx'],1,:test_options => '-v')
|
42
53
|
end
|
43
54
|
|
44
55
|
it "returns the output" do
|
45
56
|
io = open('spec/spec_helper.rb')
|
46
57
|
ParallelTests.stub!(:print)
|
47
58
|
ParallelTests.should_receive(:open).and_return io
|
48
|
-
ParallelTests.run_tests(['xxx'],1,
|
59
|
+
ParallelTests.run_tests(['xxx'],1,{})[:stdout].should =~ /\$LOAD_PATH << File/
|
49
60
|
end
|
50
61
|
end
|
51
62
|
|
@@ -57,9 +68,15 @@ describe ParallelTests do
|
|
57
68
|
|
58
69
|
it "does sort when not passed do_sort option" do
|
59
70
|
ParallelTests.stub!(:tests_with_runtime).and_return([])
|
60
|
-
ParallelTests::Grouper.should_receive(:
|
71
|
+
ParallelTests::Grouper.should_receive(:largest_first).and_return([])
|
61
72
|
ParallelTests.tests_in_groups [], 1
|
62
73
|
end
|
74
|
+
|
75
|
+
it "groups by single_process pattern and then via size" do
|
76
|
+
ParallelTests.should_receive(:with_runtime_info).and_return([['aaa',5],['aaa2',5],['bbb',2],['ccc',1],['ddd',1]])
|
77
|
+
result = ParallelTests.tests_in_groups [], 3, :single_process => [/^a.a/]
|
78
|
+
result.should == [["aaa", "aaa2"], ["bbb"], ["ccc", "ddd"]]
|
79
|
+
end
|
63
80
|
end
|
64
81
|
|
65
82
|
describe :find_results do
|
@@ -83,7 +100,7 @@ EOF
|
|
83
100
|
ParallelTests.find_results(output).should == ['10 tests, 20 assertions, 0 failures, 0 errors','14 tests, 20 assertions, 0 failures, 0 errors']
|
84
101
|
end
|
85
102
|
|
86
|
-
it "is robust against
|
103
|
+
it "is robust against scrambled output" do
|
87
104
|
output = <<EOF
|
88
105
|
Loaded suite /opt/ruby-enterprise/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader
|
89
106
|
Started
|
@@ -136,7 +153,77 @@ EOF
|
|
136
153
|
end
|
137
154
|
end
|
138
155
|
|
156
|
+
describe :find_tests do
|
157
|
+
it "returns if root is an array" do
|
158
|
+
ParallelTests.send(:find_tests, [1]).should == [1]
|
159
|
+
end
|
160
|
+
|
161
|
+
it "finds all test files" do
|
162
|
+
begin
|
163
|
+
root = "/tmp/test-find_tests-#{rand(999)}"
|
164
|
+
`mkdir #{root}`
|
165
|
+
`mkdir #{root}/a`
|
166
|
+
`mkdir #{root}/b`
|
167
|
+
`touch #{root}/x_test.rb`
|
168
|
+
`touch #{root}/a/x_test.rb`
|
169
|
+
`touch #{root}/a/test.rb`
|
170
|
+
`touch #{root}/b/y_test.rb`
|
171
|
+
`touch #{root}/b/test.rb`
|
172
|
+
`ln -s #{root}/b #{root}/c`
|
173
|
+
`ln -s #{root}/b #{root}/a/`
|
174
|
+
ParallelTests.send(:find_tests, root).sort.should == [
|
175
|
+
"#{root}/a/b/y_test.rb",
|
176
|
+
"#{root}/a/x_test.rb",
|
177
|
+
"#{root}/b/y_test.rb",
|
178
|
+
"#{root}/c/y_test.rb",
|
179
|
+
"#{root}/x_test.rb"
|
180
|
+
]
|
181
|
+
ensure
|
182
|
+
`rm -rf #{root}`
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
it "finds files by pattern" do
|
187
|
+
begin
|
188
|
+
root = "/tmp/test-find_tests-#{rand(999)}"
|
189
|
+
`mkdir #{root}`
|
190
|
+
`mkdir #{root}/a`
|
191
|
+
`touch #{root}/a/x_test.rb`
|
192
|
+
`touch #{root}/a/y_test.rb`
|
193
|
+
`touch #{root}/a/z_test.rb`
|
194
|
+
ParallelTests.send(:find_tests, root, :pattern => '^a/(y|z)_test').sort.should == [
|
195
|
+
"#{root}/a/y_test.rb",
|
196
|
+
"#{root}/a/z_test.rb",
|
197
|
+
]
|
198
|
+
ensure
|
199
|
+
`rm -rf #{root}`
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe :summarize_results do
|
205
|
+
it "adds results" do
|
206
|
+
ParallelTests.summarize_results(['1 foo 3 bar','2 foo 5 bar']).should == '8 bars, 3 foos'
|
207
|
+
end
|
208
|
+
|
209
|
+
it "adds results with braces" do
|
210
|
+
ParallelTests.summarize_results(['1 foo(s) 3 bar(s)','2 foo 5 bar']).should == '8 bars, 3 foos'
|
211
|
+
end
|
212
|
+
|
213
|
+
it "adds same results with plurals" do
|
214
|
+
ParallelTests.summarize_results(['1 foo 3 bar','2 foos 5 bar']).should == '8 bars, 3 foos'
|
215
|
+
end
|
216
|
+
|
217
|
+
it "adds non-similar results" do
|
218
|
+
ParallelTests.summarize_results(['1 xxx 2 yyy','1 xxx 2 zzz']).should == '2 xxxs, 2 yyys, 2 zzzs'
|
219
|
+
end
|
220
|
+
|
221
|
+
it "does not pluralize 1" do
|
222
|
+
ParallelTests.summarize_results(['1 xxx 2 yyy']).should == '1 xxx, 2 yyys'
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
139
226
|
it "has a version" do
|
140
227
|
ParallelTests::VERSION.should =~ /^\d+\.\d+\.\d+$/
|
141
228
|
end
|
142
|
-
end
|
229
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,8 +4,19 @@ require 'rubygems'
|
|
4
4
|
|
5
5
|
FAKE_RAILS_ROOT = '/tmp/pspecs/fixtures'
|
6
6
|
|
7
|
+
require 'tempfile'
|
7
8
|
require 'parallel_specs'
|
9
|
+
require 'parallel_specs/spec_runtime_logger'
|
10
|
+
require 'parallel_specs/spec_summary_logger'
|
8
11
|
require 'parallel_cucumber'
|
12
|
+
require 'parallel_tests/runtime_logger'
|
13
|
+
|
14
|
+
OutputLogger = Struct.new(:output) do
|
15
|
+
attr_reader :flock, :flush
|
16
|
+
def puts(s=nil)
|
17
|
+
self.output << s.to_s
|
18
|
+
end
|
19
|
+
end
|
9
20
|
|
10
21
|
def mocked_process
|
11
22
|
open('|cat /dev/null')
|
@@ -25,7 +36,7 @@ def use_temporary_directory_for
|
|
25
36
|
|
26
37
|
begin
|
27
38
|
# just in case the temporary dir already exists
|
28
|
-
FileUtils.rm_rf(dir) if File.exists?(dir)
|
39
|
+
FileUtils.rm_rf(dir) if File.exists?(dir)
|
29
40
|
|
30
41
|
# create the temporary directory
|
31
42
|
FileUtils.mkdir_p(new_dir)
|
@@ -53,14 +64,18 @@ def test_tests_in_groups(klass, folder, suffix)
|
|
53
64
|
file
|
54
65
|
end
|
55
66
|
|
56
|
-
@log =
|
57
|
-
`mkdir #{File.dirname(@log)}`
|
67
|
+
@log = klass.runtime_log
|
68
|
+
`mkdir -p #{File.dirname(@log)}`
|
58
69
|
`rm -f #{@log}`
|
59
70
|
end
|
60
71
|
|
72
|
+
after :all do
|
73
|
+
`rm -f #{klass.runtime_log}`
|
74
|
+
end
|
75
|
+
|
61
76
|
it "groups when given an array of files" do
|
62
77
|
list_of_files = Dir["#{test_root}/**/*#{suffix}"]
|
63
|
-
found = klass.
|
78
|
+
found = klass.with_runtime_info(list_of_files)
|
64
79
|
found.should =~ list_of_files.map{ |file| [file, File.stat(file).size]}
|
65
80
|
end
|
66
81
|
|
@@ -85,18 +100,34 @@ def test_tests_in_groups(klass, folder, suffix)
|
|
85
100
|
groups.map{|g| size_of(g)}.should =~ [300, 300, 200]
|
86
101
|
end
|
87
102
|
|
88
|
-
|
103
|
+
def setup_runtime_log
|
89
104
|
File.open(@log,'w') do |f|
|
90
105
|
@files[1..-1].each{|file| f.puts "#{file}:#{@files.index(file)}"}
|
91
106
|
f.puts "#{@files[0]}:10"
|
92
107
|
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "partitions by runtime when runtime-data is available" do
|
111
|
+
klass.stub!(:puts)
|
112
|
+
setup_runtime_log
|
93
113
|
|
94
114
|
groups = klass.tests_in_groups(test_root, 2)
|
95
115
|
groups.size.should == 2
|
96
|
-
# 10 +
|
97
|
-
groups[0].should == [@files[0],@files[
|
98
|
-
#
|
99
|
-
groups[1].should == [@files[
|
116
|
+
# 10 + 1 + 3 + 5 = 19
|
117
|
+
groups[0].should == [@files[0],@files[1],@files[3],@files[5]]
|
118
|
+
# 2 + 4 + 6 + 7 = 19
|
119
|
+
groups[1].should == [@files[2],@files[4],@files[6],@files[7]]
|
120
|
+
end
|
121
|
+
|
122
|
+
it "alpha-sorts partitions when runtime-data is available" do
|
123
|
+
klass.stub!(:puts)
|
124
|
+
setup_runtime_log
|
125
|
+
|
126
|
+
groups = klass.tests_in_groups(test_root, 2)
|
127
|
+
groups.size.should == 2
|
128
|
+
|
129
|
+
groups[0].should == groups[0].sort
|
130
|
+
groups[1].should == groups[1].sort
|
100
131
|
end
|
101
132
|
|
102
133
|
it "partitions by round-robin when not sorting" do
|
@@ -106,5 +137,13 @@ def test_tests_in_groups(klass, folder, suffix)
|
|
106
137
|
groups[0].should == ["file1.rb", "file3.rb"]
|
107
138
|
groups[1].should == ["file2.rb", "file4.rb"]
|
108
139
|
end
|
140
|
+
|
141
|
+
it "alpha-sorts partitions when not sorting by runtime" do
|
142
|
+
files = %w[q w e r t y u i o p a s d f g h j k l z x c v b n m]
|
143
|
+
klass.should_receive(:find_tests).and_return(files)
|
144
|
+
groups = klass.tests_in_groups(files, 2, :no_sort => true)
|
145
|
+
groups[0].should == groups[0].sort
|
146
|
+
groups[1].should == groups[1].sort
|
147
|
+
end
|
109
148
|
end
|
110
149
|
end
|
metadata
CHANGED
@@ -1,41 +1,37 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: moxiesoft_parallel_tests
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.18
|
4
5
|
prerelease:
|
5
|
-
version: 0.4.13
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Michael Grosser
|
9
9
|
- Erik DeBill
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dependencies:
|
17
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-04-07 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
18
16
|
name: parallel
|
19
|
-
requirement: &
|
17
|
+
requirement: &2152337800 !ruby/object:Gem::Requirement
|
20
18
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
|
-
version_requirements: *
|
25
|
+
version_requirements: *2152337800
|
28
26
|
description:
|
29
27
|
email: grosser.michael@gmail.com
|
30
|
-
executables:
|
28
|
+
executables:
|
31
29
|
- parallel_cucumber
|
32
30
|
- parallel_spec
|
33
31
|
- parallel_test
|
34
32
|
extensions: []
|
35
|
-
|
36
33
|
extra_rdoc_files: []
|
37
|
-
|
38
|
-
files:
|
34
|
+
files:
|
39
35
|
- .gitignore
|
40
36
|
- Gemfile
|
41
37
|
- Gemfile.lock
|
@@ -53,44 +49,38 @@ files:
|
|
53
49
|
- lib/parallel_tests/railtie.rb
|
54
50
|
- lib/parallel_tests/tasks.rb
|
55
51
|
- lib/tasks/parallel_tests.rake
|
56
|
-
-
|
52
|
+
- parallel_tests.gemspec
|
57
53
|
- spec/integration_spec.rb
|
58
54
|
- spec/parallel_cucumber_spec.rb
|
59
55
|
- spec/parallel_specs_spec.rb
|
60
56
|
- spec/parallel_tests_spec.rb
|
61
57
|
- spec/spec_helper.rb
|
62
|
-
has_rdoc: true
|
63
58
|
homepage: http://github.com/edebill-moxiesoft/moxiesoft_parallel_tests
|
64
59
|
licenses: []
|
65
|
-
|
66
60
|
post_install_message:
|
67
|
-
rdoc_options:
|
61
|
+
rdoc_options:
|
68
62
|
- --charset=UTF-8
|
69
|
-
require_paths:
|
63
|
+
require_paths:
|
70
64
|
- lib
|
71
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
66
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
|
78
|
-
- 0
|
79
|
-
version: "0"
|
80
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
72
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version:
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
86
77
|
requirements: []
|
87
|
-
|
88
78
|
rubyforge_project:
|
89
|
-
rubygems_version: 1.
|
79
|
+
rubygems_version: 1.8.10
|
90
80
|
signing_key:
|
91
81
|
specification_version: 3
|
92
82
|
summary: Run tests / specs / features in parallel
|
93
|
-
test_files:
|
83
|
+
test_files:
|
94
84
|
- spec/integration_spec.rb
|
95
85
|
- spec/parallel_cucumber_spec.rb
|
96
86
|
- spec/parallel_specs_spec.rb
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{moxiesoft_parallel_tests}
|
8
|
-
s.version = "0.4.13"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Michael Grosser", "Erik DeBill"]
|
12
|
-
s.date = %q{2011-10-06}
|
13
|
-
s.email = %q{grosser.michael@gmail.com}
|
14
|
-
s.executables = ["parallel_cucumber", "parallel_spec", "parallel_test"]
|
15
|
-
s.files = [
|
16
|
-
".gitignore",
|
17
|
-
"Gemfile",
|
18
|
-
"Gemfile.lock",
|
19
|
-
"Rakefile",
|
20
|
-
"Readme.md",
|
21
|
-
"VERSION",
|
22
|
-
"bin/parallel_cucumber",
|
23
|
-
"bin/parallel_spec",
|
24
|
-
"bin/parallel_test",
|
25
|
-
"lib/parallel_cucumber.rb",
|
26
|
-
"lib/parallel_specs.rb",
|
27
|
-
"lib/parallel_specs/spec_runtime_logger.rb",
|
28
|
-
"lib/parallel_tests.rb",
|
29
|
-
"lib/parallel_tests/grouper.rb",
|
30
|
-
"lib/parallel_tests/railtie.rb",
|
31
|
-
"lib/parallel_tests/tasks.rb",
|
32
|
-
"lib/tasks/parallel_tests.rake",
|
33
|
-
"moxiesoft_parallel_tests.gemspec",
|
34
|
-
"spec/integration_spec.rb",
|
35
|
-
"spec/parallel_cucumber_spec.rb",
|
36
|
-
"spec/parallel_specs_spec.rb",
|
37
|
-
"spec/parallel_tests_spec.rb",
|
38
|
-
"spec/spec_helper.rb"
|
39
|
-
]
|
40
|
-
s.homepage = %q{http://github.com/edebill-moxiesoft/moxiesoft_parallel_tests}
|
41
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
42
|
-
s.require_paths = ["lib"]
|
43
|
-
s.rubygems_version = %q{1.6.1}
|
44
|
-
s.summary = %q{Run tests / specs / features in parallel}
|
45
|
-
s.test_files = [
|
46
|
-
"spec/integration_spec.rb",
|
47
|
-
"spec/parallel_cucumber_spec.rb",
|
48
|
-
"spec/parallel_specs_spec.rb",
|
49
|
-
"spec/parallel_tests_spec.rb",
|
50
|
-
"spec/spec_helper.rb"
|
51
|
-
]
|
52
|
-
|
53
|
-
if s.respond_to? :specification_version then
|
54
|
-
s.specification_version = 3
|
55
|
-
|
56
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
|
-
s.add_runtime_dependency(%q<parallel>, [">= 0"])
|
58
|
-
else
|
59
|
-
s.add_dependency(%q<parallel>, [">= 0"])
|
60
|
-
end
|
61
|
-
else
|
62
|
-
s.add_dependency(%q<parallel>, [">= 0"])
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|