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.
Files changed (2) hide show
  1. data/lib/rspec_parallel.rb +49 -26
  2. metadata +5 -5
@@ -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
- MAX_RERUN_TIMES = 10
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 = @options[:thread_number]
27
- if thread_number < 1
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#{MAX_RERUN_TIMES + 1}"
38
- puts yellow("rerun task has been executed for #{MAX_RERUN_TIMES}" +
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
- threads.each { |t| t.join }
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 = MAX_RERUN_TIMES
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.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Michael Zhang
8
+ - VMware
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-27 00:00:00.000000000 Z
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: zhangcheng@rbcon.com
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://rubygems.org/gems/rspec_parallel
38
+ homepage: http://www.vmware.com
39
39
  licenses: []
40
40
  post_install_message:
41
41
  rdoc_options: []