rspec_parallel 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,12 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec_parallel (0.1.0)
4
+ rspec_parallel (0.1.6)
5
+ nokogiri (>= 1.5.2)
5
6
  progressbar (>= 0.11.0)
6
7
 
7
8
  GEM
8
9
  remote: http://rubygems.org/
9
10
  specs:
11
+ nokogiri (1.5.2)
10
12
  progressbar (0.11.0)
11
13
  rake (0.9.2.2)
12
14
 
@@ -1,6 +1,6 @@
1
1
  # Displaying text in color
2
2
  module RParallel
3
- module ColorHelpers
3
+ module ColorHelper
4
4
 
5
5
  def red(text)
6
6
  "\e[31m#{text}\e[0m"
@@ -0,0 +1,289 @@
1
+ # generate or update report
2
+ module RParallel
3
+ module ReportHelper
4
+
5
+ def get_report_folder(base_folder, get_next = false)
6
+ i = 0
7
+
8
+ folders = Dir.glob("#{base_folder}/rerun*").sort
9
+ unless folders.nil? || folders == []
10
+ i = folders.last.split("rerun",2).last.to_i
11
+ end
12
+
13
+ if get_next
14
+ i = i + 1
15
+ end
16
+
17
+ return base_folder if i == 0
18
+
19
+ File.join(base_folder, "rerun#{i.to_s}")
20
+ end
21
+
22
+ def get_last_report_file(base_folder, single_report)
23
+ if single_report
24
+ return File.join(base_folder, "junitResult.xml")
25
+ else
26
+ report_folder = get_report_folder(base_folder, false)
27
+ return File.join(report_folder, "junitResult.xml")
28
+ end
29
+ end
30
+
31
+ def get_failed_cases(base_folder, single_report)
32
+ queue = Queue.new
33
+
34
+ last_report_file = get_last_report_file(base_folder, single_report)
35
+ unless File.exists? last_report_file
36
+ puts yellow("can't find result of last run")
37
+ exit(1)
38
+ end
39
+
40
+ begin
41
+ doc = Nokogiri::XML(open(last_report_file))
42
+ doc.xpath("//result/suites/suite/cases/case").each do |c|
43
+ unless c.xpath(".//errorDetails").empty?
44
+ rerun_cmd = c.xpath(".//rerunCommand").text
45
+ line = rerun_cmd.split('#')[0].gsub('rspec ', '').strip
46
+ queue << line
47
+ end
48
+ end
49
+ rescue
50
+ puts red("invalid format of report xml")
51
+ exit(1)
52
+ end
53
+
54
+ queue
55
+ end
56
+
57
+ def generate_reports(report_folder, time, case_info_list, options)
58
+ %x[mkdir #{report_folder}] unless File.exists? report_folder
59
+ report_file_path = File.join(report_folder, 'junitResult.xml')
60
+
61
+ if options[:longevity] > 1 && options[:single_report]
62
+ summary_doc = Nokogiri::XML(open(report_file_path, 'r')) do |config|
63
+ config.default_xml.noblanks
64
+ end
65
+ summary_doc.search("//result/duration").remove
66
+ summary_doc.search("//result/keepLongStdio").remove
67
+ else
68
+ builder = Nokogiri::XML::Builder.new("encoding" => 'UTF-8') do |xml|
69
+ xml.result {
70
+ xml.suites
71
+ }
72
+ end
73
+ summary_doc = builder.doc
74
+ end
75
+
76
+ # reorder the tests by class_name
77
+ class_name_list = []
78
+ case_info_list.each do |case_info|
79
+ class_name = case_info['class_name']
80
+ class_name_list << class_name
81
+ end
82
+ class_name_list.uniq!
83
+ class_name_list.sort!
84
+ class_name_list.each do |class_name|
85
+ temp_case_info_list = []
86
+ case_info_list.each do |case_info|
87
+ if case_info['class_name'] == class_name
88
+ temp_case_info_list << case_info
89
+ end
90
+ end
91
+
92
+ generate_single_file_report(report_folder, temp_case_info_list, options, summary_doc.at("//result/suites"))
93
+ end
94
+
95
+ if options[:rerun] && options[:single_report]
96
+ last_report_file = get_last_report_file(options[:report_folder], options[:single_report])
97
+ last_doc = Nokogiri::XML(open(last_report_file))
98
+ doc = update_single_report(last_doc, case_info_list)
99
+ fr = File.new(report_file_path, 'w')
100
+ fr.puts doc.to_xml(:indent => 2)
101
+ fr.close
102
+ return
103
+ end
104
+
105
+ Nokogiri::XML::Builder.with(summary_doc.at("//result")) do |xml|
106
+ xml.duration time
107
+ xml.keepLongStdio "false"
108
+ end
109
+
110
+ fr = File.new(report_file_path, 'w')
111
+ fr.puts summary_doc.to_xml(:indent => 2)
112
+ fr.close
113
+ end
114
+
115
+ def update_single_report(doc, case_info_list)
116
+ doc.xpath("//result/suites/suite/cases/case").each do |c1|
117
+ unless c1.xpath(".//errorDetails").empty?
118
+ test_name = c1.at_xpath(".//testName").text
119
+ case_info_list.each do |c2|
120
+ if test_name == c2['test_name'] #.encode({:xml => :attr})
121
+ c1.at_xpath(".//duration").content = c2['duration']
122
+ if c2['status'] == 'fail'
123
+ text = c2['error_message'].gsub('Failure/Error: ', '') + "\n"
124
+ text += c2['error_stack_trace'].gsub('# ', '')
125
+ c1.at_xpath(".//errorStackTrace").content = text.strip
126
+ c1.at_xpath(".//errorDetails").content = c2['error_details']
127
+ c1.at_xpath(".//rerunCommand").content = c2['rerun_cmd'].strip
128
+ else
129
+ c1.search(".//errorDetails").remove
130
+ c1.search(".//errorStackTrace").remove
131
+ c1.search(".//rerunCommand").remove
132
+ end
133
+ break
134
+ end
135
+ end
136
+ end
137
+ end
138
+ doc
139
+ end
140
+
141
+ def generate_single_file_report(report_folder, case_info_list, options, suites_doc)
142
+ return if case_info_list == []
143
+ class_name = case_info_list[0]['class_name']
144
+ file_name = File.join(report_folder, class_name.gsub(/:+/, '-') + '.xml')
145
+
146
+ suite_duration = 0.0
147
+ fail_num = 0
148
+ error_num = 0
149
+ pending_num = 0
150
+ stdout = ''
151
+ stderr = ''
152
+ stdout_list = []
153
+ stderr_list = []
154
+ case_desc_list = []
155
+ case_info_list.each do |case_info|
156
+ suite_duration += case_info['duration']
157
+ stdout_list << case_info['stdout']
158
+ stderr_list << case_info['stderr']
159
+ case_desc_list << case_info['test_desc']
160
+ if case_info['status'] == 'fail'
161
+ if case_info['error_message'].include? "expect"
162
+ fail_num += 1
163
+ else
164
+ error_num += 1
165
+ end
166
+ elsif case_info['status'] == 'pending'
167
+ pending_num += 1
168
+ end
169
+ end
170
+ stdout_list.uniq!
171
+ stderr_list.uniq!
172
+ case_desc_list.sort!
173
+ stdout_list.each {|s| stdout += s}
174
+ stderr_list.each {|s| stderr += s}
175
+
176
+ suite_builder = Nokogiri::XML::Builder.with(suites_doc) do |xml|
177
+ xml.suite {
178
+ xml.file file_name
179
+ xml.name class_name.gsub(':', '_')
180
+ if stdout.length > 0
181
+ xml.stdout stdout
182
+ else
183
+ xml.stdout ""
184
+ end
185
+ if stderr.length > 0
186
+ xml.stderr stderr
187
+ else
188
+ xml.stderr ""
189
+ end
190
+ xml.duration suite_duration
191
+ xml.cases
192
+ }
193
+ end
194
+
195
+ longevity_report = options[:longevity] > 1 && options[:single_report]
196
+ if longevity_report
197
+ single_report = Nokogiri::XML(open(file_name)) do |config|
198
+ config.default_xml.noblanks
199
+ end
200
+ # delete 'system-out' and 'system-err', using the new one
201
+ single_report.search("//system-out").remove
202
+ single_report.search("//system-err").remove
203
+ else
204
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
205
+ xml.testsuite(:name => class_name,
206
+ :tests => case_info_list.size,
207
+ :time => suite_duration,
208
+ :failures=> fail_num,
209
+ :errors => error_num,
210
+ :skipped => pending_num)
211
+ end
212
+ single_report = builder.doc
213
+ end
214
+
215
+ case_desc_list.each do |case_desc|
216
+ i = case_info_list.index { |c| c['test_desc'] == case_desc }
217
+ case_info = case_info_list[i]
218
+ if options[:longevity] == 0
219
+ test_name = case_info['test_name']
220
+ else
221
+ test_name = "#{options[:longevity]}-"+case_info['test_name']
222
+ end
223
+ test_name += " (PENDING)" if case_info['status'] == 'pending'
224
+ # test_name = test_name.encode({:xml => :attr})
225
+ if case_info['status'] == 'fail'
226
+ if case_info['error_message'].include? "expected"
227
+ type = "RSpec::Expectations::ExpectationNotMetError"
228
+ elsif case_info['error_message'].include? "RuntimeError"
229
+ type = "RuntimeError"
230
+ else
231
+ type = "UnknownError"
232
+ end
233
+ end
234
+
235
+ # add new case into suite report for summary report
236
+ Nokogiri::XML::Builder.with(suite_builder.doc.at("//cases")) do |xml|
237
+ xml.case {
238
+ xml.duration case_info['duration']
239
+ xml.className class_name
240
+ xml.testName test_name
241
+ xml.skipped case_info['status'] == 'pending'
242
+ if case_info['status'] == 'fail'
243
+ xml.errorStackTrace {
244
+ xml.text case_info['error_message'].gsub('Failure/Error: ', '')
245
+ xml.text case_info['error_stack_trace'].gsub('# ', '').strip
246
+ }
247
+ xml.errorDetails case_info['error_details']
248
+ xml.rerunCommand case_info['rerun_cmd'].strip
249
+ end
250
+ xml.failedSince '0'
251
+ }
252
+ end
253
+
254
+ # add new case into single report
255
+ Nokogiri::XML::Builder.with(single_report.at("testsuite")) do |xml|
256
+ xml.testcase(:name => test_name, :time => case_info['duration']) {
257
+ if case_info['status'] == 'pending'
258
+ xml.skipped
259
+ elsif case_info['status'] == 'fail'
260
+ xml.failure(:type => type, :message => case_info['error_details']) {
261
+ xml.text case_info['error_message'].gsub('Failure/Error: ', '')
262
+ xml.text case_info['error_stack_trace'].gsub('# ', '').strip
263
+ }
264
+ xml.rerunCommand case_info['rerun_cmd'].strip
265
+ end
266
+ }
267
+ end
268
+ end
269
+
270
+ Nokogiri::XML::Builder.with(single_report.at("testsuite")) do |xml|
271
+ if stdout.length > 0
272
+ xml.send(:'system-out', stdout)
273
+ else
274
+ xml.send(:'system-out', "")
275
+ end
276
+ if stderr.length > 0
277
+ xml.send(:'system-err', stderr)
278
+ else
279
+ xml.send(:'system-err', "")
280
+ end
281
+ end
282
+
283
+ ff = File.new(file_name, 'w')
284
+ ff.puts single_report.to_xml(:indent => 2)
285
+ ff.close
286
+ end
287
+
288
+ end
289
+ end
@@ -1,3 +1,3 @@
1
1
  module RParallel
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -3,13 +3,14 @@ $LOAD_PATH << File.dirname(__FILE__)
3
3
  require 'progressbar'
4
4
  require 'thread'
5
5
  require 'find'
6
- require 'rexml/document'
7
- include REXML
6
+ require 'nokogiri'
8
7
 
9
8
  require 'rspec_parallel/color_helper'
10
9
  require 'rspec_parallel/version'
10
+ require 'rspec_parallel/report_helper'
11
11
  include RParallel
12
- include RParallel::ColorHelpers
12
+ include RParallel::ColorHelper
13
+ include RParallel::ReportHelper
13
14
 
14
15
  class RspecParallel
15
16
 
@@ -20,23 +21,21 @@ class RspecParallel
20
21
  attr_reader :interrupted
21
22
 
22
23
  attr_accessor :thread_number
23
- attr_accessor :max_rerun_times
24
24
  attr_accessor :max_thread_number
25
25
 
26
26
  def initialize(options = {})
27
27
  @options = {:thread_number => 4, :case_folder => "./spec/", :report_folder => "./reports/",
28
28
  :filter => {}, :env_list => [], :show_pending => false, :rerun => false,
29
- :single_report => false, :max_rerun_times => 10, :max_thread_number => 16,
30
- :longevity_time => 0}.merge(options)
29
+ :single_report => false, :random_order => false, :random_seed => nil,
30
+ :max_thread_number => 16, :longevity => 0}.merge(options)
31
31
  @thread_number = @options[:thread_number]
32
- @max_rerun_times = @options[:max_rerun_times]
33
32
  @max_thread_number = @options[:max_thread_number]
34
33
 
35
- @longevity = @options[:longevity_time]
36
34
  @case_number = 0
37
35
  @failure_number = 0
38
36
  @pending_number = 0
39
37
  @interrupted = false
38
+ @target = @options[:target]
40
39
  end
41
40
 
42
41
  def run_tests()
@@ -61,21 +60,14 @@ class RspecParallel
61
60
  single_report = @options[:single_report]
62
61
 
63
62
  if !single_report && rerun
64
- @report_folder = get_single_folder("rerun", true)
63
+ @report_folder = get_report_folder(@options[:report_folder], true)
65
64
  end
66
65
 
67
66
  @report_folder = @options[:report_folder] if @report_folder.nil?
68
67
 
69
- if @report_folder.include? "rerun#{@max_rerun_times + 1}"
70
- @return_message = "rerun task has been executed for #{@max_rerun_times}" +
71
- " times, maybe you should start a new run"
72
- puts yellow(@return_message)
73
- return @return_message
74
- end
75
-
76
68
  filter = @options[:filter]
77
69
  if rerun
78
- get_failed_cases
70
+ @queue = get_failed_cases(@options[:report_folder], single_report)
79
71
  else
80
72
  parse_case_list(filter)
81
73
  end
@@ -185,8 +177,8 @@ class RspecParallel
185
177
  end
186
178
  end
187
179
 
188
- #CI: true - update ; default: false - new file
189
- generate_reports(end_time - start_time, rerun && single_report)
180
+ # CI: true - update ; default: false - new file
181
+ generate_reports(@report_folder, end_time - start_time, @case_info_list, @options)
190
182
 
191
183
  @return_message
192
184
  end
@@ -313,6 +305,8 @@ class RspecParallel
313
305
  tags_filter_list = pattern_filter_list
314
306
  end
315
307
 
308
+ tags_filter_list = random_tests(tags_filter_list) if @options[:random_order]
309
+
316
310
  tags_filter_list = reorder_tests(tags_filter_list)
317
311
 
318
312
  tags_filter_list.each { |t|
@@ -320,56 +314,6 @@ class RspecParallel
320
314
  }
321
315
  end
322
316
 
323
- def get_single_folder(folder_prefix, get_next=false)
324
- report_folder = @options[:report_folder]
325
- i = 0
326
- if folder_prefix == "rerun"
327
- folders = Dir.glob("#{report_folder}/rerun*").sort
328
- unless folders.nil? || folders == []
329
- i = folders.last.split("rerun",2).last.to_i
330
- end
331
- end
332
-
333
- if get_next
334
- i = i+1
335
- end
336
-
337
- if i == 0
338
- return report_folder
339
- end
340
-
341
- folder = File.join(report_folder, folder_prefix+"#{i.to_s}")
342
-
343
- end
344
-
345
- def get_failed_cases
346
- if !@options[:single_report]
347
- last_report_folder = get_single_folder("rerun", false)
348
- last_report_file_path = File.join(last_report_folder, "junitResult.xml")
349
- else
350
- last_report_file_path = File.join(@report_folder, "junitResult.xml")
351
- end
352
- unless File.exists? last_report_file_path
353
- puts yellow("can't find result of last run")
354
- exit(1)
355
- end
356
- report_file = File.new(last_report_file_path)
357
- begin
358
- @doc = REXML::Document.new report_file
359
- rescue
360
- puts red("invalid format of report xml")
361
- exit(1)
362
- end
363
-
364
- @doc.elements.each("result/suites/suite/cases/case") do |c|
365
- if c.get_elements("errorDetails")[0]
366
- rerun_cmd = c.get_elements("rerunCommand")[0].text
367
- line = rerun_cmd.split('#')[0].gsub('rspec ', '').strip
368
- @queue << line
369
- end
370
- end
371
- end
372
-
373
317
  def run_task(task, env_extras)
374
318
  cmd = [] # Preparing command for popen
375
319
  cmd << ENV.to_hash.merge(env_extras)
@@ -384,6 +328,22 @@ class RspecParallel
384
328
  output
385
329
  end
386
330
 
331
+ def random_tests(case_list)
332
+ if @options[:random_seed]
333
+ seed = @options[:random_seed].to_i
334
+ else
335
+ seed = Time.now.to_i
336
+ end
337
+ puts yellow("running tests randomly with the seed: #{seed}")
338
+ rand_num = Random.new(seed)
339
+
340
+ random_case_list = []
341
+ case_list.sort_by { rand_num.rand }.each do |c|
342
+ random_case_list << c
343
+ end
344
+ random_case_list
345
+ end
346
+
387
347
  def reorder_tests(case_list)
388
348
  return case_list
389
349
  end
@@ -485,216 +445,4 @@ class RspecParallel
485
445
  result
486
446
  end
487
447
 
488
- def generate_reports(time, update_report)
489
- %x[mkdir #{@report_folder}] unless File.exists? @report_folder
490
- @summary_report = ""
491
-
492
- class_name_list = []
493
- @case_info_list.each do |case_info|
494
- class_name = case_info['class_name']
495
- class_name_list << class_name
496
- end
497
- class_name_list.uniq!
498
- class_name_list.sort!
499
- class_name_list.each do |class_name|
500
- temp_case_info_list = []
501
- @case_info_list.each do |case_info|
502
- if case_info['class_name'] == class_name
503
- temp_case_info_list << case_info
504
- end
505
- end
506
- #CI: should insert into file while single_report == true
507
- generate_single_file_report(temp_case_info_list, @longevity > 1 && @options[:single_report])
508
- end
509
-
510
- if update_report
511
- update_ci_report
512
- end
513
-
514
- summary_end = "</suites>\n"
515
- summary_end += "<duration>#{time}</duration>\n"
516
- summary_end += "<keepLongStdio>false</keepLongStdio>\n"
517
- summary_end += "</result>\n"
518
-
519
-
520
- report_file_path = File.join(@report_folder, 'junitResult.xml')
521
-
522
-
523
- if @longevity > 1 && @options[:single_report]
524
- temp_file = File.open(report_file_path, 'r')
525
- content = temp_file.read
526
- report = content.split("</suites>",2).first
527
- report += @summary_report
528
- temp_file.close
529
- fr = File.new(report_file_path, 'w')
530
- fr.puts report
531
- fr.puts summary_end
532
- elsif update_report
533
- fr = File.new(report_file_path, 'w')
534
- fr.puts @doc
535
- else
536
- fr = File.new(report_file_path, 'w')
537
- fr.puts "<?xml version='1.0' encoding='UTF-8'?>"
538
- fr.puts "<result>"
539
- fr.puts "<suites>"
540
- fr.puts @summary_report
541
- fr.puts summary_end
542
- end
543
- fr.close
544
-
545
- end
546
-
547
- def update_ci_report
548
- @doc.elements.each("result/suites/suite/cases/case") do |c1|
549
- if c1.get_elements("errorDetails")[0]
550
- test_name = c1.get_elements("testName")[0].text
551
- @case_info_list.each do |c2|
552
- if test_name == c2['test_name'].encode({:xml => :attr})
553
- c1.get_elements("duration")[0].text = c2['duration']
554
- if c2['status'] == 'fail'
555
- text = c2['error_message'].gsub('Failure/Error: ', '') + "\n"
556
- text += c2['error_stack_trace'].gsub('# ', '')
557
- c1.get_elements("errorStackTrace")[0].text = text
558
- c1.get_elements("errorDetails")[0].text = c2['error_details']
559
- c1.get_elements("rerunCommand")[0].text = c2['rerun_cmd']
560
- else
561
- c1.delete c1.get_elements("errorDetails")[0]
562
- c1.delete c1.get_elements("errorStackTrace")[0]
563
- c1.delete c1.get_elements("rerunCommand")[0]
564
- end
565
- break
566
- end
567
- end
568
- end
569
- end
570
- end
571
-
572
- def generate_single_file_report(case_info_list, is_update)
573
- return if case_info_list == []
574
- class_name = case_info_list[0]['class_name']
575
- file_name = File.join(@report_folder, class_name.gsub(/:+/, '-') + '.xml')
576
- name = class_name.gsub(':', '_')
577
-
578
- suite_duration = 0.0
579
- fail_num = 0
580
- error_num = 0
581
- pending_num = 0
582
- stdout = ''
583
- stderr = ''
584
- stdout_list = []
585
- stderr_list = []
586
- case_desc_list = []
587
- case_info_list.each do |case_info|
588
- suite_duration += case_info['duration']
589
- stdout_list << case_info['stdout']
590
- stderr_list << case_info['stderr']
591
- case_desc_list << case_info['test_desc']
592
- if case_info['status'] == 'fail'
593
- if case_info['error_message'].include? "expect"
594
- fail_num += 1
595
- else
596
- error_num += 1
597
- end
598
- elsif case_info['status'] == 'pending'
599
- pending_num += 1
600
- end
601
- end
602
- stdout_list.uniq!
603
- stderr_list.uniq!
604
- case_desc_list.sort!
605
- stdout_list.each {|s| stdout += s}
606
- stderr_list.each {|s| stderr += s}
607
-
608
- @summary_report += "<suite>\n"
609
- @summary_report += "<file>#{file_name}</file>\n"
610
- @summary_report += "<name>#{name}</name>\n"
611
- @summary_report += "<stdout>\n"
612
- @summary_report += stdout.encode({:xml => :text}) if stdout.length > 0
613
- @summary_report += "</stdout>\n"
614
- @summary_report += "<stderr>\n"
615
- @summary_report += stderr.encode({:xml => :text}) if stderr.length > 0
616
- @summary_report += "</stderr>\n"
617
- @summary_report += "<duration>#{suite_duration}</duration>\n"
618
- @summary_report += "<cases>\n"
619
-
620
- single_output = ""
621
-
622
- case_desc_list.each do |case_desc|
623
- i = case_info_list.index {|c| c['test_desc'] == case_desc}
624
- case_info = case_info_list[i]
625
- if @longevity == 0
626
- test_name = case_info['test_name']
627
- else
628
- test_name = "#{@longevity}-"+case_info['test_name']
629
- end
630
- test_name += " (PENDING)" if case_info['status'] == 'pending'
631
- test_name = test_name.encode({:xml => :attr})
632
- @summary_report += "<case>\n"
633
- @summary_report += "<duration>#{case_info['duration']}</duration>\n"
634
- @summary_report += "<className>#{class_name}</className>\n"
635
- @summary_report += "<testName>#{test_name}</testName>\n"
636
- @summary_report += "<skipped>#{case_info['status'] == 'pending'}</skipped>\n"
637
-
638
- single_output += "<testcase name=#{test_name} time=\"#{case_info['duration']}\">\n"
639
- single_output += "<skipped/>\n" if case_info['status'] == 'pending'
640
-
641
- if case_info['status'] == 'fail'
642
- @summary_report += "<errorStackTrace>\n"
643
- @summary_report += case_info['error_message'].encode({:xml => :text}).gsub('Failure/Error: ', '')
644
- @summary_report += case_info['error_stack_trace'].encode({:xml => :text}).gsub('# ', '')
645
- @summary_report += "</errorStackTrace>\n"
646
- @summary_report += "<errorDetails>\n"
647
- @summary_report += case_info['error_details'].encode({:xml => :text})
648
- @summary_report += "</errorDetails>\n"
649
- @summary_report += "<rerunCommand>#{case_info['rerun_cmd'].encode({:xml => :text})}</rerunCommand>\n"
650
-
651
- if case_info['error_message'].include? "expected"
652
- type = "RSpec::Expectations::ExpectationNotMetError"
653
- elsif case_info['error_message'].include? "RuntimeError"
654
- type = "RuntimeError"
655
- else
656
- type = "UnknownError"
657
- end
658
- single_output += "<failure type=\"#{type}\" message=#{case_info['error_details'].encode({:xml => :attr})}>\n"
659
- single_output += case_info['error_message'].encode({:xml => :text}).gsub('Failure/Error: ', '')
660
- single_output += case_info['error_stack_trace'].encode({:xml => :text}).gsub('# ', '')
661
- single_output += "</failure>\n"
662
- single_output += "<rerunCommand>#{case_info['rerun_cmd'].encode({:xml => :text})}</rerunCommand>\n"
663
- end
664
- @summary_report += "<failedSince>0</failedSince>\n"
665
- @summary_report += "</case>\n"
666
-
667
- single_output += "</testcase>\n"
668
- end
669
-
670
- @summary_report += "</cases>\n"
671
- @summary_report += "</suite>"
672
- single_end = "<system-out>\n"
673
- single_end += stdout.encode({:xml => :text}) if stdout.length > 0
674
- single_end += "</system-out>\n"
675
- single_end += "<system-err>\n"
676
- single_end += stderr.encode({:xml => :text}) if stderr.length > 0
677
- single_end += "</system-err>\n"
678
- single_end += "</testsuite>\n"
679
-
680
-
681
- if is_update == true
682
- temp_file = File.open(file_name, 'r')
683
- content = temp_file.read
684
- content = content.split("<system-out>",2).first
685
- content += single_output
686
- temp_file.close
687
- ff = File.new(file_name, 'w')
688
- ff.puts content
689
- ff.puts single_end
690
- else
691
- ff = File.new(file_name, 'w')
692
- ff.puts '<?xml version="1.0" encoding="UTF-8"?>'
693
- ff.puts "<testsuite name=\"#{class_name}\" tests=\"#{case_info_list.size}\" time=\"#{suite_duration}\" failures=\"#{fail_num}\" errors=\"#{error_num}\" skipped=\"#{pending_num}\">\n"
694
- ff.puts single_output
695
- ff.puts single_end
696
- end
697
- ff.close
698
-
699
- end
700
448
  end
@@ -12,4 +12,5 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.add_dependency('progressbar', '>=0.11.0')
15
+ s.add_dependency('nokogiri', '>=1.5.2')
15
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_parallel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-19 00:00:00.000000000 Z
12
+ date: 2013-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: progressbar
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 0.11.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: nokogiri
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.5.2
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.5.2
30
46
  description: parallel all rspec examples
31
47
  email: support@vmware.com
32
48
  executables: []
@@ -39,6 +55,7 @@ files:
39
55
  - README.md
40
56
  - lib/rspec_parallel.rb
41
57
  - lib/rspec_parallel/color_helper.rb
58
+ - lib/rspec_parallel/report_helper.rb
42
59
  - lib/rspec_parallel/version.rb
43
60
  - rspec_parallel.gemspec
44
61
  - spec/smoke_test_spec.rb