rspec_parallel 0.1.2 → 0.1.3
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/lib/rspec_parallel.rb +49 -26
- metadata +5 -5
data/lib/rspec_parallel.rb
CHANGED
@@ -6,36 +6,54 @@ require 'thread'
|
|
6
6
|
require 'rexml/document'
|
7
7
|
include REXML
|
8
8
|
include ColorHelpers
|
9
|
+
include Interactive
|
9
10
|
|
10
11
|
class Rspec_parallel
|
11
12
|
|
12
|
-
|
13
|
+
attr_reader :case_number
|
14
|
+
attr_reader :failure_number
|
15
|
+
attr_reader :pending_number
|
16
|
+
attr_reader :case_info_list
|
17
|
+
|
18
|
+
attr_accessor :thread_number
|
19
|
+
attr_accessor :max_rerun_times
|
20
|
+
attr_accessor :max_thread_number
|
13
21
|
|
14
22
|
def initialize(options = {})
|
15
23
|
@options = {:thread_number => 4, :case_folder => "./spec/", :report_folder => "./reports/",
|
16
24
|
:filter => {}, :env_list => [], :show_pending => false, :rerun => false,
|
17
|
-
:separate_rerun_report => true}.merge(options)
|
25
|
+
:separate_rerun_report => true, :max_rerun_times => 10, :max_thread_number => 16}.merge(options)
|
26
|
+
@thread_number = @options[:thread_number]
|
27
|
+
@max_rerun_times = @options[:max_rerun_times]
|
28
|
+
@max_thread_number = @options[:max_thread_number]
|
29
|
+
|
30
|
+
@case_number = 0
|
31
|
+
@failure_number = 0
|
32
|
+
@pending_number = 0
|
18
33
|
end
|
19
34
|
|
20
35
|
def run_tests()
|
21
36
|
start_time = Time.now # timer of rspec task
|
37
|
+
interrupted = false # whether there is a interrupt
|
22
38
|
@queue = Queue.new # store all tests to run
|
23
39
|
@case_info_list = [] # store results of all tests
|
24
40
|
@lock = Mutex.new # use lock to avoid output mess up
|
25
41
|
|
26
|
-
thread_number
|
27
|
-
|
28
|
-
puts red("threads_number can't be less than 1")
|
42
|
+
if @thread_number < 1
|
43
|
+
puts red("thread_number can't be less than 1")
|
29
44
|
exit(1)
|
45
|
+
elsif @thread_number > @max_thread_number
|
46
|
+
puts red("thread_number can't be greater than #{@max_thread_number}")
|
47
|
+
return
|
30
48
|
end
|
31
|
-
puts yellow("threads number: #{thread_number}\n")
|
49
|
+
puts yellow("threads number: #{@thread_number}\n")
|
32
50
|
|
33
51
|
rerun = @options[:rerun]
|
34
52
|
separate_rerun_report = @options[:separate_rerun_report]
|
35
53
|
if rerun && separate_rerun_report
|
36
54
|
@report_folder = get_rerun_folder(true)
|
37
|
-
if @report_folder.include? "rerun#{
|
38
|
-
puts yellow("rerun task has been executed for #{
|
55
|
+
if @report_folder.include? "rerun#{@max_rerun_times + 1}"
|
56
|
+
puts yellow("rerun task has been executed for #{@max_rerun_times}" +
|
39
57
|
" times, maybe you should start a new run")
|
40
58
|
exit(1)
|
41
59
|
end
|
@@ -57,16 +75,13 @@ class Rspec_parallel
|
|
57
75
|
|
58
76
|
pbar = ProgressBar.new("0/#{@queue.size}", @queue.size, $stdout)
|
59
77
|
pbar.format_arguments = [:title, :percentage, :bar, :stat]
|
60
|
-
case_number = 0
|
61
|
-
failure_number = 0
|
62
|
-
pending_number = 0
|
63
78
|
failure_list = []
|
64
79
|
pending_list = []
|
65
80
|
|
66
81
|
Thread.abort_on_exception = false
|
67
82
|
threads = []
|
68
83
|
|
69
|
-
thread_number.times do |i|
|
84
|
+
@thread_number.times do |i|
|
70
85
|
threads << Thread.new do
|
71
86
|
until @queue.empty?
|
72
87
|
task = @queue.pop
|
@@ -88,26 +103,26 @@ class Rspec_parallel
|
|
88
103
|
|
89
104
|
if case_info['status'] == 'fail'
|
90
105
|
@lock.synchronize do
|
91
|
-
failure_number += 1
|
106
|
+
@failure_number += 1
|
92
107
|
failure_list << case_info
|
93
108
|
|
94
109
|
# print failure immediately during the execution
|
95
110
|
$stdout.print "\e[K"
|
96
|
-
if failure_number == 1
|
111
|
+
if @failure_number == 1
|
97
112
|
$stdout.print "Failures:\n\n"
|
98
113
|
end
|
99
|
-
puts " #{failure_number}) #{case_info['test_name']}"
|
114
|
+
puts " #{@failure_number}) #{case_info['test_name']}"
|
100
115
|
$stdout.print "#{red(case_info['error_message'])}"
|
101
116
|
$stdout.print "#{cyan(case_info['error_stack_trace'])}"
|
102
117
|
$stdout.print red(" (Failure time: #{Time.now})\n\n")
|
103
118
|
end
|
104
119
|
elsif case_info['status'] == 'pending'
|
105
120
|
@lock.synchronize do
|
106
|
-
pending_number += 1
|
121
|
+
@pending_number += 1
|
107
122
|
pending_list << case_info
|
108
123
|
end
|
109
124
|
end
|
110
|
-
case_number += 1
|
125
|
+
@case_number += 1
|
111
126
|
pbar.inc
|
112
127
|
pbar.instance_variable_set("@title", "#{pbar.current}/#{pbar.total}")
|
113
128
|
end
|
@@ -116,12 +131,16 @@ class Rspec_parallel
|
|
116
131
|
sleep 0.1
|
117
132
|
end
|
118
133
|
|
119
|
-
|
134
|
+
begin
|
135
|
+
threads.each { |t| t.join }
|
136
|
+
rescue Interrupt
|
137
|
+
interrupted = true
|
138
|
+
end
|
120
139
|
pbar.finish
|
121
140
|
|
122
141
|
# print pending cases if configured
|
123
142
|
show_pending = @options[:show_pending]
|
124
|
-
if show_pending && pending_number > 0
|
143
|
+
if show_pending && @pending_number > 0
|
125
144
|
$stdout.print "\n"
|
126
145
|
puts "Pending:"
|
127
146
|
pending_list.each {|case_info|
|
@@ -133,13 +152,13 @@ class Rspec_parallel
|
|
133
152
|
# print total time and summary result
|
134
153
|
end_time = Time.now
|
135
154
|
puts "\nFinished in #{format_time(end_time-start_time)}\n"
|
136
|
-
if failure_number > 0
|
137
|
-
$stdout.print red("#{case_number} examples, #{failure_number} failures")
|
138
|
-
$stdout.print red(", #{pending_number} pending") if pending_number > 0
|
139
|
-
elsif pending_number > 0
|
140
|
-
$stdout.print yellow("#{case_number} examples, #{failure_number} failures, #{pending_number} pending")
|
155
|
+
if @failure_number > 0
|
156
|
+
$stdout.print red("#{@case_number} examples, #{@failure_number} failures")
|
157
|
+
$stdout.print red(", #{@pending_number} pending") if @pending_number > 0
|
158
|
+
elsif @pending_number > 0
|
159
|
+
$stdout.print yellow("#{@case_number} examples, #{@failure_number} failures, #{@pending_number} pending")
|
141
160
|
else
|
142
|
-
$stdout.print green("#{case_number} examples, 0 failures")
|
161
|
+
$stdout.print green("#{@case_number} examples, 0 failures")
|
143
162
|
end
|
144
163
|
$stdout.print "\n"
|
145
164
|
|
@@ -153,6 +172,10 @@ class Rspec_parallel
|
|
153
172
|
end
|
154
173
|
|
155
174
|
generate_reports(end_time - start_time, rerun && !separate_rerun_report)
|
175
|
+
|
176
|
+
if interrupted
|
177
|
+
raise Interrupt
|
178
|
+
end
|
156
179
|
end
|
157
180
|
|
158
181
|
def get_case_list
|
@@ -287,7 +310,7 @@ class Rspec_parallel
|
|
287
310
|
|
288
311
|
def get_rerun_folder(get_next=false)
|
289
312
|
rerun_folder = @options[:report_folder]
|
290
|
-
i =
|
313
|
+
i = @max_rerun_times
|
291
314
|
while(i > 0)
|
292
315
|
if File.exists? File.join(rerun_folder, "rerun#{i}")
|
293
316
|
if get_next
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec_parallel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- VMware
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: progressbar
|
@@ -28,14 +28,14 @@ dependencies:
|
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.11.0
|
30
30
|
description: parallel all rspec examples
|
31
|
-
email:
|
31
|
+
email: support@vmware.com
|
32
32
|
executables: []
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
36
|
- lib/rspec_parallel.rb
|
37
37
|
- lib/color_helper.rb
|
38
|
-
homepage: http://
|
38
|
+
homepage: http://www.vmware.com
|
39
39
|
licenses: []
|
40
40
|
post_install_message:
|
41
41
|
rdoc_options: []
|