发布新日志

  • ruby中eval方法的使用

    2009-03-28 18:04:55

    有时候要一组字符串能能够动态地执行,ruby中的eval方法就提供了这样的功能

    语法:
    eval( 可执行字符串)

    使用举例:
    a = 1
    b="true"
    c="false"
    str ="
    if a==1 then
    puts '输出:#{b}'
    else
    puts '输出:#{c}'
    end
    "
    eval(str)

    这样就输出为:输出:true
  • ruby 中访问mysql的一个例子

    2009-01-02 17:05:51

    require 'ActiveRecord'
    module Log
     ActiveRecord::Base.establish_connection(
        :adapter => "mysql",
        :encoding=> "utf8",
        :host => "localhost",
        :username => "root",
        :password => "baoju",
        :database => "test")  
     
      class Runstatus < ActiveRecord::Base 
        set_table_name 'runstatus' 
      end

     ActiveRecord::Base.connection.execute "SET NAMES GBK"
        class Describe < ActiveRecord::Base
          set_table_name 'testdescribe'
        end

        def log_run_status
          runstatus = Runstatus.new()
          runstatus.run_id = 3
          runstatus.run_status = 1
          runstatus.testcase = "登录hello"
          runstatus.save
          #     runstatus.start_time =
        end
        def log_test_describe

        end

        def get_data()
          Runstatus.find(:first).testcase
        end
      end

    include Log
    log_run_status
    puts get_data

  • Ruby 异常处理 rescue与ensure

    2008-12-31 23:13:51

    异常处理的结构:
    -------------------------------------
    begin 
    #开始
     
     
    raise.. #抛出异常
     
    rescue [ExceptionType = StandardException] 
    #捕获指定类型的异常 缺省值是StandardException
     $! #表示异常信息
     $@ #表示异常出现的代码位置
    else #其余异常
     ..
    ensure 
    #不管有没有异常,进入该代码块
     
    end 
    #结束
    -----------------------------------
    可以结合$!错误原因,和$@错误位置做一个错误捕获并提示的小程序,比如
    -----------------------------------
    begin
        puts 
        puts 
    "file: #{name = ARGV.shift}"
        file 
    = open(name)
        i 
    = 0
        file.read.each_line{
    |line| puts "#{i+=1}.#{line}" }
        puts
    rescue
        puts 
    "error:#{$!} at:#{$@}"
    ensure
        file.close
    end

    ------------------------------------
    上面的小程序读入一个指定的文件并加入行号进行输出,当产生错误时会输出错误信息以及提示,可以故意输入一个不存在的文件名。

    其实begin相当于c#的try
    rescue相当于c#的catch
    ensure相当于c#的finaly
    raise相当于c#的throw

    异常类的结构为:
  • Object
  • 自动化测试的前提及过程(转载)

    2008-12-29 13:17:48

    自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。  
      1.    自动化测试的前提条件  
            实施自动化测试之前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试。通常需要同时满足以下条件:  
        1)  软件需求变动不频繁。  
            测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。  
            项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。  
    2)     项目周期足够长。  
            由于自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。  
    3)     自动化测试脚本可重复使用。  
            如果费尽心思开发了一套近乎完美的自动化测试脚本,但是脚本的重复使用率很低,致使其间所耗费的成本大于所创造的经济价值,自动化测试便成为了测试人员的练手之作,而并非是真正可产生效益的测试手段了。  
         
         另外,在手工测试无法完成,需要投入大量时间与人力时也需要考虑引入自动化测试。比如性能测试、配置测试、大数据量输入测试等。  
       
    2.    自动化测试的过程  
            自动化测试与软件开发过程从本质上来讲是一样的,无非是利用自动化测试工具(相当于软件开发工具),经过对测试需求的分析(软件过程中的需求分析),设计出自动化测试用例(软件过程中的需求规格),从而搭建自动化测试的框架(软件过程中的概要设计),设计与编写自动化脚本(详细设计与编码),测试脚本的正确性,从而完成该套测试脚本(即主要功能为测试的应用软件)。      
    1)     自动化测试需求分析。  
           当测试项目满足了自动化的前提条件,并确定在该项目中需要使用自动化测试时,我们便开始进行自动化测试需求分析。此过程需要确定自动化测试的范围以及相应的测试用例、测试数据,并形成详细的文档,以便于自动化测试框架的建立。  
    2)     自动化测试框架的搭建。  
            所谓自动化测试框架便是像软件架构一般,定义了在使用该套脚本时需要调用哪些文件、结构,调用的过程,以及文件结构如何划分。  
            而根据自动化测试用例,我们很容易能够定位出自动化测试框架的典型要素:  
    a.      公用的对象。  
    不同的测试用例会有一些相同的对象被重复使用,比如窗口、按钮、页面等。这些公用的对象可被抽取出来,在编写脚本时随时调用。当这些对象的属性因为需求的变更而改变时,只需要修改该对象属性即可,而无需修改所有相关的测试脚本。  
    b.      公用的环境。  
    各测试用例也会用到相同的测试环境,将该测试环境独立封装,在各个测试用例中灵活调用,也能增强脚本的可维护性。  
    c.      公用的方法。  
    当测试工具没有需要的方法时,而该方法又会被经常使用,我们便需要自己编写该方法,以方便脚本的调用。  
    d.      测试数据。  
    也许一个测试用例需要执行很多个测试数据,我们便可将测试数据放在一个独立的文件中,由测试脚本执行到该用例时读取数据文件,从而达到数据覆盖的目的。  
            在该框架中需要将这些典型要素考虑进去,在测试用例中抽取出公用的元素放入已定义的文件,设定好调用的过程。  
    3)     自动化测试脚本的编写  
            该编写过程便是具体的测试用例的脚本转化。初学的自动化测试人员均会使用录制脚本到修改脚本的过程。但专业化的建议是以录制为参考,以编写脚本为主要行为,以避免录制脚本带来的冗余、公用元素的不可调用、脚本的调试复杂等问题。  
    4)     脚本的测试与试运行  
            事实上,当每一个测试用例所形成的脚本通过测试后,并不意味着执行多个甚至所有的测试用例就不会出错。输入数据以及测试环境的改变,都会导致测试结果受到影响甚至失败。而如果只是一个个执行测试用例,也仅能被称作是半自动化测试,这会极大的影响自动化测试的效率,甚至不能满足夜间自动执行的特殊要求。  
            因此,脚本的测试与试运行极为重要,它需要祥查多个脚本不能依计划执行的原因,并保证其得到修复。同时他也需要经过多轮的脚本试运行,以保证测试结果得一致性与精确性。
  • WMI 脚本 介绍

    2008-12-28 23:31:08

    什么是WMI?

    WMI最初于 1998 年作为一个附加组件与 Windows NT 4.0 Service Pack 4 一起发行,是内置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI 是一种规范和基础结构,通过它可以访问、配置、管理和监视所有的 — 几乎所有的 Windows 资源。

    要掌握 WMI 的强大功能和范围,需要考虑以前(或者现在)如何管理并监视 Windows 工作站和服务器。您可能用过或仍在使用众多的图形化管理工具来管理 Windows 资源 — 例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。

    尽管图形化工具提供了一种功能管理解决方案,它们所共有的东西是什么呢?一种答案是,在 WMI 之前,所有的 Windows 图形化管理工具都依赖于 Win32 应用程序编程接口(Application Programming Interfaces,APIs)来访问和管理 Windows 资源。为什么?因为在 WMI 之前,能够以编程方式访问 Windows 资源的惟一方法就是通过 Win32 API。这种情况使 Windows 系统管理员无法通过一种简便的方法利用常见的脚本语言来自动化常用的系统管理任务,因为大多数脚本语言都不能直接调用 Win32 API。通过提供一致的模型和框架,WMI 改变了这种情况 — 通过模型和框架,所有的 Windows 资源均被描述并公开给外界。最好的一点是,系统管理员可以使用 WMI 脚本库创建系统管理脚本,从而管理任何通过 WMI 公开的 Windows 资源!

    使用 Windows scrīpt Host 和 Microsoft Visual Basic scrīpting Edition (VBscrīpt),或任何支持 COM 自动化的脚本语言(例如,ActiveState Corporation 的 ActivePerl),可以编写脚本来管理和自动化企业系统

    使用ruby和 WMI 来显示内存的一个例子

    require 'win32ole'

    mgmt = WIN32OLE.connect('winmgmts:\\\\.' + "\\root\\cimv2")

    processes = mgmt.InstancesOf('Win32_LogicalMemoryConfiguration')

    processes.each do |x|

      puts "Total Physical Memory (kb): " + x.TotalPhysicalMemory.to_s

    end

  • ruby 中使用activerecord来访问oracle

    2008-12-26 10:23:04

    1) 插件的安装:
       需要安装3个插件
       1) activerecord
       2)  activerecord-oracle-adapter
       3)  oci
      这些插件可以在 http://rubyforge.org/ 这个网站中找到
    2) 对数据库的操作方法如下:
    require 'rubygems'
    require 'ActiveRecord'
    module Log
    module Logcase
    #连接数据库
        ActiveRecord::Base.establish_connection(
          :adapter => "oracle",
          :username => "kkk",
          :password => "kkk",
          :database => "dev-db1",
          :host => "192.168.205.31"
        )

        class LogActiveRecord < ActiveRecord::Base
        end
        #建立与数据表的关联
        class Runlog < LogActiveRecord
          set_table_name "tt"
        end 
      end
    end
    include Log::Logcase
    #log = Runlog.new
    a = Runlog.find_by_sql("select * from tt t")
    puts a[0].b
      
  • gem更新出错时候的解决办法

    2008-12-14 14:36:31

    当执行gem install 命令时经常出现类似以下的错误:
    -----------------------------------------
    ERROR: while executing gem ... (Gem::installError)
    invalid gem format for ..............

    ------------------------------------------------------------------------

    解决办法,删除掉 d:\ruby\lib\ruby\gems\1.8\cache  目录下的安装文件,然后再重新安装一遍。

    另外,安装ruby1.8.6版本时自动安装了rubygem是0.9.2,现在已经有了最新版本1.3.1, 更新方法如下:

    gem install rubygems-update

    安装好之后,进入 D:\ruby\lib\ruby\gems\1.8\gems\rubygems-update-1.3.1 ,双击setup.rb,这样就升级成功了.

    实践试了下,新版本的rubygem下载速度更快,更人性化,如下载rails,如下:

    C:\Documents and Settings\allan.huangxr>gem install rails
    Successfully installed rails-2.2.2
    1 gem installed

    安装了新版本后既减少了以前多次选择安装项的麻烦,也提高了下载速度,并减少了出错的机率,一个字,爽!

  • ruby中赋值语句解析

    2008-12-13 17:11:04

    如下:

    a = [1,2,3,4]
    -----------------------------------------------
    b,c = a    => b=1,c=2
    当右边只有一个数组,ruby自动将右边的数组拆分,然后赋值给左边的变量
    -----------------------------------------------
    b,*c = a    =>b=1 ,c=[2,3,4]
    当左边变量前增加*,表明该变量是个数组
    --------------------------------------------------
    b,c = 10,a   =>b =10,c = [1,2,3,4]
    因为a是个数组,故c也是一个数组
    ---------------------------------------------------
    b,*c = 99,a   =>b = 99,c = [[1,2,3,4]]
    直接赋值,通过c前增加*,强制指定c是一个数组,但只有一个值被赋给c,故c对应的是的数组只有一个元素
    --------------------------------------------------
    b,c=99,*a      =>b=99,c=a 
    在右边的数组之前增加*,表明把数组当成多个变量使用
    ------------------------------------------------------
    b,*c = 9,*a   => b=5,c=[1,2,3,4]
    左边的c增加*,表明c是一个数组,右边的数组增加*,表明把数组当成多个值使用
    -------------------------------------------------------
    b,(c,d),e = 1,2,3,4  => b=1,c=2,d=nil,e=3
    左边的c,d被组成一个子并行赋值,对应右边的第二个值,但第二个值是一个单值,故导致只有c被赋值,e对应第三个值,也就是3
    --------------------------------------------------------
    b,(c,d),e = [1,2,3,4]  => b=1,c=2,d=nil,e=3
    当右边的值是一个数组时,系统自动将数组分成单个值,因此与前面效果相同了
    -------------------------------------------------------
    b,(c,d),e = 1,[2,3],4  => b=1,c=2,d=3,e=4
    ------------------------------------------------------
    b,(c,d),e = 1,[2,3,4],5 => b=1,c=2,d=3,e=5
    c,d 并行赋值,对应右边的[2,3,4],所以输出2,3
    --------------------------------------------------------------
    a,(c,*d),e = 1,(2,3,4),5  => b=1,c=2,d=[3,4],e=5

    上述赋值语句包含了并行赋值和嵌套赋值,在一些高级编程中经常会看到,使语句能够更加简化。









  • ruby 中如何获取当前的文件名和目录

    2008-12-09 13:34:25

    获取当前的文件名称
          puts   __FILE__  
    获取当前文件的目录名称
          puts File.dirname(__FILE__)
    获取当前文件的完整名称
          当要获取完整的路径时需要require 'pathname',代码如下:
         require ‘pathname’
         puts Pathname.new(__FILE__).realpath
        
    获取当前文件的完整目录
         require ‘pathname’
         puts Pathname.new(File.dirname(__FILE__)).realpath
    输出当前引用的路径:
            puts $:
  • ruby中几个类库文件的调用过程

    2008-12-08 21:00:33

    使用Watir的提供出来的几个方法比较简单,但是如果要了解这些方法的调用过程,还是需要花一定时间的。这里根据淘宝登录页面中的帐户名输入为例,说明下几个类库文件的调用过程,源码如下:
    ---------------------------------------------------------
    require 'watir'
    ie = Watir::IE.new
    urlsite = 'http://member1.taobao.com/member/login.jhtml?ssl=false&f=top&redirect_url=http%3A%2F%2Fwww.taobao.com%2F'
    ie.goto(urlsite)
    ie.text_field(:id,"TPL_username").set "baoju"
    ----------------------------------------------------------
    最简单的了解调用过程就是调试,但是对于ruby来说,现在好多ide还不支持调试,因此选择一款好的IDE也是比较重要的,我这里选择的是NetBeans6.5,一些调试方法,code complete等一些常用方法都已经有了,这里分析一下ie.text_field(:id,"TPL_username").set "baoju"  这句话的调用过程。

    首先查找Watir::IE类中的text_field方法,但是Watir::IE类中没有这个方法,由此到Container中查找text_field方法:
     def text_field(how, what=nil)
          TextField.new(self, how, what)
     end
    这个方法实现了TextField的初始化,调用TextField类,由于这个类的 initialize 方法在父类中实现,所以调试时直接跳到了类InputElement的initialize方法,代码如下:
    --------------------------------------------------------
    def initialize(container, how, what)
          set_container container
          @how = how
          @what = what
          super(nil)
        end
    ---------------------------------------------------------
    到此为止ie.text_field(:id,"TPL_username")执行完成,现在要做的是set方法,方法定义如下:
    ------------------------------------------------------------------------
    def set(value)
          assert_enabled
          assert_not_readonly
         
          highlight(:set)
          @o.scrollIntoView
          if type_keys
              @o.focus
              @o.select
              @o.fireEvent("onSelect")
              @o.fireEvent("onKeyPress")
              @o.value = ""
              type_by_character(value)
              @o.fireEvent("onChange")
              @o.fireEvent("onBlur")
            else
                    @o.value = limit_to_maxlength(value)
            end
          highlight(:clear)
        end
    --------------------------------------------------------------------------
    先调用 assert_enabled 方法,这个方法在父类Element(element.rb)中实现
    -----------------------------------------------------------
      def assert_enabled
          unless enabled?
            raise ObjectDisabledException, "object #{@how} and #{@what} is disabled"
          end
        end
    -------------------------------------------------------------
    这个方法中又调用了enabled? 方法,当没有时,就返回一个错误
    enabled? 的方法定义为:
    ------------------------------------------------------------
    def enabled?
          assert_exists
          return ! disabled
        end
    ------------------------------------------------------------
    这里又调用了assert_exitsts方法
    assert_exists的方法为:
    -------------------------------------------------------------
     def assert_exists
          locate if defined?(locate)
          unless ole_object
            raise UnknownObjectException.new(
              Watir::Exception.message_for_unable_to_locate(@how, @what))
          end
        end
    ---------------------------------------------------------------
    这里调用了locate方法,locate的实现为:
     def locate
          @o = @container.locate_input_element(@how, @what, self.class::INPUT_TYPES)
       end
    这里又调用了locate_input_elemen方法:
    -------------------------------------------------------------------------
     def locate_input_element(how, what, types, value=nil)
          case how
          when :xpath
            return element_by_xpath(what)
          when :ole_object
            return what
          end
          # else:
         
          locator = InputElementLocator.new self, types
          locator.specifier = [how, what, value]
          locator.document = document
          return locator.element if locator.fast_locate
          # todo: restrict search to elements.getElementsByTag('INPUT'); faster
          locator.elements = ole_inner_elements if locator.elements.nil?
          locator.locate
        end
    --------------------------------------------------------------------------------------

    这里返回具体元素,当元素有时,就定位到了元素,然后通过set下面的赋值来完成赋值操作。

  • Ruby 中类的几个概念

    2008-12-07 17:46:00

    1. 类的继承和消息
    继承允许创建一个新的类,作为另一个类的精炼和特化。 用符号<来表示继承
    如:有这么一个超类:
    -----------------------------------------------------------------
    class Song
      def initialize(name,artist,duration)
        @name = name
        @artist = artist
        @duration = duration   
      end
      def to_s
        "Song: #{@name} #{@artist}(#{@duration})"
      end
    end
    ----------------------------------------------------------------
    现在要定义一人卡拉OK的子类,来加上歌词,那么可以这样定义:
    -----------------------------------------------------------------
    class KaraokSong < Song
      def initialize(name,artist,duration,lyrics)
        super(name,artist,duration)
        @lyrics = lyrics
      end
     
      def to_s
        puts super + "#@lyrics"
      end
    end
    ---------------------------------------------------------------------
    puts song.inspect
    puts song.to_s
    --------------------------------------------------------------------
    执行结果为:
    #<KaraokSong:0x1021f34 @artist="wqs", @lyrics="my wqs", @duration=4, @name="ldh">
    Song: ldh wqs(4)my wqs
    ---------------------------------------------------------------------
    子类和超类的消息传递过程为:
    当调用song.to_s时,并不知道从何处找到to_s方法,而是将判定推迟到程序开始运行时再进行。在那时,Ruby查看song所属的类。如果该类实现了和消息名称相同的方法,就运行这个方法,否则,Ruby就查看其父类的方法 ,然后是祖父,如果在其所有祖先类中没有找到合适的方法,会引发一个错误。
    当类中没有指定父类时,默认以Object类作为父类。
    2. 对象和属性

    类的对象是有状态的,这些状态是对象私有的,其它对象无法访问一个对象的实例变量,当外部世界需要与之交互时,怎么办呢,对于java语言来说,可以定义一些方法来操作对象的状态,如:
    class song
       def name
        @name
      end
      def artist
        @artist
      end
    end
    定义name方法来返回name
    Ruby中提供了一种非常简单的方法,如:
    class song
        attr_reader :name,:artist
    end
    这里可以将:name看作是变量name的名字,而普通的name是变量的值,在这个例子中,将访问方法命名为name,artist对应实例变量@name,@artist会被自动创建。

    可写的属性 可以用attr_writer :name,:artist,如:
    class song
        attr_writer :name,:artist
    end
    虚拟属性 这类属性访问的方法并不必须是对象实例变量的简单包装

    class Song
      def duration_in_minutes
        @duration/60.0   # force floating point
      end
      def duration_in_minutes(value)
        @duration = (value*60).to_i
      end
    end

    这里我们使用属性方法创建了一个虚拟的实例变量。对外部世界来说,duration_in_minutes就象其它属性一样,然而在内部没有对应的实例变量。


  • ruby 中 Block 和 迭代器的混合使用

    2008-12-06 22:59:56

    Block是一种可以和方法调用相关联的代码块,有点象参数传递

    Block的表达方式:

    1) {........}

      如:puts {"good morning,baoju"}

    2) do .... end

    如:

      do

    puts "hello,jack"

    puts "nice to meet you"

      end

    一般来说只有一行那么使用{},如果有多行那么使用do...end

     Block与函数的关联

    block 可以和方法的调用相关联,block可以写在方法的后面,如:

    greet {puts "hi"}

    如果函数有参数,那么block写在参数的后面,如:

    greet("jack","morning") {puts "hi"}

    使用yield可以把调用block中的代码,如:

    def greet
       puts "test block"
       yield
       yield
       puts "call block two times"
    end

    puts greet {puts "hi"}

    那么输出为:

    test block
    hi
    hi
    call block two times
    ----------------------------------------------------------
    可以传递参数给对yield的调用,如:

    def hell()
      yield('morning','hxr')
    end

    puts hell {|m,n| puts "good "+m+","+n}

    那么输出为:

    good morning,hxr

    -------------------------------------

    在ruby中会经常使用block来实现迭代器,如

    (1..3).each {|i| puts i}

    输出为:

    1
    2
    3


     

     

     

  • jdk1.5的设置方法

    2008-12-04 22:48:47

    1)下载jdk, 假如放在目录为:C:\j2sdk1.4.2_04
    2)  设置JAVA_HOME=C:\j2sdk1.4.2_04 注意这里最后没有 ";"
    3)  设置CLASSPATH=.;%Java_Home%\lib\dt.jar;%Java_Home%\lib \tools.jar;%Java_Home%\lib\jconsole.jar;%Java_Home%\lib\htmlconverter.jar;%Java_Home%\bin;%Java_Home%\lib\javaee.jar
    注意这里最前面需要".;"
    4) 设置 path=C:\j2sdk1.4.2_04\bin;
    5)验证是否正确:  

    写一个简单的java程序来测试J2SDK是否已安装成功:
    public class hello
    {
     public static void main(String args[])
     {
     System.out.println("Hello");
     }
    }

    将程序保存为文件名为hello.java的文件。

    打开命令提示符窗口,进入到hello.java所在目录,键入下面的命令
    javac hello.java
    java hello
  • 自动化测试的需要解决的五个问题

    2008-12-04 22:36:37

    这几年测试的发展还是比较快的,自动化测试越来越深入人心,但是对于自动化来说绝不是单单会编写的脚本可行了,对于一个成熟的自动化体系大概会有这5部分组成
     1 .测试脚本的编辑环境:
      现在有很多自动化的的工具,如商用工具QTP,开源工具watir等,但是这些都有些问题,如QTP虽然上手容易,但是结构性较差,watir虽然结构性较强,但是功能还不足够强劲,需要自己开发一大批类库才能更好的使用,要优化这些工具之后,才可能使用我们的脚本编写环境更完美,使用编写测试脚本编写人的培养成本不需要太高。
    2. 测试报告的展现
      测试报告一些实在测试人员可能会觉得这个没有必要,认为测试脚本有没有通过只要测试人员知道就行了,其实测试报告是展现我们工作成果,工作进度的很好的方式。报表基本可以包括详细的日志运行情况,脚本的进展情况,渐近曲线等。
    3. 测试用例的组织
     现在手工测试用例和自动化测试用例好多没有一个对应的测试表,这个确实没有一个很好的现成工具,比如QC,自带的手工测试用例与自动化测试用例之间不能转换,不过可以做一些折中的方案,添加是否回归的字段的,对QC报表做二次开发后进行覆盖率的统计
    4. 执行管理
     测试脚本会越来越多,执行脚本的机器会越来越多,这时需要考虑下分布式执行是否可以
    5. 版本管理
     测试脚本也是有版本的,来保护我们的脚本和衡量我们的工作成果。
  • watir中CheckBox的处理方法

    2008-11-25 22:35:03

    HTML SOURCE 如:

    Check me:<input type="checkbox",id="one",name="checkme">
    通过ID属性来操作设置checkbox
    ie.checkbox(:id,"one").set
    通过ID属性来清除设置checkbox
    ie.checkbox(:id,"one").clear

    也可以通过Name属性来操作:
    ie.checkbox(:name,"checkme").set
    ie.checkbox(:name,"checkme").clear






  • watir中Button控件的操作方法

    2008-11-25 22:15:22

    web中分为两种button控件,分别为:HTML Button 和 Image Button
    一.HTML Buttons
    Html source:
    <input type="button" id="one" name="clickme" value="Click Me">
    使用ID属性来操作:
    ie.button(:id,"one").click
    使用Name属性来操作:
    ie.button(:name,"clickme").click
    使用value属性来操作
    ie.button(:value,"Click Me").click
    二.Image Button
    Html source
    <input type="Image">
    这个标签看上去像个图片,但是像Button那样,可以通过ID,Name,Value来操作,还可以通过src标签来操作。
    如:
    <input type="image" src="images/doit.gif">
    可以使用下面的方法来操作:
    ie.button(:src,/doit/).click




  • 向文件中批量寫數據

    2007-11-26 15:50:33

     
    有时候由于测试的需求,可能需要在.txt文件中定义一些参数,这时可以使用ruby的写文件的功能简单地产生想要的参数:
    aFile = File.new("d:\\1.txt","w")
    aFile.puts "index"
    for x in 1..400
     aFile.puts x   #批量产1到400的数字
    end
    aFile.close
  • Object Repository 的合并

    2007-02-11 21:55:31

    Object Repository 合并的功能是在qtp9.0时才出现的,这个功能对于测试脚本整体开发具有很大的意义.

    在之前的版本如果要使一些常用的步骤变为函数,还必须在同一个object Repository中添加对象,有了这个功能之后,你可以先编写完成测试脚本,然后再挑选一些常用的步骤进行函数化,方便了操作.

    下面介绍合并Ojbect Repository的三种方法:

    1) 从共用对象库合并到本地对象库

    • 首先录制一个脚本
    • 打开Object Repository,点击Associate Repositories 按钮,弹出如图一对话框
    • 点击"+"按钮,添加共享.tsr文件,如图2
    • 点击ok按钮,并关闭Object Repository对话框,保存该脚本名称为test1,并点击New按钮.
    • 打开Resources-> Object Repository manager...
    • 打开Share.tsr文件,(在打开的文件对话框中去掉"Open in read-only mode"的复选框,这样打开的文件是可编辑的)
    • 点击tools->Update from local repository...,弹出如图三
    • 点击"+"号,选择"test1"文件,如图4
    • 点击Update All...按钮,余下的操作就按照提示操作,你再打开"test1"脚本的tsr文件,可以发现这时就把Share.tsr文件合并到本地上去了

    2) 合并两个tsr文件

    合并两个tsr文件比较简单,打开resources->Repository Object Manager...,点击tool->object repository merge tool...,弹出的对话框如图五:

    点击Ok就合并成功了,期间可能有冲突,这里就不作介绍冲突的解决

    3) 在Share文件中添加对象

    打开Object Resitory manager...,打开一个要编辑的tsr文件,使成为可编辑状态,打开要添加对象的页面,点击Add Objects 按钮,这时鼠标就会变成手状的模样,点击要添加的控件,这时这个控件的属性就添加到了对象库中了.

    如果这个对象在另一个对象库中已经存在,那么也可以打开另外一个对象,选择那个对象,点击鼠标右键,在弹出菜单中点击"复制",再选择目的对象库的目的节点,点击粘贴,这样就把对象复制到另外对象库中去了.

  • IE7.0访问QC的办法

    2006-12-22 15:17:37

    近日好多朋友装了IE7.0,但是装了之后不能访问QC了,给他们带来了好多麻烦,下面的方法可以解决这个问题

    1)登录QC服务器

    2)找到start_a.htm文件 

      这个文件隐藏得比较深,还是在QC目录下搜索这个文件会比较快点.

    3)编辑这个文件

      打开这个文件,找到变量fMSIE3456,在后面加一句脚本:(ua.lastIndexOf('MSIE 7.0') != -1)

    4)OK,可以告诉朋友们,用IE7.0也可以访问QC了

  • 用户菜单

    我的栏目

    我的存档

    数据统计

    RSS订阅

    Open Toolbar