testability-driver-runner 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tdrunner.rb +5 -1
- data/lib/tdrunner_command_tool.rb +1 -1
- data/lib/tdrunner_cucumber.rb +1 -0
- data/lib/tdrunner_monitor.rb +23 -0
- data/lib/tdrunner_profile.rb +16 -0
- data/lib/tdrunner_test_unit.rb +182 -16
- data/rakefile +3 -4
- data/websi/app/controllers/report_editor/test_run/cases_controller.rb +1 -1
- metadata +8 -10
data/lib/tdrunner.rb
CHANGED
@@ -72,7 +72,7 @@ module TDRunner
|
|
72
72
|
|
73
73
|
elsif args[0]=='--version'
|
74
74
|
args.shift
|
75
|
-
puts '1.
|
75
|
+
puts '1.2.0'
|
76
76
|
|
77
77
|
else
|
78
78
|
break
|
@@ -190,6 +190,7 @@ module TDRunner
|
|
190
190
|
end
|
191
191
|
|
192
192
|
write_failed_sip_file($tdrunner_parameters)
|
193
|
+
write_recorded_sip_file($tdrunner_parameters)
|
193
194
|
end
|
194
195
|
|
195
196
|
#Method for displaying tdrunner help in commandline
|
@@ -290,6 +291,9 @@ module TDRunner
|
|
290
291
|
puts "-t execution_profile"
|
291
292
|
puts "\t\tCreate execution profile of failed Test::Unit tests"
|
292
293
|
|
294
|
+
puts "-r execution_profile"
|
295
|
+
puts "\t\tCreate execution profile recording of executed tests"
|
296
|
+
|
293
297
|
puts "--teardown\tRun test unit teardown only when the testcase is failed."
|
294
298
|
|
295
299
|
puts "--ordered\tUse with execution profile to run tests as they are ordered"
|
@@ -100,7 +100,7 @@ module TDRunner
|
|
100
100
|
begin
|
101
101
|
#paramfile = File.new(paramfilename)
|
102
102
|
#sutlist = paramfile.readlines.join.scan(/<sut +id *= *"([^"]+)"/).map{|i| i[0]}.join(' ')
|
103
|
-
sutlist =
|
103
|
+
sutlist = TDriver.suts.reject { |item| item.to_s == 'sut_generic' }.join(' ')
|
104
104
|
rescue
|
105
105
|
#sutlist = "Failed to read '#{paramfilename}': #{$!.to_s.gsub(/\s+/, ' ')}"
|
106
106
|
sutlist = "ERROR (#{$!.to_s.gsub(/\s+/, ' ')})"
|
data/lib/tdrunner_cucumber.rb
CHANGED
@@ -45,6 +45,7 @@ module TDRunner
|
|
45
45
|
remove_excluded_files_from(potential_feature_files)
|
46
46
|
lpt_feature_files = potential_feature_files.sort
|
47
47
|
lpt_feature_files,content_arr=randomize_features(lpt_feature_files,$tdrunner_parameters)
|
48
|
+
record_test_to_recorder_profile('cucumber',lpt_feature_files)
|
48
49
|
lpt_feature_files
|
49
50
|
end
|
50
51
|
end
|
data/lib/tdrunner_monitor.rb
CHANGED
@@ -89,6 +89,15 @@ module TDRunner
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
def write_recorded_sip_file(tdrunner_parameters)
|
93
|
+
if($recorded_tests!=nil && tdrunner_parameters.recorded_execution_profile != nil && !$recorded_tests.empty?)
|
94
|
+
file = File.open(tdrunner_parameters.recorded_execution_profile.to_s,'w')
|
95
|
+
$recorded_tests.flatten.each { |x| file.write(x.to_s+"\n")}
|
96
|
+
file.close
|
97
|
+
puts 'Recorded execution profile created: '+ tdrunner_parameters.recorded_execution_profile
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
92
101
|
def trap_pause
|
93
102
|
puts "\nExecution paused...\n"
|
94
103
|
puts "\nStop execution Yes or No?:"
|
@@ -539,6 +548,20 @@ module TDRunner
|
|
539
548
|
"#{m}m#{'%.3f' % s}s"
|
540
549
|
end
|
541
550
|
|
551
|
+
def record_test_to_recorder_profile(framework,record)
|
552
|
+
if $tdrunner_parameters.recorded_execution_profile
|
553
|
+
$recorded_tests ||= Array.new
|
554
|
+
case framework
|
555
|
+
when 'cucumber'
|
556
|
+
record.each do |feature|
|
557
|
+
$recorded_tests << "#{feature}=1"
|
558
|
+
end
|
559
|
+
when 'test_unit'
|
560
|
+
$recorded_tests << "#{record}=1"
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
542
565
|
def wait_for_starttime(tdrunner_parameters)
|
543
566
|
#If the start time is defined then only start execution at this time
|
544
567
|
if tdrunner_parameters.start_time!=nil
|
data/lib/tdrunner_profile.rb
CHANGED
@@ -125,6 +125,7 @@ module TDRunner
|
|
125
125
|
@tdrunner_combine_report=nil
|
126
126
|
@start_time=nil
|
127
127
|
@failed_execution_profile=nil
|
128
|
+
@recorded_execution_profile=nil
|
128
129
|
parse_tdrunner_parameters(args)
|
129
130
|
end
|
130
131
|
|
@@ -194,6 +195,7 @@ module TDRunner
|
|
194
195
|
make_execution_profile=false
|
195
196
|
combine_report_defined=false
|
196
197
|
make_failed_execution_profile_defined=false
|
198
|
+
make_recorded_execution_profile_defined=false
|
197
199
|
parameters_contains_framework_command=check_if_parameters_contain_a_framework_command(args)
|
198
200
|
|
199
201
|
args.each do |value|
|
@@ -248,6 +250,10 @@ module TDRunner
|
|
248
250
|
make_failed_execution_profile_defined=false
|
249
251
|
@failed_execution_profile=value
|
250
252
|
end
|
253
|
+
if make_recorded_execution_profile_defined==true
|
254
|
+
make_recorded_execution_profile_defined=false
|
255
|
+
@recorded_execution_profile=value
|
256
|
+
end
|
251
257
|
|
252
258
|
if value.to_s == '--teardown'
|
253
259
|
@tdrunner_teardown=true
|
@@ -279,6 +285,9 @@ module TDRunner
|
|
279
285
|
if value.to_s == '-t'
|
280
286
|
make_failed_execution_profile_defined=true
|
281
287
|
end
|
288
|
+
if value.to_s == '-r'
|
289
|
+
make_recorded_execution_profile_defined=true
|
290
|
+
end
|
282
291
|
|
283
292
|
end
|
284
293
|
|
@@ -316,6 +325,10 @@ module TDRunner
|
|
316
325
|
failed_profile_location=create_failed_sip(@failed_execution_profile)
|
317
326
|
@failed_execution_profile=failed_profile_location
|
318
327
|
end
|
328
|
+
if @recorded_execution_profile!=nil
|
329
|
+
recorded_profile_location=create_failed_sip(@recorded_execution_profile)
|
330
|
+
@recorded_execution_profile=recorded_profile_location
|
331
|
+
end
|
319
332
|
end
|
320
333
|
def create_failed_sip(failed_sip_profile)
|
321
334
|
sip_file=nil
|
@@ -406,6 +419,9 @@ module TDRunner
|
|
406
419
|
def failed_execution_profile()
|
407
420
|
@failed_execution_profile
|
408
421
|
end
|
422
|
+
def recorded_execution_profile()
|
423
|
+
@recorded_execution_profile
|
424
|
+
end
|
409
425
|
def tdrunner_ordered()
|
410
426
|
@tdrunner_ordered
|
411
427
|
end
|
data/lib/tdrunner_test_unit.rb
CHANGED
@@ -174,6 +174,7 @@ begin
|
|
174
174
|
current_run_time=Time.now-run_start_time
|
175
175
|
puts 'Run time: '+ format_duration(current_run_time)
|
176
176
|
#end SIERRA runner
|
177
|
+
|
177
178
|
|
178
179
|
result.remove_listener(Test::Unit::TestResult::FAULT, fault_listener)
|
179
180
|
result.remove_listener(Test::Unit::TestResult::CHANGED, result_listener)
|
@@ -267,6 +268,129 @@ begin
|
|
267
268
|
module Test
|
268
269
|
module Unit
|
269
270
|
class TestCase
|
271
|
+
|
272
|
+
DESCENDANTS = []
|
273
|
+
|
274
|
+
class << self
|
275
|
+
def inherited(sub_class)
|
276
|
+
DESCENDANTS << sub_class
|
277
|
+
end
|
278
|
+
|
279
|
+
# Rolls up all of the test* methods in the fixture into
|
280
|
+
# one suite, creating a new instance of the fixture for
|
281
|
+
# each method.
|
282
|
+
def suite
|
283
|
+
method_names = public_instance_methods(true).collect {|name| name.to_s}
|
284
|
+
tests = method_names.delete_if {|method_name| method_name !~ /^test./}
|
285
|
+
suite = TestSuite.new(name, self)
|
286
|
+
tests.sort.each do |test|
|
287
|
+
catch(:invalid_test) do
|
288
|
+
suite << new(test)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
if suite.empty?
|
292
|
+
catch(:invalid_test) do
|
293
|
+
suite << new("default_test")
|
294
|
+
end
|
295
|
+
end
|
296
|
+
suite
|
297
|
+
end
|
298
|
+
|
299
|
+
# Called before every test case runs. Can be used
|
300
|
+
# to set up fixture information used in test case
|
301
|
+
# scope.
|
302
|
+
#
|
303
|
+
# Here is an example test case:
|
304
|
+
# class TestMyClass < Test::Unit::TestCase
|
305
|
+
# class << self
|
306
|
+
# def startup
|
307
|
+
# ...
|
308
|
+
# end
|
309
|
+
# end
|
310
|
+
#
|
311
|
+
# def setup
|
312
|
+
# ...
|
313
|
+
# end
|
314
|
+
#
|
315
|
+
# def test_my_class1
|
316
|
+
# ...
|
317
|
+
# end
|
318
|
+
#
|
319
|
+
# def test_my_class2
|
320
|
+
# ...
|
321
|
+
# end
|
322
|
+
# end
|
323
|
+
#
|
324
|
+
# Here is a call order:
|
325
|
+
# * startup
|
326
|
+
# * setup
|
327
|
+
# * test_my_class1 (or test_my_class2)
|
328
|
+
# * setup
|
329
|
+
# * test_my_class2 (or test_my_class1)
|
330
|
+
#
|
331
|
+
# Note that you should not assume test order. Tests
|
332
|
+
# should be worked in any order.
|
333
|
+
def startup
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
# Called after every test case runs. Can be used to tear
|
338
|
+
# down fixture information used in test case scope.
|
339
|
+
#
|
340
|
+
# Here is an example test case:
|
341
|
+
# class TestMyClass < Test::Unit::TestCase
|
342
|
+
# class << self
|
343
|
+
# def shutdown
|
344
|
+
# ...
|
345
|
+
# end
|
346
|
+
# end
|
347
|
+
#
|
348
|
+
# def teardown
|
349
|
+
# ...
|
350
|
+
# end
|
351
|
+
#
|
352
|
+
# def test_my_class1
|
353
|
+
# ...
|
354
|
+
# end
|
355
|
+
#
|
356
|
+
# def test_my_class2
|
357
|
+
# ...
|
358
|
+
# end
|
359
|
+
# end
|
360
|
+
#
|
361
|
+
# Here is a call order:
|
362
|
+
# * test_my_class1 (or test_my_class2)
|
363
|
+
# * teardown
|
364
|
+
# * test_my_class2 (or test_my_class1)
|
365
|
+
# * teardown
|
366
|
+
# * shutdown
|
367
|
+
#
|
368
|
+
# Note that you should not assume test order. Tests
|
369
|
+
# should be worked in any order.
|
370
|
+
def shutdown
|
371
|
+
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
attr_reader :method_name
|
376
|
+
|
377
|
+
# Creates a new instance of the fixture for running the
|
378
|
+
# test represented by test_method_name.
|
379
|
+
def initialize(test_method_name)
|
380
|
+
throw :invalid_test unless respond_to?(test_method_name)
|
381
|
+
test_method = method(test_method_name)
|
382
|
+
throw :invalid_test if test_method.arity > 0
|
383
|
+
if test_method.respond_to?(:owner)
|
384
|
+
if test_method.owner.class != Module and
|
385
|
+
self.class != test_method.owner
|
386
|
+
throw :invalid_test
|
387
|
+
end
|
388
|
+
end
|
389
|
+
@method_name = test_method_name
|
390
|
+
@test_passed = true
|
391
|
+
@interrupted = false
|
392
|
+
end
|
393
|
+
|
270
394
|
# Runs the individual test method represented by this
|
271
395
|
# instance of the fixture, collecting statistics, failures
|
272
396
|
# and errors in result.
|
@@ -276,23 +400,37 @@ begin
|
|
276
400
|
@_result = result
|
277
401
|
@case_contents_array=case_contents_array
|
278
402
|
test_skipped = false
|
403
|
+
skip_text = ""
|
404
|
+
|
279
405
|
begin
|
280
406
|
|
281
|
-
if
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
407
|
+
if skip_sequential = TDriver::Parameter[ :runner_sequence_skip, "false" ] == "true"
|
408
|
+
|
409
|
+
fails_now = tdriver_get_sequential_fails
|
410
|
+
fail_treshold = TDriver::Parameter[ :runner_sequence_treshold, 1 ].to_i
|
411
|
+
skip_text = "Not run due to sequential failures over treshold (#{ fail_treshold })."
|
412
|
+
test_skipped = fails_now > fail_treshold
|
413
|
+
|
414
|
+
end
|
415
|
+
|
416
|
+
if !test_skipped
|
417
|
+
if TDriver::Parameter[ :runner_skip_enabled, "false" ] == "true"
|
288
418
|
|
289
|
-
|
419
|
+
fail_execs = tdriver_get_current_by_status( "failed" )
|
420
|
+
pass_execs = tdriver_get_current_by_status( "passed" )
|
421
|
+
|
422
|
+
fail_execs = fail_execs.respond_to?( :count ) ? fail_execs.count : 0
|
423
|
+
pass_execs = pass_execs.respond_to?( :count ) ? pass_execs.count : 0
|
424
|
+
|
425
|
+
skip_treshold = TDriver::Parameter[ :runner_skip_treshold, "5" ].to_i
|
426
|
+
|
427
|
+
if fail_execs + pass_execs >= skip_treshold and fail_execs + pass_execs > 0
|
428
|
+
skip_rate = TDriver::Parameter[ :runner_skip_fail_rate, "66" ].to_i / 100.0
|
429
|
+
skip_text = "Not run due to consistent failures exceeding maximum fail rate(#{ skip_rate } %)."
|
430
|
+
test_skipped = fail_execs/(fail_execs + pass_execs).to_f >= skip_rate
|
431
|
+
end
|
290
432
|
|
291
|
-
if fail_execs + pass_execs >= skip_treshold and fail_execs + pass_execs > 0
|
292
|
-
skip_rate = MobyUtil::Parameter[ :runner_skip_fail_rate, "66" ].to_i / 100.0
|
293
|
-
test_skipped = fail_execs/(fail_execs + pass_execs).to_f >= skip_rate
|
294
433
|
end
|
295
|
-
|
296
434
|
end
|
297
435
|
|
298
436
|
if !test_skipped
|
@@ -313,8 +451,8 @@ begin
|
|
313
451
|
|
314
452
|
else
|
315
453
|
|
316
|
-
tdriver_report_log(
|
317
|
-
tdriver_report_set_test_case_status(
|
454
|
+
tdriver_report_log( skip_text )
|
455
|
+
tdriver_report_set_test_case_status( TDriver::Parameter[ :runner_skip_status, "not run" ] )
|
318
456
|
|
319
457
|
end
|
320
458
|
|
@@ -347,17 +485,26 @@ begin
|
|
347
485
|
raise if PASSTHROUGH_EXCEPTIONS.include? $!.class
|
348
486
|
add_error($!)
|
349
487
|
end
|
350
|
-
|
488
|
+
end
|
351
489
|
@case_contents_array[current_index]=[@case_contents_array[current_index].at(0),@case_contents_array[current_index].at(1),@case_contents_array[current_index].at(2),@test_passed] if @case_contents_array!=nil && status==nil
|
352
490
|
end
|
353
491
|
result.add_run
|
354
492
|
yield(FINISHED, name)
|
355
493
|
end
|
494
|
+
|
356
495
|
end
|
357
496
|
class TestSuite
|
358
497
|
include TDRunner::TDRunnerMonitor
|
359
498
|
# Runs the tests and/or suites contained in this
|
360
499
|
# TestSuite.
|
500
|
+
|
501
|
+
# Creates a new TestSuite with the given name.
|
502
|
+
def initialize(name="Unnamed TestSuite", test_case=nil)
|
503
|
+
@name = name
|
504
|
+
@tests = []
|
505
|
+
@test_case = test_case
|
506
|
+
end
|
507
|
+
|
361
508
|
def parse_parameter_string(string)
|
362
509
|
s = string
|
363
510
|
|
@@ -387,13 +534,15 @@ begin
|
|
387
534
|
end
|
388
535
|
def run(result,arguments=nil,case_contents_array=nil, current_index=nil,status=nil, &progress_block)
|
389
536
|
yield(STARTED, name)
|
537
|
+
run_startup(result)
|
390
538
|
@tests,@case_contents_array=randomize_test_cases(@tests,$tdrunner_parameters)
|
391
539
|
@test_level_and_result=Array.new if @test_level_and_result==nil
|
392
540
|
current_index=0
|
393
541
|
previous_test_level=0
|
394
542
|
previous_test_level_result=nil
|
395
543
|
current_test_level=0
|
396
|
-
@tests.each do |test|
|
544
|
+
@tests.each do |test|
|
545
|
+
record_test_to_recorder_profile('test_unit',test)
|
397
546
|
parameters_arr=nil
|
398
547
|
eval_parameters_arr=[]
|
399
548
|
if @case_contents_array!=nil
|
@@ -450,8 +599,25 @@ begin
|
|
450
599
|
current_index+=1
|
451
600
|
end
|
452
601
|
add_failed_testunit_tests($tdrunner_parameters, @case_contents_array)
|
602
|
+
run_shutdown(result)
|
453
603
|
yield(FINISHED, name)
|
454
604
|
end
|
605
|
+
|
606
|
+
private
|
607
|
+
def run_startup(result)
|
608
|
+
return if @test_case.nil? or !@test_case.respond_to?(:startup)
|
609
|
+
|
610
|
+
@test_case.startup
|
611
|
+
|
612
|
+
end
|
613
|
+
|
614
|
+
def run_shutdown(result)
|
615
|
+
return if @test_case.nil? or !@test_case.respond_to?(:shutdown)
|
616
|
+
|
617
|
+
@test_case.shutdown
|
618
|
+
|
619
|
+
end
|
620
|
+
|
455
621
|
end
|
456
622
|
end
|
457
623
|
end
|
data/rakefile
CHANGED
@@ -56,8 +56,7 @@ def make_spec
|
|
56
56
|
s.add_dependency("testability-driver")
|
57
57
|
s.add_dependency("rails", ">=2.3.5")
|
58
58
|
s.add_dependency("zippy")
|
59
|
-
s.add_dependency("sqlite3-ruby"
|
60
|
-
|
59
|
+
s.add_dependency("sqlite3-ruby")
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
@@ -87,7 +86,7 @@ task :gem_install do
|
|
87
86
|
puts "### Installing GEM #{GEM_NAME} ###"
|
88
87
|
puts "#########################################################"
|
89
88
|
tdrunner_gem = "tdrunner-#{@__gem_version}.gem"
|
90
|
-
if /win/ =~ RUBY_PLATFORM
|
89
|
+
if /win/ =~ RUBY_PLATFORM || /mingw32/ =~ RUBY_PLATFORM
|
91
90
|
cmd = "gem install pkg\\*.gem --LOCAL"
|
92
91
|
else
|
93
92
|
cmd = "gem install pkg/*.gem --LOCAL"
|
@@ -106,7 +105,7 @@ task :gem_uninstall do
|
|
106
105
|
puts "#########################################################"
|
107
106
|
tdrunner_gem = "tdrunner-#{@__gem_version}.gem"
|
108
107
|
FileUtils.rm(Dir.glob('pkg/*gem'))
|
109
|
-
if /win/ =~ RUBY_PLATFORM
|
108
|
+
if /win/ =~ RUBY_PLATFORM || /mingw32/ =~ RUBY_PLATFORM
|
110
109
|
cmd = "del /F /Q pkg\\"
|
111
110
|
failure = system(cmd)
|
112
111
|
#raise "deleting #{GEM_NAME} in pkg folder failed" if (failure != true) or ($? != 0)
|
@@ -229,7 +229,7 @@ class ReportEditor::TestRun::CasesController < ApplicationController
|
|
229
229
|
end
|
230
230
|
|
231
231
|
def test_case_comment(test_case)
|
232
|
-
pass_statuses=
|
232
|
+
pass_statuses=TDriver::Parameter[ :report_passed_statuses, "passed" ].split('|')
|
233
233
|
status=test_case[7].to_s
|
234
234
|
comment=nil
|
235
235
|
if pass_statuses.include?(status)==false
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testability-driver-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 1.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Testability Driver team
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-08 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: testability-driver
|
@@ -69,12 +69,10 @@ dependencies:
|
|
69
69
|
requirements:
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
hash:
|
72
|
+
hash: 3
|
73
73
|
segments:
|
74
|
-
-
|
75
|
-
|
76
|
-
- 5
|
77
|
-
version: 1.2.5
|
74
|
+
- 0
|
75
|
+
version: "0"
|
78
76
|
type: :runtime
|
79
77
|
version_requirements: *id004
|
80
78
|
description: Testability Driver test runner
|