forking_test_runner 0.4.6 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/forking_test_runner.rb +98 -32
- data/lib/forking_test_runner/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de99eb6c9f92a0d16b7b0e85053449bce2418a30
|
4
|
+
data.tar.gz: bca4f9f34d9fff0a2bc665e680934403edfe71fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 447e4dd3336ee76632a7f5c20ce3e7a92509c37ddd3e4123557e9ec74f0dd6c653116cde1e87e557ad8a8013c332b15a29c2e2e4e35b22f7976f62baedf76fff
|
7
|
+
data.tar.gz: 342d7b3bbafbddf334c778b27ed7fa3ab71b2a45a3cfc879fd994fc157a024f33994087bff40102b874c2cbf72b7842ba964907fae39ef2876e3abd1bf03854a
|
data/lib/forking_test_runner.rb
CHANGED
@@ -8,7 +8,10 @@ module ForkingTestRunner
|
|
8
8
|
@rspec = delete_argv("--rspec", argv, arg: false)
|
9
9
|
@no_fixtures = delete_argv("--no-fixtures", argv, arg: false)
|
10
10
|
|
11
|
+
@quiet = delete_argv("--quiet", argv, arg: false)
|
12
|
+
|
11
13
|
disable_test_autorun
|
14
|
+
|
12
15
|
load_test_env(delete_argv("--helper", argv))
|
13
16
|
|
14
17
|
# figure out what we need to run
|
@@ -16,26 +19,43 @@ module ForkingTestRunner
|
|
16
19
|
runtime_log = delete_argv("--runtime-log", argv)
|
17
20
|
group, group_count, tests = extract_group_args(argv)
|
18
21
|
tests = find_tests_for_group(group, group_count, tests, runtime_log)
|
19
|
-
|
22
|
+
|
23
|
+
if @quiet
|
24
|
+
puts "Running #{tests.size} test files"
|
25
|
+
else
|
26
|
+
puts "Running tests #{tests.map(&:first).join(" ")}"
|
27
|
+
end
|
20
28
|
|
21
29
|
# run all the tests
|
22
30
|
results = tests.map do |file, expected|
|
23
|
-
puts "#{CLEAR} >>> #{file}"
|
24
|
-
time, success = benchmark { run_test(file) }
|
25
|
-
|
26
|
-
puts
|
27
|
-
|
31
|
+
puts "#{CLEAR} >>> #{file} "
|
32
|
+
time, success, output = benchmark { run_test(file) }
|
33
|
+
|
34
|
+
puts output if !success && @quiet
|
35
|
+
|
36
|
+
unless @quiet
|
37
|
+
puts "Time: expected #{expected.round(2)}, actual #{time.round(2)}" if runtime_log
|
38
|
+
puts "#{CLEAR} <<< #{file} ---- #{success ? "OK" : "Failed"}"
|
39
|
+
end
|
40
|
+
[file, time, expected, output, success]
|
28
41
|
end
|
29
42
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
43
|
+
unless @quiet
|
44
|
+
# pretty print the results
|
45
|
+
puts "\nResults:"
|
46
|
+
puts results.
|
47
|
+
sort_by { |_,_,_,_,r| r ? 0 : 1 }. # failures should be last so they are easy to find
|
48
|
+
map { |f,_,_,_,r| "#{f}: #{r ? "OK" : "Fail"}"}
|
49
|
+
puts
|
50
|
+
end
|
51
|
+
|
52
|
+
success = results.map(&:last).all?
|
53
|
+
|
54
|
+
puts colorize(success, summarize_results(results.map { |r| r[3] }))
|
35
55
|
|
36
56
|
if runtime_log
|
37
57
|
# show how long they ran vs expected
|
38
|
-
diff = results.map { |_,time,expected
|
58
|
+
diff = results.map { |_,time,expected| time - expected }.inject(:+).to_f
|
39
59
|
puts "Time: #{diff.round(2)} diff to expected"
|
40
60
|
end
|
41
61
|
|
@@ -46,17 +66,37 @@ module ForkingTestRunner
|
|
46
66
|
end
|
47
67
|
|
48
68
|
# exit with success or failure
|
49
|
-
|
69
|
+
success ? 0 : 1
|
50
70
|
end
|
51
71
|
|
52
72
|
private
|
53
73
|
|
74
|
+
def colorize(green, string)
|
75
|
+
if $stdout.tty?
|
76
|
+
"\e[#{green ? 32 : 31}m#{string}\e[0m"
|
77
|
+
else
|
78
|
+
string
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def summarize_results(results)
|
83
|
+
runner = if @rspec
|
84
|
+
require 'parallel_tests/test/runner'
|
85
|
+
ParallelTests::Test::Runner
|
86
|
+
else
|
87
|
+
require 'parallel_tests/rspec/runner'
|
88
|
+
ParallelTests::RSpec::Runner
|
89
|
+
end
|
90
|
+
|
91
|
+
runner.summarize_results(results.map { |r| runner.find_results(r) })
|
92
|
+
end
|
93
|
+
|
54
94
|
def benchmark
|
55
95
|
result = false
|
56
96
|
time = Benchmark.realtime do
|
57
97
|
result = yield
|
58
98
|
end
|
59
|
-
return time, result
|
99
|
+
return [time, result].flatten
|
60
100
|
end
|
61
101
|
|
62
102
|
# log runtime via dumping or curling it into the runtime log location
|
@@ -141,13 +181,37 @@ module ForkingTestRunner
|
|
141
181
|
toggle_test_autorun true, file
|
142
182
|
end
|
143
183
|
|
184
|
+
def fork_with_captured_output(tee_to_stdout)
|
185
|
+
rpipe, wpipe = IO.pipe
|
186
|
+
|
187
|
+
child = fork do
|
188
|
+
rpipe.close
|
189
|
+
$stdout.reopen(wpipe)
|
190
|
+
|
191
|
+
yield
|
192
|
+
end
|
193
|
+
|
194
|
+
wpipe.close
|
195
|
+
|
196
|
+
buffer = ""
|
197
|
+
|
198
|
+
while ch = rpipe.read(1)
|
199
|
+
buffer << ch
|
200
|
+
$stdout.write(ch) if tee_to_stdout
|
201
|
+
end
|
202
|
+
|
203
|
+
Process.wait(child)
|
204
|
+
buffer
|
205
|
+
end
|
206
|
+
|
144
207
|
def run_test(file)
|
145
208
|
if ar?
|
146
209
|
preload_fixtures
|
147
210
|
ActiveRecord::Base.connection.disconnect!
|
148
211
|
end
|
149
|
-
|
150
|
-
|
212
|
+
|
213
|
+
output = change_program_name_to file do
|
214
|
+
fork_with_captured_output(!@quiet) do
|
151
215
|
SimpleCov.pid = Process.pid if defined?(SimpleCov) && SimpleCov.respond_to?(:pid=) # trick simplecov into reporting in this fork
|
152
216
|
if ar?
|
153
217
|
key = (ActiveRecord::VERSION::STRING >= "4.1.0" ? :test : "test")
|
@@ -155,9 +219,9 @@ module ForkingTestRunner
|
|
155
219
|
end
|
156
220
|
enable_test_autorun(file)
|
157
221
|
end
|
158
|
-
Process.wait(child)
|
159
222
|
end
|
160
|
-
|
223
|
+
|
224
|
+
[$?.success?, output]
|
161
225
|
end
|
162
226
|
|
163
227
|
def change_program_name_to(name)
|
@@ -199,6 +263,20 @@ module ForkingTestRunner
|
|
199
263
|
defined?(ActiveRecord::Base)
|
200
264
|
end
|
201
265
|
|
266
|
+
def minitest_class
|
267
|
+
@minitest_class ||= begin
|
268
|
+
require 'bundler/setup'
|
269
|
+
gem 'minitest'
|
270
|
+
if Gem.loaded_specs["minitest"].version.segments.first == 4 # 4.x
|
271
|
+
require 'minitest/unit'
|
272
|
+
MiniTest::Unit
|
273
|
+
else
|
274
|
+
require 'minitest'
|
275
|
+
Minitest
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
202
280
|
def toggle_test_autorun(value, file=nil)
|
203
281
|
if @rspec
|
204
282
|
if value
|
@@ -211,22 +289,10 @@ module ForkingTestRunner
|
|
211
289
|
$LOAD_PATH.unshift "./spec"
|
212
290
|
end
|
213
291
|
else
|
214
|
-
|
215
|
-
require 'bundler/setup'
|
216
|
-
gem 'minitest'
|
217
|
-
if Gem.loaded_specs["minitest"].version.segments.first == 4 # 4.x
|
218
|
-
require 'minitest/unit'
|
219
|
-
MiniTest::Unit
|
220
|
-
else
|
221
|
-
require 'minitest'
|
222
|
-
Minitest
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
@minitest_class.class_variable_set("@@installed_at_exit", !value)
|
292
|
+
minitest_class.class_variable_set("@@installed_at_exit", !value)
|
227
293
|
|
228
294
|
if value
|
229
|
-
|
295
|
+
minitest_class.autorun
|
230
296
|
require "./#{file}"
|
231
297
|
end
|
232
298
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forking_test_runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.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: 2015-
|
11
|
+
date: 2015-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parallel_tests
|
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
153
|
version: '0'
|
154
154
|
requirements: []
|
155
155
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.2.
|
156
|
+
rubygems_version: 2.2.3
|
157
157
|
signing_key:
|
158
158
|
specification_version: 4
|
159
159
|
summary: Run every test in a fork to avoid pollution and get clean output per test
|