自动化运行脚本

上一篇 / 下一篇  2009-11-30 15:46:25

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:

 

评分:0

我来说两句

Open Toolbar