parallel_tests 0.6.15 → 0.6.16
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 +1 -0
- data/Gemfile.lock +2 -0
- data/Readme.md +7 -3
- data/VERSION +1 -1
- data/lib/parallel_tests/runtime_logger.rb +78 -0
- data/parallel_tests.gemspec +6 -4
- data/spec/parallel_tests/runtime_logger_spec.rb +74 -0
- data/spec/spec_helper.rb +1 -0
- metadata +53 -33
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/Readme.md
CHANGED
@@ -81,7 +81,7 @@ Example output
|
|
81
81
|
|
82
82
|
Took 29.925333 seconds
|
83
83
|
|
84
|
-
|
84
|
+
Loggers
|
85
85
|
===================
|
86
86
|
|
87
87
|
Even process runtimes
|
@@ -89,7 +89,7 @@ Even process runtimes
|
|
89
89
|
|
90
90
|
Log test runtime to give each process the same runtime.
|
91
91
|
|
92
|
-
Add to your `spec/parallel_spec.opts` (or `spec/spec.opts`) :
|
92
|
+
Rspec: Add to your `spec/parallel_spec.opts` (or `spec/spec.opts`) :
|
93
93
|
|
94
94
|
RSpec 1.x:
|
95
95
|
--format progress
|
@@ -100,6 +100,10 @@ Add to your `spec/parallel_spec.opts` (or `spec/spec.opts`) :
|
|
100
100
|
--format progress
|
101
101
|
--format ParallelSpecs::SpecRuntimeLogger --out tmp/parallel_profile.log
|
102
102
|
|
103
|
+
Test::Unit: Add to your `test_helper.rb`:
|
104
|
+
require 'parallel_tests/runtime_logger'
|
105
|
+
|
106
|
+
|
103
107
|
SpecSummaryLogger
|
104
108
|
--------------------
|
105
109
|
|
@@ -189,7 +193,6 @@ TIPS
|
|
189
193
|
- [Capybara setup](https://github.com/grosser/parallel_tests/wiki)
|
190
194
|
- [Sphinx setup](https://github.com/grosser/parallel_tests/wiki)
|
191
195
|
- [Capistrano setup](https://github.com/grosser/parallel_tests/wiki/Remotely-with-capistrano) let your tests run on a big box instead of your laptop
|
192
|
-
- [Test::Unit runtime logger](https://gist.github.com/1333414) some basic plumbing done (needs some love and a pull-request)
|
193
196
|
- [SQL schema format] use :ruby schema format to get faster parallel:prepare`
|
194
197
|
- [ActiveRecord] if you do not have `db:abort_if_pending_migrations` add this to your Rakefile: `task('db:abort_if_pending_migrations'){}`
|
195
198
|
- `export PARALLEL_TEST_PROCESSORS=X` in your environment and parallel_tests will use this number of processors by default
|
@@ -229,6 +232,7 @@ inspired by [pivotal labs](http://pivotallabs.com/users/miked/blog/articles/849-
|
|
229
232
|
- [Geoffrey Hichborn](https://github.com/phene)
|
230
233
|
- [Trae Robrock](https://github.com/trobrock)
|
231
234
|
- [Lawrence Wang](https://github.com/levity)
|
235
|
+
- [Sean Walbran](https://github.com/seanwalbran)
|
232
236
|
|
233
237
|
[Michael Grosser](http://grosser.it)<br/>
|
234
238
|
michael@grosser.it<br/>
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.16
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class ParallelTests::RuntimeLogger
|
2
|
+
@@has_started = false
|
3
|
+
|
4
|
+
def self.log(test, start_time, end_time)
|
5
|
+
return if test.is_a? Test::Unit::TestSuite # don't log for suites-of-suites
|
6
|
+
|
7
|
+
if !@@has_started # make empty log file
|
8
|
+
File.open(ParallelTests.runtime_log, 'w') do end
|
9
|
+
@@has_started = true
|
10
|
+
end
|
11
|
+
|
12
|
+
File.open(ParallelTests.runtime_log, 'a') do |output|
|
13
|
+
begin
|
14
|
+
output.flock File::LOCK_EX
|
15
|
+
output.puts(self.message(test, start_time, end_time))
|
16
|
+
ensure
|
17
|
+
output.flock File::LOCK_UN
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.message(test, start_time, end_time)
|
23
|
+
delta="%.2f" % (end_time.to_f-start_time.to_f)
|
24
|
+
filename=class_directory(test.class) + class_to_filename(test.class) + ".rb"
|
25
|
+
message="#{filename}:#{delta}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Note: this is a best guess at conventional test directory structure, and may need
|
29
|
+
# tweaking / post-processing to match correctly for any given project
|
30
|
+
def self.class_directory(suspect)
|
31
|
+
result = "test/"
|
32
|
+
|
33
|
+
if defined?(Rails)
|
34
|
+
result += case suspect.superclass.name
|
35
|
+
when "ActionDispatch::IntegrationTest"
|
36
|
+
"integration/"
|
37
|
+
when "ActionDispatch::PerformanceTest"
|
38
|
+
"performance/"
|
39
|
+
when "ActionController::TestCase"
|
40
|
+
"functional/"
|
41
|
+
when "ActionView::TestCase"
|
42
|
+
"unit/helpers/"
|
43
|
+
else
|
44
|
+
"unit/"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
# based on https://github.com/grosser/single_test/blob/master/lib/single_test.rb#L117
|
51
|
+
def self.class_to_filename(suspect)
|
52
|
+
word = suspect.to_s.dup
|
53
|
+
return word unless word.match /^[A-Z]/ and not word.match %r{/[a-z]}
|
54
|
+
|
55
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
56
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
57
|
+
word.gsub!(/\:\:/,'/')
|
58
|
+
word.tr!("-", "_")
|
59
|
+
word.downcase!
|
60
|
+
word
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
require 'test/unit/testsuite'
|
66
|
+
class Test::Unit::TestSuite
|
67
|
+
|
68
|
+
alias :run_without_timing :run unless defined? @@timing_installed
|
69
|
+
|
70
|
+
def run(result, &progress_block)
|
71
|
+
start_time=Time.now
|
72
|
+
run_without_timing(result, &progress_block)
|
73
|
+
end_time=Time.now
|
74
|
+
ParallelTests::RuntimeLogger.log(self.tests.first, start_time, end_time)
|
75
|
+
end
|
76
|
+
@@timing_installed = true
|
77
|
+
|
78
|
+
end
|
data/parallel_tests.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "parallel_tests"
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.16"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.date = "2012-01-
|
12
|
+
s.date = "2012-01-13"
|
13
13
|
s.email = "grosser.michael@gmail.com"
|
14
|
-
s.executables = ["parallel_cucumber", "
|
14
|
+
s.executables = ["parallel_cucumber", "parallel_test", "parallel_spec"]
|
15
15
|
s.files = [
|
16
16
|
"Gemfile",
|
17
17
|
"Gemfile.lock",
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/parallel_tests.rb",
|
32
32
|
"lib/parallel_tests/grouper.rb",
|
33
33
|
"lib/parallel_tests/railtie.rb",
|
34
|
+
"lib/parallel_tests/runtime_logger.rb",
|
34
35
|
"lib/parallel_tests/tasks.rb",
|
35
36
|
"lib/tasks/parallel_tests.rake",
|
36
37
|
"parallel_tests.gemspec",
|
@@ -40,12 +41,13 @@ Gem::Specification.new do |s|
|
|
40
41
|
"spec/parallel_specs/spec_runtime_logger_spec.rb",
|
41
42
|
"spec/parallel_specs/spec_summary_logger_spec.rb",
|
42
43
|
"spec/parallel_specs_spec.rb",
|
44
|
+
"spec/parallel_tests/runtime_logger_spec.rb",
|
43
45
|
"spec/parallel_tests_spec.rb",
|
44
46
|
"spec/spec_helper.rb"
|
45
47
|
]
|
46
48
|
s.homepage = "http://github.com/grosser/parallel_tests"
|
47
49
|
s.require_paths = ["lib"]
|
48
|
-
s.rubygems_version = "1.8.
|
50
|
+
s.rubygems_version = "1.8.15"
|
49
51
|
s.summary = "Run tests / specs / features in parallel"
|
50
52
|
|
51
53
|
if s.respond_to? :specification_version then
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ParallelTests::RuntimeLogger do
|
4
|
+
|
5
|
+
describe :writing do
|
6
|
+
it "overwrites the runtime_log file on first log invocation" do
|
7
|
+
class FakeTest
|
8
|
+
end
|
9
|
+
test = FakeTest.new
|
10
|
+
time = Time.now
|
11
|
+
File.open(ParallelTests.runtime_log, 'w'){ |f| f.puts("FooBar") }
|
12
|
+
ParallelTests::RuntimeLogger.send(:class_variable_set,:@@has_started, false)
|
13
|
+
ParallelTests::RuntimeLogger.log(test, time, Time.at(time.to_f+2.00))
|
14
|
+
result = File.read(ParallelTests.runtime_log)
|
15
|
+
result.should_not include('FooBar')
|
16
|
+
result.should include('test/fake_test.rb:2.00')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "appends to the runtime_log file after first log invocation" do
|
20
|
+
class FakeTest
|
21
|
+
end
|
22
|
+
test = FakeTest.new
|
23
|
+
class OtherFakeTest
|
24
|
+
end
|
25
|
+
other_test = OtherFakeTest.new
|
26
|
+
|
27
|
+
time = Time.now
|
28
|
+
File.open(ParallelTests.runtime_log, 'w'){ |f| f.puts("FooBar") }
|
29
|
+
ParallelTests::RuntimeLogger.send(:class_variable_set,:@@has_started, false)
|
30
|
+
ParallelTests::RuntimeLogger.log(test, time, Time.at(time.to_f+2.00))
|
31
|
+
ParallelTests::RuntimeLogger.log(other_test, time, Time.at(time.to_f+2.00))
|
32
|
+
result = File.read(ParallelTests.runtime_log)
|
33
|
+
result.should_not include('FooBar')
|
34
|
+
result.should include('test/fake_test.rb:2.00')
|
35
|
+
result.should include('test/other_fake_test.rb:2.00')
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe :formatting do
|
41
|
+
it "formats results for simple test names" do
|
42
|
+
class FakeTest
|
43
|
+
end
|
44
|
+
test = FakeTest.new
|
45
|
+
time = Time.now
|
46
|
+
ParallelTests::RuntimeLogger.message(test, time, Time.at(time.to_f+2.00)).should == 'test/fake_test.rb:2.00'
|
47
|
+
end
|
48
|
+
|
49
|
+
it "formats results for complex test names" do
|
50
|
+
class AVeryComplex
|
51
|
+
class FakeTest
|
52
|
+
end
|
53
|
+
end
|
54
|
+
test = AVeryComplex::FakeTest.new
|
55
|
+
time = Time.now
|
56
|
+
ParallelTests::RuntimeLogger.message(test, time, Time.at(time.to_f+2.00)).should == 'test/a_very_complex/fake_test.rb:2.00'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "guesses subdirectory structure for rails test classes" do
|
60
|
+
module Rails
|
61
|
+
end
|
62
|
+
class ActionController
|
63
|
+
class TestCase
|
64
|
+
end
|
65
|
+
end
|
66
|
+
class FakeControllerTest < ActionController::TestCase
|
67
|
+
end
|
68
|
+
test = FakeControllerTest.new
|
69
|
+
time = Time.now
|
70
|
+
ParallelTests::RuntimeLogger.message(test, time, Time.at(time.to_f+2.00)).should == 'test/functional/fake_controller_test.rb:2.00'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,7 @@ require 'parallel_specs'
|
|
9
9
|
require 'parallel_specs/spec_runtime_logger'
|
10
10
|
require 'parallel_specs/spec_summary_logger'
|
11
11
|
require 'parallel_cucumber'
|
12
|
+
require 'parallel_tests/runtime_logger'
|
12
13
|
|
13
14
|
OutputLogger = Struct.new(:output) do
|
14
15
|
attr_reader :flock, :flush
|
metadata
CHANGED
@@ -1,36 +1,47 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel_tests
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 39
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 6
|
9
|
+
- 16
|
10
|
+
version: 0.6.16
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Michael Grosser
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
requirement: &69308050 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
17
|
+
|
18
|
+
date: 2012-01-13 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
23
21
|
prerelease: false
|
24
|
-
|
22
|
+
type: :runtime
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
name: parallel
|
33
|
+
version_requirements: *id001
|
25
34
|
description:
|
26
35
|
email: grosser.michael@gmail.com
|
27
|
-
executables:
|
36
|
+
executables:
|
28
37
|
- parallel_cucumber
|
29
|
-
- parallel_spec
|
30
38
|
- parallel_test
|
39
|
+
- parallel_spec
|
31
40
|
extensions: []
|
41
|
+
|
32
42
|
extra_rdoc_files: []
|
33
|
-
|
43
|
+
|
44
|
+
files:
|
34
45
|
- Gemfile
|
35
46
|
- Gemfile.lock
|
36
47
|
- Rakefile
|
@@ -49,6 +60,7 @@ files:
|
|
49
60
|
- lib/parallel_tests.rb
|
50
61
|
- lib/parallel_tests/grouper.rb
|
51
62
|
- lib/parallel_tests/railtie.rb
|
63
|
+
- lib/parallel_tests/runtime_logger.rb
|
52
64
|
- lib/parallel_tests/tasks.rb
|
53
65
|
- lib/tasks/parallel_tests.rake
|
54
66
|
- parallel_tests.gemspec
|
@@ -58,33 +70,41 @@ files:
|
|
58
70
|
- spec/parallel_specs/spec_runtime_logger_spec.rb
|
59
71
|
- spec/parallel_specs/spec_summary_logger_spec.rb
|
60
72
|
- spec/parallel_specs_spec.rb
|
73
|
+
- spec/parallel_tests/runtime_logger_spec.rb
|
61
74
|
- spec/parallel_tests_spec.rb
|
62
75
|
- spec/spec_helper.rb
|
63
76
|
homepage: http://github.com/grosser/parallel_tests
|
64
77
|
licenses: []
|
78
|
+
|
65
79
|
post_install_message:
|
66
80
|
rdoc_options: []
|
67
|
-
|
81
|
+
|
82
|
+
require_paths:
|
68
83
|
- lib
|
69
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
85
|
none: false
|
71
|
-
requirements:
|
72
|
-
- -
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
|
75
|
-
segments:
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
76
91
|
- 0
|
77
|
-
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
version: "0"
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
94
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
84
102
|
requirements: []
|
103
|
+
|
85
104
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.8.
|
105
|
+
rubygems_version: 1.8.15
|
87
106
|
signing_key:
|
88
107
|
specification_version: 3
|
89
108
|
summary: Run tests / specs / features in parallel
|
90
109
|
test_files: []
|
110
|
+
|