zeus-parallel_tests 0.1.1 → 0.2.0.beta1
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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/README.md +99 -4
- data/Rakefile +19 -0
- data/bin/{zeus-parallel_specs → zeus-parallel_tests} +1 -3
- data/lib/zeus/parallel_tests/rails.rb +61 -22
- data/lib/zeus/parallel_tests/templates/zeus.json +8 -3
- data/lib/zeus/parallel_tests/version.rb +1 -1
- data/lib/zeus/parallel_tests/worker.rb +51 -0
- data/test/integration_test.rb +9 -0
- data/test/slow/zeus-parallel_tests_test.rb +29 -0
- data/test/test_helper.rb +5 -0
- data/zeus-parallel_tests.gemspec +1 -1
- metadata +20 -12
- data/lib/zeus/parallel_tests/templates/spec +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: defcebae997e5144a3de67c7dfdf79a7a1c99006
|
4
|
+
data.tar.gz: a3678f055ac0a432fb77181217b6e81b79db3bc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d8924e1842bda6494c16b2a1d05f74c5030902a00b623fe49c97ba5f5590d6e6d0d4e1d468602260e0c8fc871763d1fe64e38e8108d154734dd0f61eb89f0e2
|
7
|
+
data.tar.gz: 5902643045dbd7750e906373cb4167588d14fa8dc9071cb79b1703a5a40cf717661f1cb81f12b27dac42aaf64b899c0f17e3f455a9fad3312d1265d4796041b9
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,67 @@
|
|
1
1
|
# Zeus::ParallelTests
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/sevos/zeus-parallel_tests)
|
4
|
+
[](https://gemnasium.com/sevos/zeus-parallel_tests)
|
5
|
+
|
6
|
+
[Zeus](https://github.com/burke/zeus) is a tool for speeding up your tests by preloading a Rails app.
|
7
|
+
[parallel_tests](https://github.com/grosser/parallel_tests) also speeds up your tests by running them, well,
|
8
|
+
in parallel. Two good gems, so why not to use them together? Let's make our CPUs sweat!
|
9
|
+
|
10
|
+
## Show me the numbers!
|
11
|
+
|
12
|
+
### RSpec
|
13
|
+
|
14
|
+
```
|
15
|
+
$ time rspec spec
|
16
|
+
|
17
|
+
...
|
18
|
+
|
19
|
+
Finished in 1 minute 8.34 seconds
|
20
|
+
916 examples, 0 failures
|
21
|
+
|
22
|
+
real 1m21.480s
|
23
|
+
user 1m4.805s
|
24
|
+
sys 0m4.516s
|
25
|
+
```
|
26
|
+
|
27
|
+
### parallel_tests
|
28
|
+
|
29
|
+
```
|
30
|
+
$ time rake parallel:spec[8]
|
31
|
+
Using recorded test runtime
|
32
|
+
8 processes for 141 specs, ~ 17 specs per process
|
33
|
+
|
34
|
+
...
|
35
|
+
|
36
|
+
916 examples, 0 failures
|
37
|
+
|
38
|
+
Took 46.626499 seconds
|
39
|
+
|
40
|
+
real 0m55.790s
|
41
|
+
user 4m3.065s
|
42
|
+
sys 0m32.160s
|
43
|
+
```
|
44
|
+
|
45
|
+
### Zeus+parallel_tests
|
46
|
+
|
47
|
+
```
|
48
|
+
$ time zeus rake parallel:spec[8]
|
49
|
+
Developer helpers loaded
|
50
|
+
Using recorded test runtime
|
51
|
+
8 processes for 141 specs, ~ 17 specs per process
|
52
|
+
|
53
|
+
...
|
54
|
+
|
55
|
+
916 examples, 0 failures
|
56
|
+
|
57
|
+
Took 26.610327 seconds
|
58
|
+
|
59
|
+
real 0m28.514s
|
60
|
+
user 0m0.732s
|
61
|
+
sys 0m0.061s
|
62
|
+
```
|
63
|
+
|
64
|
+
Ready to go?
|
4
65
|
|
5
66
|
## Installation
|
6
67
|
|
@@ -12,13 +73,47 @@ And then execute:
|
|
12
73
|
|
13
74
|
$ bundle
|
14
75
|
|
15
|
-
|
76
|
+
You need also to initialize your project with custom Zeus plan:
|
77
|
+
|
78
|
+
$ zeus-parallel_tests init
|
79
|
+
|
80
|
+
This will create two files in your project:
|
16
81
|
|
17
|
-
|
82
|
+
* custom_plan.rb
|
83
|
+
* zeus.json
|
84
|
+
|
85
|
+
### RVM
|
86
|
+
|
87
|
+
For RVM users it is recommended to install rvm-bundler gem.
|
18
88
|
|
19
89
|
## Usage
|
20
90
|
|
21
|
-
|
91
|
+
First [follow instructions](https://github.com/grosser/parallel_tests) and prepare
|
92
|
+
your application to use parallel_tests.
|
93
|
+
|
94
|
+
Launch another terminal and run zeus' master process:
|
95
|
+
|
96
|
+
$ bundle exec zeus start
|
97
|
+
|
98
|
+
Then you can run your parallel specs:
|
99
|
+
|
100
|
+
$ zeus parallel_rspec spec
|
101
|
+
|
102
|
+
or your cucumbers:
|
103
|
+
|
104
|
+
$ zeus parallel_cucumber features
|
105
|
+
|
106
|
+
## What is supported?
|
107
|
+
|
108
|
+
* rspec
|
109
|
+
* cucumber
|
110
|
+
|
111
|
+
## TODO
|
112
|
+
|
113
|
+
* smoke tests
|
114
|
+
* minitest support
|
115
|
+
* cucumber support
|
116
|
+
* guard-rspec <del>(just pass `zeus: true` and `parallel: true` into configuration hash)</del>
|
22
117
|
|
23
118
|
## Contributing
|
24
119
|
|
data/Rakefile
CHANGED
@@ -1 +1,20 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
task :default => [:test]
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.libs.push "lib"
|
8
|
+
t.test_files = FileList[File.expand_path('../test/**/*_test.rb', __FILE__)]
|
9
|
+
t.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
namespace :travis do
|
14
|
+
Rake::TestTask.new do |t|
|
15
|
+
t.libs.push "lib"
|
16
|
+
t.test_files = FileList[File.expand_path('../test/**/*_test.rb', __FILE__)] -
|
17
|
+
FileList[File.expand_path('../test/slow/*_test.rb', __FILE__)]
|
18
|
+
t.verbose = true
|
19
|
+
end
|
20
|
+
end
|
@@ -8,7 +8,7 @@ unless ARGV == ["init"]
|
|
8
8
|
exit 1
|
9
9
|
end
|
10
10
|
|
11
|
-
def copy(file, target_dir
|
11
|
+
def copy(file, target_dir)
|
12
12
|
templates_dir = File.expand_path("../../lib/zeus/parallel_tests/templates/", __FILE__)
|
13
13
|
source_file = File.join(templates_dir, file)
|
14
14
|
dest_file = File.join(File.expand_path(target_dir), file)
|
@@ -20,9 +20,7 @@ def copy(file, target_dir, mode = 0644)
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
FileUtils.cp(source_file, dest_file)
|
23
|
-
FileUtils.chmod(mode, dest_file)
|
24
23
|
end
|
25
24
|
|
26
25
|
copy "custom_plan.rb", "./"
|
27
26
|
copy "zeus.json", "./"
|
28
|
-
copy "spec", "script/", 0755
|
@@ -1,12 +1,69 @@
|
|
1
|
+
require_relative '../parallel_tests'
|
2
|
+
require_relative 'worker'
|
3
|
+
|
1
4
|
module Zeus
|
2
5
|
module ParallelTests
|
3
6
|
class Rails < ::Zeus::Rails
|
7
|
+
def parallel_cucumber
|
8
|
+
exec parallel_runner_command "cucumber", ARGV
|
9
|
+
end
|
10
|
+
|
4
11
|
def parallel_rspec
|
5
|
-
|
6
|
-
|
12
|
+
exec parallel_runner_command "rspec", ARGV
|
13
|
+
end
|
14
|
+
|
15
|
+
def parallel_cucumber_worker
|
16
|
+
spawn_slave { |args| cucumber(args) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def parallel_rspec_worker
|
20
|
+
spawn_slave { |args| test(["--color", "--tty", *args]) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# Patches required in Zeus
|
24
|
+
|
25
|
+
def test(argv = ARGV)
|
26
|
+
if spec_file?(argv) && defined?(RSpec)
|
27
|
+
# disable autorun in case the user left it in spec_helper.rb
|
28
|
+
RSpec::Core::Runner.disable_autorun!
|
29
|
+
exit RSpec::Core::Runner.run(argv)
|
30
|
+
else
|
31
|
+
Zeus::M.run(argv)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def cucumber(argv = ARGV)
|
36
|
+
cucumber_main = Cucumber::Cli::Main.new(argv.dup)
|
37
|
+
had_failures = cucumber_main.execute!(@cucumber_runtime)
|
38
|
+
exit_code = had_failures ? 1 : 0
|
39
|
+
exit exit_code
|
40
|
+
end
|
41
|
+
|
42
|
+
# End of patches for Zeus
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def parallel_runner_command(suite, argv)
|
47
|
+
env_slave_path = %[PARALLEL_TESTS_EXECUTABLE='#{Worker.command suite}']
|
48
|
+
"#{env_slave_path} parallel_#{suite} #{argv.join ' '}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def spawn_slave
|
52
|
+
worker, workers_count, args_file = ARGV
|
7
53
|
# Parallels spec reuse main test db instead of db with "1" appended
|
8
|
-
|
54
|
+
ENV['TEST_ENV_NUMBER'] = test_env_number = (worker == "1" ? nil : worker)
|
55
|
+
ENV['PARALLEL_TEST_GROUPS'] = workers_count
|
56
|
+
|
57
|
+
reconfigure_activerecord test_env_number
|
58
|
+
|
59
|
+
yield load_args_from_file(args_file)
|
60
|
+
end
|
9
61
|
|
62
|
+
def load_args_from_file(path)
|
63
|
+
File.readlines(path).map(&:chomp)
|
64
|
+
end
|
65
|
+
|
66
|
+
def reconfigure_activerecord(test_env_number)
|
10
67
|
return unless defined?(ActiveRecord::Base)
|
11
68
|
begin
|
12
69
|
ActiveRecord::Base.clear_all_connections!
|
@@ -15,31 +72,13 @@ module Zeus
|
|
15
72
|
config[:database] = "#{config[:database]}#{test_env_number}"
|
16
73
|
|
17
74
|
ActiveRecord::Base.establish_connection(config)
|
75
|
+
puts "Connecting to #{ActiveRecord::Base.connection_config[:database]}"
|
18
76
|
if ActiveRecord::Base.respond_to?(:shared_connection)
|
19
77
|
ActiveRecord::Base.shared_connection = ActiveRecord::Base.retrieve_connection
|
20
78
|
end
|
21
79
|
rescue ActiveRecord::AdapterNotSpecified
|
22
80
|
end
|
23
|
-
|
24
|
-
ENV['TEST_ENV_NUMBER'] = test_env_number
|
25
|
-
ENV['PARALLEL_TEST_GROUPS'] = argv.shift
|
26
|
-
|
27
|
-
rspec_args_file = argv.shift
|
28
|
-
test_files = File.readlines(rspec_args_file).map(&:chomp)
|
29
|
-
|
30
|
-
test(test_files.unshift("--colour").unshift("--tty"))
|
31
|
-
end
|
32
|
-
|
33
|
-
def test(argv = ARGV)
|
34
|
-
if spec_file?(argv) && defined?(RSpec)
|
35
|
-
# disable autorun in case the user left it in spec_helper.rb
|
36
|
-
RSpec::Core::Runner.disable_autorun!
|
37
|
-
exit RSpec::Core::Runner.run(argv)
|
38
|
-
else
|
39
|
-
Zeus::M.run(argv)
|
40
|
-
end
|
41
81
|
end
|
42
|
-
|
43
82
|
end
|
44
83
|
end
|
45
84
|
end
|
@@ -11,13 +11,18 @@
|
|
11
11
|
"server": ["s"],
|
12
12
|
"generate": ["g"],
|
13
13
|
"destroy": ["d"],
|
14
|
-
"dbconsole": []
|
14
|
+
"dbconsole": [],
|
15
|
+
"parallel_rspec": [],
|
16
|
+
"parallel_cucumber": []
|
15
17
|
},
|
16
18
|
"test_environment": {
|
17
|
-
"cucumber_environment": {
|
19
|
+
"cucumber_environment": {
|
20
|
+
"cucumber": [],
|
21
|
+
"parallel_cucumber_worker": []
|
22
|
+
},
|
18
23
|
"test_helper": {
|
19
24
|
"test": ["rspec", "testrb"],
|
20
|
-
"
|
25
|
+
"parallel_rspec_worker": []
|
21
26
|
}
|
22
27
|
}
|
23
28
|
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative '../parallel_tests'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module Zeus::ParallelTests
|
5
|
+
class Worker
|
6
|
+
def self.command(suite)
|
7
|
+
"ruby #{__FILE__} #{suite}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(suite, env, argv)
|
11
|
+
@env = env
|
12
|
+
@argv = argv
|
13
|
+
@suite = suite
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
system %{zeus parallel_#{@suite}_worker #{parallel_tests_attributes}}
|
18
|
+
args_file.unlink
|
19
|
+
$?.to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def parallel_tests_attributes
|
25
|
+
[test_env_number.to_s,
|
26
|
+
@env['PARALLEL_TEST_GROUPS'],
|
27
|
+
args_file.path].join(' ')
|
28
|
+
end
|
29
|
+
|
30
|
+
def args_file
|
31
|
+
@args_file ||= begin
|
32
|
+
Tempfile.new("rspec_args").tap do |file|
|
33
|
+
@argv.each do |arg|
|
34
|
+
file.puts arg
|
35
|
+
end
|
36
|
+
file.close
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_env_number
|
42
|
+
@env['TEST_ENV_NUMBER'] != "" && @env['TEST_ENV_NUMBER'] || 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if $PROGRAM_NAME == __FILE__
|
48
|
+
argv = ARGV.dup
|
49
|
+
exit Zeus::ParallelTests::Worker.new(argv.shift, ENV, argv).call.to_i
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
describe 'zeus-parallel_tests' do
|
6
|
+
before do
|
7
|
+
@project_dir = File.expand_path(Dir.mktmpdir)
|
8
|
+
Dir.mkdir(File.join(@project_dir, "script"))
|
9
|
+
|
10
|
+
bin = File.expand_path('../../../bin/zeus-parallel_tests', __FILE__)
|
11
|
+
@run = -> { system("#{bin} init &>/dev/null", chdir: @project_dir) }
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
FileUtils.rm_rf @project_dir
|
16
|
+
@io && @io.close
|
17
|
+
end
|
18
|
+
|
19
|
+
it "creates zeus configuration and script/spec in projects directory" do
|
20
|
+
@run.call
|
21
|
+
|
22
|
+
expected_files = ['zeus.json', 'custom_plan.rb'].
|
23
|
+
map { |f| File.join(@project_dir, f) }
|
24
|
+
|
25
|
+
expected_files.each do |f|
|
26
|
+
assert File.exists?(f), "#{f} should exists"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/test/test_helper.rb
ADDED
data/zeus-parallel_tests.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "zeus", "~> 0.13.3"
|
22
|
-
spec.add_dependency "parallel_tests", "0.10.
|
22
|
+
spec.add_dependency "parallel_tests", "~> 0.10.4"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
25
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zeus-parallel_tests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artur Roszczyk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeus
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: parallel_tests
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.10.
|
33
|
+
version: 0.10.4
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.10.
|
40
|
+
version: 0.10.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,24 +70,28 @@ description: Integration for zeus and parallel_tests
|
|
70
70
|
email:
|
71
71
|
- artur.roszczyk@gmail.com
|
72
72
|
executables:
|
73
|
-
- zeus-
|
73
|
+
- zeus-parallel_tests
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
77
|
- .gitignore
|
78
78
|
- .ruby-gemset
|
79
79
|
- .ruby-version
|
80
|
+
- .travis.yml
|
80
81
|
- Gemfile
|
81
82
|
- LICENSE.txt
|
82
83
|
- README.md
|
83
84
|
- Rakefile
|
84
|
-
- bin/zeus-
|
85
|
+
- bin/zeus-parallel_tests
|
85
86
|
- lib/zeus/parallel_tests.rb
|
86
87
|
- lib/zeus/parallel_tests/rails.rb
|
87
88
|
- lib/zeus/parallel_tests/templates/custom_plan.rb
|
88
|
-
- lib/zeus/parallel_tests/templates/spec
|
89
89
|
- lib/zeus/parallel_tests/templates/zeus.json
|
90
90
|
- lib/zeus/parallel_tests/version.rb
|
91
|
+
- lib/zeus/parallel_tests/worker.rb
|
92
|
+
- test/integration_test.rb
|
93
|
+
- test/slow/zeus-parallel_tests_test.rb
|
94
|
+
- test/test_helper.rb
|
91
95
|
- zeus-parallel_tests.gemspec
|
92
96
|
homepage: ''
|
93
97
|
licenses:
|
@@ -104,13 +108,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
108
|
version: '0'
|
105
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
110
|
requirements:
|
107
|
-
- - '
|
111
|
+
- - '>'
|
108
112
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
113
|
+
version: 1.3.1
|
110
114
|
requirements: []
|
111
115
|
rubyforge_project:
|
112
116
|
rubygems_version: 2.0.3
|
113
117
|
signing_key:
|
114
118
|
specification_version: 4
|
115
119
|
summary: ''
|
116
|
-
test_files:
|
120
|
+
test_files:
|
121
|
+
- test/integration_test.rb
|
122
|
+
- test/slow/zeus-parallel_tests_test.rb
|
123
|
+
- test/test_helper.rb
|
124
|
+
has_rdoc:
|
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'tempfile'
|
3
|
-
|
4
|
-
test_env_number = ENV['TEST_ENV_NUMBER'] || 1
|
5
|
-
test_env_number = 1 if test_env_number == ""
|
6
|
-
|
7
|
-
rspec_args_file = Tempfile.new("rspec_args")
|
8
|
-
ARGV.each do |arg|
|
9
|
-
rspec_args_file.puts arg
|
10
|
-
end
|
11
|
-
|
12
|
-
rspec_args_file.close
|
13
|
-
|
14
|
-
system %{zeus parallel_rspec #{test_env_number} #{ENV['PARALLEL_TEST_GROUPS']} #{rspec_args_file.path}}
|
15
|
-
status = $?
|
16
|
-
|
17
|
-
rspec_args_file.unlink
|
18
|
-
|
19
|
-
exit status.to_i
|