自动化运行脚本
require 'test/unit'
require 'test/unit/testcase'
require 'test/unit/assertions.rb'
require 'test/unit/testresult'
require 'test/unit/testsuite'
require 'test/unit/ui/testrunnermediator'
include Test
include Unit
include Assertions
require FireWatir
module Test
module Unit
class TestResult
def initialize
@run_count=0
@assertion_count = 0
@report = Array.new
@failures = Array.new
@errors = Array.new
@passedes = Array.new
end
def add_passedes(passed)
@passedes << passed
end
def add_report(report)
@report << report
end
def run_count
return @report.size
end
#filter TestResult
#delete test_zend method from @failures , @errors, @report and @passedes array
def filter_TestResult
failures = Array.new
@failures.size.times { |i|
failures << @failures[i] unless @failures[i].test_name =="test_zend"
}
@failures = failures
errors = Array.new
@errors.size.times { |i|
errors << @errors[i] unless @errors[i].test_name =="test_zend"
}
@errors = errors
report = Array.new
@report.size.times { |i|
report << @report[i] unless @report[i].test_name =="test_zend"
}
@report = report
passedes = Array.new
@passedes.size.times { |i|
passedes << @passedes[i] unless @passedes[i].test_name =="test_zend"
}
@passedes = passedes
end
def total_report
report = "Totle : #{run_count} \n"+
"Passed : #{run_count-failure_count-error_count} \n"+
"Failed : #{failure_count} \n"+
"Error : #{error_count} \n" +
"Pass rate: #{(run_count-failure_count-error_count)*100/run_count}%\n"
return report
end
#puts error and failure info
def errorinfo
result = "Totle : #{run_count} tests, #{assertion_count} assertions, #{failure_count} failures, #{error_count} errors \n"
if @failures.length > 0
result = result + "Failures : #{failure_count} \n"
@failures.length.times do |i|
result = result +" "+ @failures[i].to_s + "\n \n"
end
end
if @errors.length >0
result = result + "Errors : #{error_count} \n"
@errors.length.times do |i|
result = result +" "+ @errors[i].to_s + "\n \n"
end
end
result
end
def passedinfo
result = nil
if @passedes.length > 0
result = "Passed : #{run_count-failure_count-error_count} \n"
@passedes.length.times do |i|
result = result +" "+ @passedes[i].to_s + "\n \n"
end
end
result
end
def reportinfo
result = ""
@report.length.times do |i|
result = result + " "+ @report[i].to_s + "\n \n"
end
result
end
end
class TestSuite
def initialize(name="Unnamed TestSuite")
@name = name
@tests = []
@init = false
end
def run(result, &progress_block)
yield(STARTED, name)
@tests.each do |test|
if test.class != Test::Unit::TestSuite && @init == false
begin
test.class_setup
puts "init"
puts @init
@init = true
rescue Exception
@init = false
test.class_teardown
end
end
test.run(result, &progress_block)# if test.class == Test::Unit::TestSuite || @init == true
end
begin
@tests[0].class_teardown
rescue
nil
end
yield(FINISHED, name)
end
end
class MyTestCase < TestCase
if $browser_type == "ie"
include Watir::Exception
include Watir
elsif $browser_type == "Widows Internet Explorer"
include FireWatir
include FireWatir::Exception
end
@@res = nil
def initialize(test_method_name)
@method_name = test_method_name
@test_passed = true
# super(test_method_name)
#@single1= false
# @single2 = false
end
attr_reader(:method_name)
# Rolls up all of the test* methods in the fixture into
# one suite, creating a new instance of the fixture for
# each method.
def self.suite
method_names = public_instance_methods(true)
tests = method_names.delete_if {|method_name| method_name !~ /^test./}
suite = TestSuite.new(name)
tests.sort.each do
|test|
catch(:invalid_test) do
suite << new(test)
end
end
return suite
end
# this method will br run before class .and only run one times (this method be called by TestSuite.run )
# in this method can not use assert
# [example] :
# def class_setup
# $browser = TestGrid.createBrowser
# login($browser,Test_site,User_name,Passwd)
# end
#
def class_setup
end
# this method will br run after class .and only run one times (this method be called by TestSuite.run )
# in this method can not use assert
# [example] :
# def class_teardown
# $browser.findElement(:text, "Log Out","link").click if $browser.findElement(:text, "Log Out","link") != nil
# sleep PageWaitTime
# $browser.close
# end
#
def class_teardown
end
def run(result)
yield(STARTED, name)
@_result = result
passed = true
begin
# dogroup
setup
puts "start #{@method_name}................................. "
__send__(@method_name)
rescue AssertionFailedError => e
passed = false
add_failure(e.message, e.backtrace)
rescue StandardError, ScriptError
passed = false
add_error($!)
ensure
begin
teardown
rescue AssertionFailedError => e
passed = false
add_failure(e.message, e.backtrace)
rescue StandardError, ScriptError
passed = false
add_error($!)
end
end
add_passed(@method_name,self.class.name) if passed
result.add_run
@@res = result
puts "_________________________" + @test_passed.to_s + "____________________________"
yield(FINISHED, name)
end
# add failure test case to Result
def add_failure(message, all_locations=caller())
@test_passed = false
@_result.add_failure(Failure.new(name, filter_backtrace(all_locations), message))
@_result.add_report(Report.new(@method_name,self.class.name,"Failure",message))
end
def add_error(exception)
@test_passed = false
@_result.add_error(Error.new(name, exception))
@_result.add_report(Report.new(@method_name,self.class.name,"Error","#{exception.class.name}: #{exception.message}"))
end
def add_passed(method_name,location)
@test_passed = true
# @_result.add_passedes(Passed.new(@method_name ,self.class.name))
@_result.add_passedes(Passed.new(method_name ,location))
@_result.add_report(Report.new(method_name,location,"Passed"))
end
private :add_passed
# print report info .(used in UnitTest)
# [example:]
# def test_zend
# caseEnd
# end
#
def casesEnd
@@res.filter_TestResult
puts "===============================================================================Report=========================================================================="
puts @@res.total_report#to_s
puts " CaseID Class Platform Result Comment "
puts @@res.reportinfo
puts"=================================================================================End============================================================================"
puts" "
puts"===============================================================================ErrorInfo=========================================================================="
puts @@res.errorinfo
puts"=================================================================================End=============================================================================="
# $browser.findElement(:text, "Log Out","link").click if $browser.findElement(:text, "Log Out","link") != nil
# sleep PageWaitTime
# $browser.close
# report_to_file($report_file)
end
#write report to file
#used in MyTestCase
def report_to_file(filename)
if filename != nil
@@res.filter_TestResult
logfile = File.new(filename,"w")
logfile.puts "===============================================================================Report=========================================================================="
logfile.puts @@res.total_report#to_s
logfile.puts " CaseID Class Platform Result Comment "
logfile.puts @@res.reportinfo
logfile.puts"=================================================================================End============================================================================"
logfile.puts" "
logfile.puts"===============================================================================ErrorInfo=========================================================================="
logfile.puts @@res.errorinfo
logfile.puts"=================================================================================End=============================================================================="
logfile.close
end
end
end
class Passed
def initialize(test_name, location)
@test_name = test_name
@location = location
end
attr_reader(:test_name, :location)
def to_s
result = @test_name
blanks =' '
(60 - @test_name.size).times { |i| blanks = blanks + " " }
result = result + blanks + @location
blanks =' '
(50 - @location.size).times { |i| blanks = blanks + " " }
result = result + blanks + $browser_type
blanks =' '
(20 - $browser_type.size).times { |i| blanks = blanks + " " }
result = result + blanks + "Pass"
end
end
#test case report
class Report
def initialize(test_name, location ,result , error_info = "")
@test_name = test_name
@location = location
@result = result
@error_info = error_info
end
attr_reader(:test_name, :location,:result,:error_info)
def to_s
result = @test_name
blanks =' '
(50 - @test_name.size).times { |i| blanks = blanks + " " }
result = result + blanks + @location
blanks =' '
(50 - @location.size).times { |i| blanks = blanks + " " }
result = result + blanks + $browser_type
blanks =' '
(20 - $browser_type.size).times { |i| blanks = blanks + " " }
result = result + blanks + @result
blanks =' '
(20 - @result.size).times { |i| blanks = blanks + " " }
result = result + blanks + @error_info
end
end
module UI
class TestRunnerMediator
def format_result(result)
result.filter_TestResult
puts "===============================================================================Report=========================================================================="
puts result.total_report#to_s
puts " CaseID Class Platform Result Comment "
puts result.reportinfo
puts"=================================================================================End============================================================================"
puts" "
puts"===============================================================================ErrorInfo=========================================================================="
puts result.errorinfo
puts"=================================================================================End=============================================================================="
# $browser.findElement(:text, "Log Out","link").click if $browser.findElement(:text, "Log Out","link") != nil
# sleep PageWaitTime
# $browser.close
# report_to_file($report_file)
end
# Runs the suite the TestRunnerMediator was created
# with.
def run_suite
Unit.run = true
begin_time = Time.now
notify_listeners(RESET, @suite.size)
result = create_result
notify_listeners(STARTED, result)
result_listener = result.add_listener(TestResult::CHANGED) do |updated_result|
notify_listeners(TestResult::CHANGED, updated_result)
end
fault_listener = result.add_listener(TestResult::FAULT) do |fault|
notify_listeners(TestResult::FAULT, fault)
end
@suite.run(result) do |channel, value|
notify_listeners(channel, value)
end
result.remove_listener(TestResult::FAULT, fault_listener)
result.remove_listener(TestResult::CHANGED, result_listener)
end_time = Time.now
elapsed_time = end_time - begin_time
notify_listeners(FINISHED, elapsed_time) #"Finished in #{elapsed_time} seconds.")
#return result
format_result(result)
return result
end
end
end
end
end
require 'pathname'
path = Pathname.new(File.dirname(__FILE__)).realpath
$: << path
require 'watir'
require 'test/unit'
require 'NewTestCase'
$browser_type = "ie" # $browser_type = "firefox"
class TC_MyTest < Test::Unit::MyTestCase
Test_site = "http://mail.163.com/"
def class_setup
$browser = Watir::IE.new
puts " go to the test site: " + Test_site
$browser.goto Test_site
#login(username,passwd)
end
def class_teardown
#logout($browser)
end
def setup
puts "setup"
end
def teardown
puts "teardown"
end
#for print report ,
# def test_zend
#you can also use report_to_file(filename)
# casesEnd
# end
def test_a1_page_check
#
puts "test_a1_page_check"
end
def test_a2_page_action
puts "test_a2_page_action"
end
end
TAG:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 31063
- 日志数: 71
- 建立时间: 2009-09-03
- 更新时间: 2012-02-11