Class: Beaker::TestSuite
- Inherits:
-
Object
- Object
- Beaker::TestSuite
- Defined in:
- lib/beaker/test_suite.rb
Overview
Defined Under Namespace
Classes: TestSuiteResult
Instance Attribute Summary collapse
-
#fail_mode ⇒ Object
readonly
Returns the value of attribute fail_mode.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
-
#initialize(name, hosts, options, timestamp, fail_mode = :slow) ⇒ TestSuite
constructor
Create TestSuite instance.
-
#log_path(timestamp, name, basedir) ⇒ Object
Create a full file path for output to be written to, using the provided timestamp, name and output directory.
-
#run ⇒ Object
Execute all the TestCase instances and then report the results as both plain text and xml.
-
#run_and_raise_on_failure ⇒ Object
Execute all the TestCases in this suite.
Constructor Details
#initialize(name, hosts, options, timestamp, fail_mode = :slow) ⇒ TestSuite
Create Beaker::TestSuite instance
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 |
# File 'lib/beaker/test_suite.rb', line 317 def initialize(name, hosts, , , fail_mode = :slow) @logger = [:logger] @test_cases = [] @test_files = [name] @name = name.to_s.gsub(/\s+/, '-') @hosts = hosts @run = false @options = @fail_mode = fail_mode || @options[:fail_mode] @test_suite_results = TestSuiteResult.new(@options, name) @timestamp = report_and_raise(@logger, RuntimeError.new("#{@name}: no test files found..."), "TestSuite: initialize") if @test_files.empty? rescue => e report_and_raise(@logger, e, "TestSuite: initialize") end |
Instance Attribute Details
#fail_mode ⇒ Object (readonly)
Returns the value of attribute fail_mode.
303 304 305 |
# File 'lib/beaker/test_suite.rb', line 303 def fail_mode @fail_mode end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
303 304 305 |
# File 'lib/beaker/test_suite.rb', line 303 def name @name end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
303 304 305 |
# File 'lib/beaker/test_suite.rb', line 303 def @options end |
Instance Method Details
#log_path(timestamp, name, basedir) ⇒ Object
Create a full file path for output to be written to, using the provided timestamp, name and output directory.
420 421 422 423 424 425 426 427 428 429 430 431 432 433 |
# File 'lib/beaker/test_suite.rb', line 420 def log_path(, name, basedir) log_dir = File.join(basedir, .strftime("%F_%H_%M_%S")) unless File.directory?(log_dir) then FileUtils.mkdir_p(log_dir) latest = File.join(basedir, "latest") if !File.exist?(latest) or File.symlink?(latest) then File.delete(latest) if File.exist?(latest) File.symlink(File.basename(log_dir), latest) end end File.join(basedir, 'latest', name) end |
#run ⇒ Object
Execute all the Beaker::TestCase instances and then report the results as both plain text and xml. The text result is reported to a newly created run log. Execution is dependent upon the fail_mode. If mode is :fast then stop running any additional Beaker::TestCase instances after first failure, if mode is :slow continue execution no matter what Beaker::TestCase results are.
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
# File 'lib/beaker/test_suite.rb', line 339 def run @run = true start_time = Time.now #Create a run log for this TestSuite. run_log = log_path(@timestamp, "#{@name}-run.log", @options[:log_dir]) @logger.add_destination(run_log) # This is an awful hack to maintain backward compatibility until tests # are ported to use logger. Still in use in PuppetDB tests Beaker.const_set(:Log, @logger) unless defined?( Log ) @test_suite_results.start_time = start_time @test_suite_results.total_tests = @test_files.length @test_files.each do |test_file| @logger.notify "Begin #{test_file}" start = Time.now test_case = TestCase.new(@hosts, @logger, , test_file).run_test duration = Time.now - start @test_suite_results.add_test_case(test_case) @test_cases << test_case state = test_case.test_status == :skip ? 'skipp' : test_case.test_status msg = "#{test_file} #{state}ed in %.2f seconds" % duration.to_f case test_case.test_status when :pass @logger.success msg when :skip @logger.debug msg when :fail @logger.error msg break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure when :error @logger.warn msg break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure end end @test_suite_results.stop_time = Time.now # REVISIT: This changes global state, breaking logging in any future runs # of the suite – or, at least, making them highly confusing for anyone who # has not studied the implementation in detail. --daniel 2011-03-14 @test_suite_results.summarize( Logger.new(log_path(@timestamp, "#{name}-summary.txt", @options[:log_dir]), STDOUT) ) @test_suite_results.write_junit_xml( log_path(@timestamp, @options[:xml_file], @options[:xml_dir]), File.join(@options[:project_root], @options[:xml_stylesheet]) ) #All done with this run, remove run log @logger.remove_destination(run_log) # Allow chaining operations... return self end |
#run_and_raise_on_failure ⇒ Object
Execute all the TestCases in this suite. This is a wrapper that catches any failures generated during TestSuite::run.
394 395 396 397 398 399 400 401 402 403 404 405 |
# File 'lib/beaker/test_suite.rb', line 394 def run_and_raise_on_failure begin run return self if @test_suite_results.success? rescue => e #failed during run report_and_raise(@logger, e, "TestSuite :run_and_raise_on_failure") else #failed during test report_and_raise(@logger, RuntimeError.new("Failed while running the #{name} suite"), "TestSuite: report_and_raise_on_failure") end end |