rspec_parallel 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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: []