parallel_tests 2.15.0 → 2.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +1 -0
- data/lib/parallel_tests.rb +10 -10
- data/lib/parallel_tests/cli.rb +1 -0
- data/lib/parallel_tests/pids.rb +60 -0
- data/lib/parallel_tests/test/runner.rb +10 -14
- data/lib/parallel_tests/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b379a6559260bc09ecbdf2f662561213b1f765d4
|
4
|
+
data.tar.gz: 7589375b613e87e4eab4753cc7694afb46d3de4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8531b811305f22ae1206776d2068fb99699f65a0458376036b1efcb661176032d2ae46068f6c6d1a964dfa9066e627ff7698de14b43112bae834f8639bc3fe18
|
7
|
+
data.tar.gz: cbd83e152eb227ad954fadd7b97c85d3c7209d7cadf142add277e55c2c155ae95edfd0afc6b5917b04ad1ed4fbbb3a75a4fbecc05d40dab601b0b4ba3c171e9a
|
data/Readme.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/parallel_tests.svg)](https://rubygems.org/gems/parallel_tests)
|
4
4
|
[![Build Status](https://travis-ci.org/grosser/parallel_tests.svg)](https://travis-ci.org/grosser/parallel_tests/builds)
|
5
|
+
[![Build status](https://ci.appveyor.com/api/projects/status/708b1up4pqc34x3y?svg=true)](https://ci.appveyor.com/project/grosser/parallel-tests)
|
5
6
|
|
6
7
|
Speedup Test::Unit + RSpec + Cucumber + Spinach by running parallel on multiple CPU cores.<br/>
|
7
8
|
ParallelTests splits tests into even groups (by number of lines or runtime) and runs each group in a single process with its own database.
|
data/lib/parallel_tests.rb
CHANGED
@@ -4,17 +4,12 @@ require "rbconfig"
|
|
4
4
|
|
5
5
|
module ParallelTests
|
6
6
|
WINDOWS = (RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/)
|
7
|
-
GREP_PROCESSES_COMMAND = \
|
8
|
-
if WINDOWS
|
9
|
-
"wmic process get commandline | findstr TEST_ENV_NUMBER | find /c \"TEST_ENV_NUMBER=\" 2>&1"
|
10
|
-
else
|
11
|
-
"ps -ef | grep [T]EST_ENV_NUMBER= 2>&1"
|
12
|
-
end
|
13
7
|
RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
14
8
|
|
15
9
|
autoload :CLI, "parallel_tests/cli"
|
16
10
|
autoload :VERSION, "parallel_tests/version"
|
17
11
|
autoload :Grouper, "parallel_tests/grouper"
|
12
|
+
autoload :Pids, "parallel_tests/pids"
|
18
13
|
|
19
14
|
class << self
|
20
15
|
def determine_number_of_processes(count)
|
@@ -25,6 +20,14 @@ module ParallelTests
|
|
25
20
|
].detect{|c| not c.to_s.strip.empty? }.to_i
|
26
21
|
end
|
27
22
|
|
23
|
+
def pids
|
24
|
+
@pids ||= Pids.new(pid_file_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def pid_file_path
|
28
|
+
ENV['PARALLEL_PID_FILE'] ||= Tempfile.new('parallel-tests-pidfile').path
|
29
|
+
end
|
30
|
+
|
28
31
|
# copied from http://github.com/carlhuda/bundler Bundler::SharedHelpers#find_gemfile
|
29
32
|
def bundler_enabled?
|
30
33
|
return true if Object.const_defined?(:Bundler)
|
@@ -70,11 +73,8 @@ module ParallelTests
|
|
70
73
|
sleep 1 until number_of_running_processes <= 1
|
71
74
|
end
|
72
75
|
|
73
|
-
# Fun fact: this includes the current process if it's run via parallel_tests
|
74
76
|
def number_of_running_processes
|
75
|
-
|
76
|
-
raise "Could not grep for processes -> #{result}" if result.strip != "" && !$?.success?
|
77
|
-
result.split("\n").size
|
77
|
+
pids.count
|
78
78
|
end
|
79
79
|
|
80
80
|
# real time even if someone messed with timecop in tests
|
data/lib/parallel_tests/cli.rb
CHANGED
@@ -28,6 +28,7 @@ module ParallelTests
|
|
28
28
|
Tempfile.open 'parallel_tests-lock' do |lock|
|
29
29
|
progress_indicator = simulate_output_for_ci if options[:serialize_stdout]
|
30
30
|
|
31
|
+
ParallelTests.pids # setup the class vars here so we dont initialize in the threads
|
31
32
|
Parallel.map(items, :in_threads => num_processes) do |item|
|
32
33
|
result = yield(item)
|
33
34
|
if progress_indicator && progress_indicator.alive?
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module ParallelTests
|
5
|
+
class Pids
|
6
|
+
attr_reader :pids, :file_path, :mutex
|
7
|
+
|
8
|
+
def initialize(file_path)
|
9
|
+
@file_path = file_path
|
10
|
+
@mutex = Mutex.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(pid)
|
14
|
+
pids << pid.to_i
|
15
|
+
save
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(pid)
|
19
|
+
pids.delete(pid.to_i)
|
20
|
+
save
|
21
|
+
end
|
22
|
+
|
23
|
+
def count
|
24
|
+
read
|
25
|
+
pids.count
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def pids
|
31
|
+
@pids ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
def all
|
35
|
+
read
|
36
|
+
pids
|
37
|
+
end
|
38
|
+
|
39
|
+
def clear
|
40
|
+
@pids = []
|
41
|
+
save
|
42
|
+
end
|
43
|
+
|
44
|
+
def read
|
45
|
+
sync do
|
46
|
+
contents = IO.read(file_path)
|
47
|
+
return if contents.empty?
|
48
|
+
@pids = JSON.parse(contents)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def save
|
53
|
+
sync { IO.write(file_path, pids.to_json) }
|
54
|
+
end
|
55
|
+
|
56
|
+
def sync
|
57
|
+
mutex.synchronize { yield }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -71,8 +71,9 @@ module ParallelTests
|
|
71
71
|
|
72
72
|
def execute_command(cmd, process_number, num_processes, options)
|
73
73
|
env = (options[:env] || {}).merge(
|
74
|
-
"TEST_ENV_NUMBER" => test_env_number(process_number, options),
|
75
|
-
"PARALLEL_TEST_GROUPS" => num_processes
|
74
|
+
"TEST_ENV_NUMBER" => test_env_number(process_number, options).to_s,
|
75
|
+
"PARALLEL_TEST_GROUPS" => num_processes.to_s,
|
76
|
+
"PARALLEL_PID_FILE" => ParallelTests.pid_file_path,
|
76
77
|
)
|
77
78
|
cmd = "nice #{cmd}" if options[:nice]
|
78
79
|
cmd = "#{cmd} 2>&1" if options[:combine_stderr]
|
@@ -84,18 +85,13 @@ module ParallelTests
|
|
84
85
|
end
|
85
86
|
|
86
87
|
def execute_command_and_capture_output(env, cmd, silence)
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
end.join(separator)
|
96
|
-
cmd = "#{exports}#{separator}#{cmd}"
|
97
|
-
|
98
|
-
output = open("|#{cmd}", "r") { |output| capture_output(output, silence) }
|
88
|
+
pid = nil
|
89
|
+
output = IO.popen(env, cmd) do |io|
|
90
|
+
pid = io.pid
|
91
|
+
ParallelTests.pids.add(pid)
|
92
|
+
capture_output(io, silence)
|
93
|
+
end
|
94
|
+
ParallelTests.pids.delete(pid) if pid
|
99
95
|
exitstatus = $?.exitstatus
|
100
96
|
seed = output[/seed (\d+)/,1]
|
101
97
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel_tests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parallel
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/parallel_tests/gherkin/runner.rb
|
51
51
|
- lib/parallel_tests/gherkin/runtime_logger.rb
|
52
52
|
- lib/parallel_tests/grouper.rb
|
53
|
+
- lib/parallel_tests/pids.rb
|
53
54
|
- lib/parallel_tests/railtie.rb
|
54
55
|
- lib/parallel_tests/rspec/failures_logger.rb
|
55
56
|
- lib/parallel_tests/rspec/logger_base.rb
|