青春与成就 是人生的两大财富 / 当你享受青春时 你必须要吃点苦 / 当你失去青春时 成就会成为你的拥有 / 否则 青春之后就一无所有

发布新日志

  • 转:如何学习自动化测试

    2008-09-08 16:28:11

    转自:http://www.51testing.com/?action/viewspace/itemid/92200.html

       从事了几年测试工作,也着实见证了测试的发展,如今测试行业对从业者的要求是越来越高,不再仅仅局限于要求会写测试用例、会细致的执行测试、能有效的发现系统缺陷等;越来越多的企业对应聘者本身的技能要求也越来越高,招聘信息中诸如“精通VBscrīpt、Perl/Rbuy等至少一门脚本语言”、“至少熟悉一门开发语言”、“精通QTP、LR等自动化测试工具”、“有大型项目自动化实施成功经验”此类的字眼也逐渐增多。目前看来,除白盒测试内容和测试管理外,主流的方向有两个:功能自动化测试和性能测试。这就要求从业人员能够在短时间内快速的掌握这些知识,才能获取到更好的工作机会。本人是名功能自动化测试的工程师,以自己学习、工作的过程结合QTP讲讲该如何学习自动化测试

        首先,想从事自动化测试,必须先了解What/Why/How,也就是常说的去了解什么是自动化测试、为什么要进行自动化测试、该如何进行自动化测试,这类的资料在网上有很多,这里就不做重复了

        其次,需要根据项目的特点,选择合适的自动化测试工具,并了解工具的特性。以QTP为例,该如何去掌握它呢?对于初学者,大多数都是通过录制的方式来生成脚本,这个阶段应该掌握的基础知识有

    1)      QTP是如何去识别对象的,对于新手经常会出现录制的脚本回放的时候报错的现象,这个时候就应该考虑为什么呢?如果很了解QTP识别对象的原理啊,我想就能很快定位到原因了

    2)      去掌握一些QTP对象的方法,如GetROPreperty、GetTOPreperty、ChildObjects等等,对于相似的方法应该去搞清楚到底区别在哪?像GetROPreperty、GetTOPreperty有什么区别等

    3)      什么是Action参数、什么又是Test参数?两者有什么区别,又有什么联系,在同一Test和不同Test间这些参数如何工作

    4)     什么是环境变量?环境变量是如何建立和使用的,环境变量在参数传递中和action参数、test参数有什么不同

    5)     了解检查点的知识,明白什么是内置检查点,什么又是自定义检查点。并搞清楚在什么时候该如何使用检查点

    6)     掌握对象库的操作,了解对象库对于测试的意义,象是否启用智能识别对测试脚本有何影响、为什么同一对象识别起来会有_1、_2之类的后缀等都是需要去研究清楚的问题

        这几个问题都搞清楚的话,那基本就能够利用QTP生成正确的脚本了,当然以上只是部分必须掌握的内容,其实还是很多细节的设置,就需要在实际运用中去掌握了

        接下来,就可以进一步提升自己的QTP运用水平了,这个阶段就需要去学习vbs知识和如何运用描述性编程实现脚本了,同时在这个过程中还需要去学习html知识、DOM、XML、以及像excel、word等的API知识了,总的来说,这个阶段应该掌握的内容大体上包括

    1)     VBscrīpt的基础知识,熟悉常用的方法和函数,掌握文件对象的操作等

    2)     熟练掌握XML技术;excel、word等API对象,可以根据需要创建日志等

    3)     熟练掌握DOM和HTML知识,能够结合这些技术对Web页面进行解析

    4)     掌握数据库的基本操作语句,能够利用ADO对象进行数据操纵

    5)     熟练掌握正则表达式,很多时候处理对象问题相当方便

    6)     掌握如何调用dll进行工作

    7)     能够利用QTP的自动化对象模型创建出需要的运行模式

    8)     掌握WMI知识

        以上只是我考虑到的部分,并不全面,呵呵,供大家参考,当然这些技术主要是针对Web系统运行,因为我们的系统就是B/S的,呵呵。如果这些知识都能够扎实的掌握的话,个人认为,基本上能够处理自动化过程中的绝大多数问题了,这个时候你对自动化测试的技术应该是有一定积累了

        接下来就需要考虑自动化测试框架问题了。当脚本规模到了一定的程度,就会面临一些问题,如:

    1)       如何有效的管理并调度脚本

    2)     如何实现脚本运行的无人值守,测试过程中能够自动进行错误处理并进行日志记录

    3)     如何生成简介明确的测试报告

    4)     如何能够更加高效的维护测试脚本

    5)     实现框架代码和业务代码的分层、业务脚本和业务数据的分离

        这个阶段主要体现的是测试人员的测试思想,是可以脱离工具独立存在的过程。当然各个公司项目的实际情况不同,导致设计出来的思想不同,但总体上来说一般包括数据驱动和关键字驱动两种模式。后者实现的技术难度大于前者,大多数公司目前都采用的数据驱动模式。这个阶段不应局限于技术运用上,而需要从测试全局考虑,进行分层设计、模块化实现,减少代码之间的耦合

        如果以上三个方面都能够做的很好的话,那么恭喜你,你已经可以独立负责项目的自动化测试建立工作了,呵呵!

        总之,学习自动化测试需要在实际项目中进行,这样提高的会比较快,项目中运用了很多种技术,自动化实施过程会碰见各种各样的问题,是很好的学习机会,关键要善于总结、积累经验,只要能够把各个细节做好,那么你一定能够成为一名优秀的自动化测试工程师

  • 转:用好QTP帮助文档

    2008-06-25 13:37:24

    转自:http://www.51testing.com/?4696/action_viewspace_itemid_13013.html

    安装了英文版的QTP9.*后,可以从启动菜单的QTP文件夹中看到它的自带帮助文档。
    在Start -> QuickTest Professional -> Documentation下面列出了4个主要的帮助文件:
    QuickTest Automation Reference(QTP自动化参考)
    QuickTest Professional Code Samples Plus(QTP代码范例)
    QuickTest Professional Help(QTP帮助)
    Tutorial(教程)

    Tutorial是QTP的入门教程,提供了一个QTP入门的学习曲线。初学者可以按部就班的学习Tutorial的内容,实现对QTP的直观了解;
    QuickTest Professional Help是QTP的全面帮助,是QTP测试脚本开发过程中最常用而且有效的文档。包括用户指南(QuickTest User's Guide)、业务过程测试用户指南(QuickTest for Business Process Testing User's Guide)、对象模型参考(Object Model Conference)以及VBscrīpt参考(VBscrīpt Conference)等;
    QuickTest Professional Code Samples Plus提供了一些常用的QTP代码。部分代码是可以直接Copy + Paste应用于测试脚本的,十分具有参考价值;
    QuickTest Automation Reference是QTP自动化模型的完整描述。QTP可以以自动化对象的形式被其他程序语言调用,这为批量测试执行、与其他工具集成以及软件开发过程中的持续集成都提供了很大便利;

    知道了这些帮助文件的内容,也就很容易根据自己的需要选择参考的文档了。

  • 转:QTP测试报表table内容的思路

    2008-06-11 17:52:11

    转自:51Testing软件测试博客

    使用QTP对报表中的webtable内容进行正确性验证。

        基本思路是:

        一:使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,一般为二维数组

        二:使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,也是一个二维数组

        三:此时区分是否需要验证排列顺序,如果需要,直接对两个二维数组进行一对一遍历比较

        四:不需要验证排列顺序,或者顺序无法控制的情况下,我们需要对显示内容和查询预期内容进行比较,这时候牵涉到两个结果集的数据顺序问题,如果采用单对多遍历的情况,效率会十分低。

        这时候我们换一种思路考虑,既然是验证内容,那我们就可以把二维数组的验证转换成排序一维数组比较,实现方式是,采用join方法将二维数组的每一行转换成一个字符串(内容没有变化,只加入拼接符),两个二维数组进行相同转换,成为两个一维的字符串数组。

        然后使用快速排序法对两个一维数组进行一次排序,同样的机制下,如果原本内容相同,那么排序出的内容也应该相同。然后直接进行一维数组一对一比较。

        下面是vbs的快速排序代码,合适数字和字符串数组:

    Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)

    'ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
    Dim lef, rig
    Dim pivot

    If head < tail Then
     lef=head
     rig=tail
     pivot=ReArr(lef)
     While (lef <> rig)

      While (lef < rig and ReArr(rig) >= pivot)
       rig = rig-1
      Wend
      If lef <rig Then
       ReArr(lef) = ReArr(rig)
       lef = lef+1
      End If

      While (lef < rig and ReArr(lef) <= pivot)
          lef = lef+1
      Wend
      If lef <rig Then
       ReArr(rig) = ReArr(lef)
          rig = rig-1
      End If
     
     Wend

     ReArr(lef) = pivot
     call QSort(ReArr, head, lef-1)
     call QSort(ReArr, lef+1, tail)
     
    End If
    End Function

  • 转:QTP的Action间的信息共享的4种方法

    2008-06-11 17:50:12

    转自:陈能技的博客

    通过Action参数来传递数据
     
    Action2的脚本如下:
    ' Input Parameters
    Message = Parameter("Msg")
    Msgbox Message
     
    ' Output Parameters
    If NOT Message = "" Then
           Parameter("ReturnMsg") = "The Message is " & Message
    Else
           Parameter("ReturnMsg") = "The Message is Empty!"
    End If
     
    ' RetuenValue
    ExitAction "HAHAHAHHAHA!!!!!"
    'ExitAction Parameter("ReturnMsg")
     
     
    3种调用Action的方法,Action1的脚本如下:
    ' 调用Action2,输入参数为 “ Hello!”,把输出参数值写到ReturnMessage1变量
    RunAction "Action2", oneIteration,"Hello!" ,ReturnMessage1
    Msgbox ReturnMessage1
     
    ' 调用Action2,输入参数为 “ Hello!”,通过Parameter方法读取输出参数值
    RunAction "Action2", oneIteration,"Hello!"
    ReturnMessage2= Parameter("Action2","ReturnMsg")
    Msgbox ReturnMessage2
     
    ' 如果被调用的Action使用了ExitAction来退出Action并返回ReturnValue,则可以使用下面的方式来获取Return Value的值
    ' 注意OutPut Parameters与Return Value的区别
    ReturnMessage3 = RunAction( "Action2", oneIteration ,"Hello!")
    Msgbox ReturnMessage3
     
            通过全局数据表(Global Data Table)来共享数据
     
    在Action1中设置参数值,Action1的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 查找参数列
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 设置参数值
    Parameter1.Value="Hello"
    Parameter2.Value="World!"
    ' 调用Action2,Action2将使用前面设置的参数值
    RunAction "Action2", oneIteration
     
    在Action2中读取参数值,Action2的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 读取参数值
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 使用参数值
    Msgbox Parameter1 &" " & Parameter2

  • 转:QTP调出Web Image对象的右键菜单的方法

    2008-06-11 16:50:20

    转自:http://bbs.51testing.com/viewthread.php?tid=82266&extra=&page=1

    Web里很多对象都有Click方法(object.Click [x], [y], [BUTTON]),带上micRightBtn参数,都能实现右键点击调出右键菜单的操作。
    可是不知为何,Image对象就是不能右键点击,不管是否带上micRightBtn参数,Click执行的都是左键点击操作,所以无法调出右键菜单。
    应朋友要求,研究了一番,找出替代的解决方法,写了一个函数,可供大家参考



    SelectImageMenu browser("test").Page("test").Image("image001"), "R"

    '================================================================
    ' FUNCTION NAME:
    '        SelectImageMenu
    ' FUNCTION DEscrīptION:
    '        Use this function to right-click on a image object and select the pop-up menu
    ' FUNCTION USAGE:
    '        ret = SelectImageMenu(browser("test").Page("test").Image("image001"), "R")
    ' FUNCTION PARAMETER        
    '        ImageObject : The web image object
    '        MenuKey : The hot key of pop-up menu item you will select
    ' FUNCTION RETURN:
    '        Return 0 when successfully, or return -1 when fail
    '================================================================
    Function SelectImageMenu(ImageObject, MenuKey)

            Dim wshShell
            Dim ieServerObject

            Dim x1, y1

            'Get the ie server object
            Set ieServerObject = Window("regexpwndclass:=IEFrame").WinObject("regexpwndclass:=Internet Explorer_Server")

            'get the image position
            x1 = CInt(ImageObject.GetROProperty("abs_x"))
            y1 = CInt(ImageObject.GetROProperty("abs_y"))

            'right-click on image through ie object
            ieServerObject.Click x1, y1, micRightBtn
            wait 1

            'Select the menu item by press hot key
            Set wshShell = CreateObject("Wscrīpt.Shell")
            wshShell.SendKeys MenuKey
            wait 1
       
            SelectImageMenu = 0
            
    End Function


    说明:

    因为那右键弹出菜单QTP无法识别,所以QTP无法操作这菜单,只能用键盘按键来代替鼠标选择。

    键盘按键可以是热键,如“复制(C)”这一菜单项,可以用按键C来选择,MenuKey就设为"C"。

    键盘按键也可以是下箭头和回车键,如要选择第三个菜单项,可以按三下下箭头和回车键来选择,MenuKey就设为"{DOWN}{DOWN}{DOWN}{ENTER}"。这样没有热键的菜单也可以选择了,前提是菜单项目是固定的,不是可变的。

  • 转:QTP识别和操作对象的原理

    2008-06-11 16:17:19

    转自:http://bbs.51testing.com/viewthread.php?tid=87074&extra=&highlight=%2Byabest&page=1

    一、QTP识别对象的原理(by yabest, http://www.yabest.net

    QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。
    这两个概念从字面上不大好理解,也容易混淆。
    但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。

    QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。
    然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,
    接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。

    仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,
    也可以在运行过程中进行动态修改,以匹配实际对象。

    和TO、RO相关的几个函数有:

    GetTOProperty():取得仓库对象的某个属性的值
    GetTOProperties():取得仓库对象的所有属性的值
    SetTOProperty():设置仓库对象的某个属性的值

    GetROProperty():取得实际对象的某个属性的值


    理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

    比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
    记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。
    我们要对每条记录进行检查,也就是要点击每个Check按钮。
    但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。

    那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
    然后用下面的脚本,就可以完成测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)
      JavaWindow("Test").JavaButton("Check").Click
    Next


    或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去
    我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")
    JavaWindow("Test").JavaButton("AnyButton").Click

    另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象
    ( Written by yabesthttp://www.yabest.net

    如上面两个任务,可以如下实现

    1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click
    Next

    2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试

    JavaWindow("Test").JavaButton("label:=New").Click
    JavaWindow("Test").JavaButton("label:=Modify").Click
    JavaWindow("Test").JavaButton("label:=Delete").Click
    JavaWindow("Test").JavaButton("label:=Check").Click



    二、QTP操作对象的原理(by yabest, http://www.yabest.net

    QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。

    对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
    对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。


    两种接口的脚本书写格式的差别在于:
      自身接口需要在对象名后面加object再加属性名或方法名,
      封装接口就不用在对象名后面加object。

    具体格式如下:
      对实际对象的操作:
          对象.object.自身属性
          对象.object.自身方法()
          对象.GetROProperty("封装属性")
          对象.封装方法()

      对仓库对象的操作:
          对象.GetTOProperty("封装属性")
          对象.GetTOProperties()      ’获取所有封装属性的值
          对象.SetTOProperty("封装属性", "封装属性值")

    比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:
      设置JavaEdit的内容:
         JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"
      读取JavaEdit的内容:
         msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")

    如果通过JavaEdit的自身接口,脚本如下:
      设置JavaEdit的内容:
         JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")
      读取JavaEdit的内容:
         Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()

    QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
    QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。
    JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

    对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
    但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
    所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
    不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
    封装接口有相应功能的话,就尽量用封装接口吧!
    ( Written by yabesthttp://www.yabest.net

    理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

    但是我们怎么知道对象都有哪些封装接口和自身接口呢?
    其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
    窗口中间有选择栏让你选择Run-time Object或者Test Object,
    当你选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
    当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

    (注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
                两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
                不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
                QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
                它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。



    明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!

    比如执行
      JavaDialog("Add NE").JavaEdit("NE Name").object.setVisible(false)
    哈哈,你的JavaEdit对象就当场消失不见了!!!

  • 转:对QTP中的对象管理的新认识和手写测试脚本的方法

    2008-06-11 12:57:09

    转自:http://blog.chinaunix.net/u2/69626/showart_724838.html

    在公司一直都是一个人做测试(偶是新手),从没有想到以后如果进入一个测试团队后,如果共同维护、管理一些QTP对象或是别的数据之类的东东。今天看了这片文章很有启发。   

        使用QTP录制一些脚本再回放,这不难,难的是一个测试团队共同开发脚本,并能不断的完善脚本,创建一个结构化的自动测试脚本体系。这篇文章重点讨论的是,如何管理QTP的对象仓库,以便能让对象仓库易于维护、管理。

      如果只是简单的录制、回放脚本,可能感觉不到对象仓库的存在。但是要做到QTP脚本的结构化管理,就必须对QTP的对象仓库进行严格的管理。

      在实际工作中我们发现,QTP脚本做好后绝不是一成不变的,而是随着需求和页面的变化,需要不断修改的。如果每次修改脚本的时候,都重新录制脚本,成本极高,所以最有效的方法是,先修改对象仓库,然后修改脚本,以适应新的系统。

      如果对象仓库里的管理比较混乱的话,修改脚本时就会遭受地狱般的痛苦,比如n多对象全堆在一起根本理不出头绪,对象的命名不知所云,找不到自己需要的对象等等。下面我们讲一下如何管理对象仓库,避免这些问题。

      先介绍一下对象仓库中的对象层次,主要分为3个层次
    1、Browser浏览器
    2、Page页面
    3、页面中的各种对象,比如Link、Button

      Browser对应的是已经打开的IE窗口对象,Page对应的是不同的网页,比如登录首页是一个Page,登录成功后跳转到我的淘宝页面,这就是另一个Page。而页面中的各种对象就比较好理解了,图片、按钮、链接都是对象。

      了解了对象层次,我们再讲一下命名。如果QTP在录制过程中自动记录对象,命名是非常乱的,缺乏逻辑性,经常看到一个Browser下面有n多“淘宝网_1”、“淘宝网_2”这样的Page,这对我们以后的管理非常不利。与其修改这些命名,我们不如用一种思路更清晰的方式,手动添加对象。

      QTP中有一个工具实现了对象仓库的管理,Object Repository Manager,我们用它来添加对象。操作很简单,直接点击toolbar中的Add Object按钮,然后在web上点击你需要添加的对象即可,添加过后再修改名称。更新对象也比较简单,先选中需要更新的对象,然后点击Update from Application即可。

      这项工作其实可以在系统页面出来以后就开始做,我们一边进行手工测试,一边把对象添加起来,为后面的脚本开发做准备。这时暂时不制作脚本。

      总结一下,对象仓库的管理要满足以下几个原则:
    1、每个Browser下的Page不要太多,最好不要超过5个,即使我们的系统都在同一个IE窗口下(没有弹出新IE),我们也可以分几个Browser管理,把业务上关联较强的几个Page放在一个Browser下;
    2、每个对象都按照所代表的业务属性命名,最好用中文,不要出现一些难理解的字符,比如abc这样的。
    3、尽量避免在一个tsr文件中堆放过多的对象,最好根据业务,把对象分为几个tsr文件保存。这里没有统一标准,以每个tsr文件结构清晰为宜。

      现在我们完成了对象仓库的整理,好,可以开始制作脚本了。可是问题来了,录制脚本的时候,QTP能不能自动和这些对象对应上呢?QTP会不会又自动添加一堆对象进来呢?别担心,不会出现这个问题,因为我们将进行一场脚本编写的革命:放弃“录制脚本”这种传统的脚本编写方法,完全手工编写脚本。

    ************************************************************************

                                      手写测试脚本的方法

        这里可能有人会问,QTP的录制功能不是很强大么,为什么还要自己手写脚本,这样是不是更麻烦。我先说一下我对手写测试脚本的感受,供大家参考。首先,如果我们整理好对象仓库,再录制脚本,QTP就会又自动生成一批新的对象,命名很乱,再修改替换太费事;其次,录制脚本的过程如果出现问题,再重来,很麻烦;最后,也是最重要的,手写脚本时思路非常清楚,而且写完再运行,感觉非常好,呵呵。
     
      与编写脚本相比,脚本的维护工作同样很重要,而且维护脚本一般都是直接修改脚本,并不会去重新录制,所以开始的时候就用手写的方式,维护起来就会更轻松。
     
      编写QTP脚本其实是比较简单、快速的。我们首先创建一个Test,然后把所有相关对象仓库的tsr文件和vbs文件添加到这个Test里面,下面就可以开始写了。写脚本大致会遇到这么几种情况:
    1、调用vbs函数
    2、调用其他Test
    3、打开指定的URL
    4、操作页面Page上的控件
    5、添加CheckPoint
    6、其他逻辑运算
     
      我们分别讲一下。调用vbs函数比较简单,直接Call [函数名]。如果要调用其他的Test,那么首先点击Call to Existing Test,然后在QC中选择一个可以复用的Test,例如登录。如果登录的Test有参数,那么可以这样写:
    RunAction \"Action1 [login]\", oneIteration , \"张三\"
     
      下面的脚本要操作对象仓库了。我们先写出“Browser(”,这时就会发现,对象仓库里面的Browser对象都列了出来,然后我们选择需要的那个B对象就好。我们先从打开指定URL的脚本开始讲,打开指定的URL使用的机会比较多,特别是在Test的开始。一般我们这样写
    Browser(\"登录\").Navigate \"指定的URL\"
     
      这里的“登录”是一个Browser对象,一般我们要选业务上符合的B对象。写完这句以后要再写:
    Browser(\"登录\").Page(\"登录首页\").Sync
     
      这句的意思是等待“登录首页”这个Page加载完毕,注意不要用Wait几秒这种方式来等待页面加载结束。
     
      操作Page的对象是比较简单的,由于控件的类型太多,比如下拉菜单WebList、文本输入框WebEdit、按钮WebButton,这里就不一一说明了,大家看下面的一些例子吧:
    Browser(\"购买直充\").Page(\"购买直充\").WebList(\"游戏区\").Select 1
    Browser(\"购买直充\").Page(\"购买直充\").WebEdit(\"PlayerName\").Set \"abc\"
    Browser(\"购买直充\").Page(\"购买直充\").WebEdit(\"PlayerNameAgain\").Set \"abc\"
    Browser(\"购买直充\").Page(\"购买直充\").WebEdit(\"CheckCode\").Set \"8888\"
    Browser(\"购买直充\").Page(\"购买直充\").Image(\"Submit\").Click
     
      如果遇到问题,不知道怎么写,可以先用录制的方式,生成一些脚本,然后仿照脚本写就可以了。另外在Page下面有可能会有Frame对象,这个没关系,就像这样写即可:
    Browser(\"我的直充\").Page(\"我的直充\").Frame(\"直充入口\").Image(\"立即直充\").Click
     
      添加CheckPoint要稍微复杂一些,比如说我们要检查Page上的一个WebElement的显示字符是否正确,那么首选要把这个WebElement完整的写在Test里面,这一句后面需要删除:
    Browser(\"购买直充\").Page(\"购买直充\").WebElement(\"购买结果\").Click
     
      然后右击这一行脚本,选择Insert Standard CheckPoint,在弹出的CP属性窗口,设置CP的细节。确认后脚本就会自动生成一行:
    Browser(\"购买直充\").Page(\"购买直充\").WebElement(\"购买结果\").Check CheckPoint(\"购买结果\")
     
      最后再把上面那一行删除就可以了。 [Page]
     
      其他的逻辑运算,例如循环、判断,请参考vbs脚本语法,这里不说了。
     
      总之,手动编写QTP脚本有很多好处,我在尝试了录制和手写两种方式之后,最终选择了手写的方式,大家不妨也试试,特别是对编码有兴趣的朋友。 

  • 转:利用QTP自动化测试Flex 3应用程序

    2008-06-10 17:36:36

    转自:http://www.ityouku.com/viewthread.php?tid=1398&extra=page%3D1

    Adobe新出了Flex 3, 同时推出了用于Flex 3自动化测试的QTP plugin。本人也是刚刚入门Flex自动化测试,以下是一个简单的总结:

    软件需求:
    1. Flex Builder 3。 到这个地方 https://www.adobe.com/cfusion/td ... us&product=flex (需要注册)下载 Adobe Flex Builder 3 Professional 或者Flex Builder 3 Professional Eclipse Plug-in (如果本机已有eclipse)。其中Flex Builder 3中已经包含QTP的plugin
    2. IE 6 或以上(目前只支持IE)
    3. Flash Player ActiveX control, version 9.0.28.0或以上,最新9.0.115.0 (检查C:\WINDOWS\system32\Macromed\Flash\FlashUtil9e.exe的属性可以查看当前安装flash的版本)
    4. QTP 9.1(不支持Smart Identification)或 QTP 9.2 和 patch 1701

    编译:
    必须用Flex Builder 3 编译Flex项目, 而不能仅仅用Flex 3 SDK编译,因为Flex Builder中带了一些的特殊的包
    1. 打开FB,右键选择你的Project -> Properties -> Flex Compiler
    2. 修改属性“Additional compiler arguments”,在该属性中添加如下代码:
    -include-libraries "flex_builder_dir\sdks\3.0.0\frameworks\libs\automation.swc" "flex_builder_dir\sdks\3.0.0\frameworks\libs\automation_agent.swc" "flex_builder_dir\sdks\3.0.0\frameworks\libs\qtp.swc" "flex_builder_dir\sdks\3.0.0\frameworks\libs\automation_dmv.swc"
    其中flex_builder_dir由Flex Builder的安装目录代替,windows平台的默认安装目录为 "C:\Program Files\Adobe\Flex Builder 3"
    3. 编译项目,然后发布应用到你的web server中
    4. 这时就为QA的自动化测试做好了准备

    QTP插件安装:
    1. 运行flex_builder_dir\Installers\QTP_Plugin_Installer.exe
    2. 验证plugin是否安装好:启动QTP,在Add-ins Manager窗口中出现Flex 3.0.0
    3. 这时QTP就可以识别Flex对象了

    更多更详细的信息都可以在adobe的官网上找到。
  • 转:QTP9.2自带的视频教程

    2008-06-05 16:51:28

    转自:http://blog.csdn.net/Testing_is_believing/archive/2008/01/05/2026942.aspx

    安装QTP9.2后,随QTP安装文件附带了几个视频教程,分别是IDEPresentation.aviKDTPresentation.aviORMPresentation.avi

     

    这几个视频可在QTP的安装目录可找到,例如:E:\Program Files\Mercury Interactive\QuickTest Professional\help

     

    也可直接打开QTP,在帮助菜单找到(Help | Product Feature Movies)。

     

    IDEPresentation介绍QTP新的IDE环境的使用方法(Dynamic Automation Development IDE)。

    KDTPresentation介绍QTP的应用程序区域管理的使用方法(Application Aera management)。

    ORMPresentation介绍QTP对象库管理的使用方法(Object Repository management)。

     

    要想观看这几个视频,首先要安装TechSmith Screen Capture Codec,在QTP的安装目录可找到(例如:E:\Program Files\Mercury Interactive\QuickTest Professional\help\ TSCC.exe

  • 转:QTP9.2的帮助文件

    2008-06-05 16:49:50

    转自:http://blog.csdn.net/Testing_is_believing/archive/2008/01/06/2027756.aspx

    QTP的帮助文件确实很多,安装QTP后,在安装目录的help文件夹下可以找到很多chm、pdf、htm格式的帮助文件。安装插件后,插件的帮助文档也会放到这个文件夹里面。


    今天看了几个.NET插件的帮助文档,在此整理归纳一下:
    NET_GD.pdf(《Mercury QuickTest Professional .NET Add-in Guide》)、NETUsersGuide.chm(《QuickTest Professional .NET Add-in User’s Guide》):主要讲QTP的.NET插件的安装、加载、使用方法,包括WPF控件、.NET Web Forms控件、.NET Windows Forms控件的录制、控件内部属性和方法的访问等方面的内容。


    NET_WPF.chm(《Windows Presentation Foundation Environment》):列举出所有WPF控件的属性和方法,以及调用方式,还附带了例子。


    WebForms.chm(Mercury QuickTest Professional Object Model Reference - .NET Web Forms Environment):列举出所有.NET Web Forms控件的属性和方法,以及调用方式,附带例子。


    WindowsForms.chm(Mercury QuickTest Professional Object Model Reference - .NET Windows Forms Environment): 列举出所有.NET Windows Forms控件的属性和方法,以及调用方式,附带例子。


    NETReadMe.htm:《QuickTest Professional .NET Add-in 9.2 Readme》,描述了QTP所支持的.NET环境,支持的WPF控件、.NET Web Forms控件、.NET Windows Forms控件类型,以及一些已知的问题和限制,及其解决方法。


    NETExtensibility.pdf(《Mercury QuickTest Professional .NET Add-in Extensibility Developer’s Guide》)、NETExtensibility.chm(《QuickTest Professional .NET Add-in Extensibility Developer’s Guide》)、NETCustAPI.chm(《QuickTest Professional .NET Add-in Extensibility API Reference》):介绍.NET 插件扩展性的使用方法,以及.NET 插件扩展性的API,.NET 插件扩展性让测试员可以通过扩展QTP的测试对象来支持第三方控件或者是自定义的.NET控件。

  • 转:一个简单的C#调用QTP自动化对象模型的例子

    2008-06-05 16:47:52

    转自:http://blog.csdn.net/Testing_is_believing/archive/2008/01/07/2029448.aspx

    使用QTP自动化对象模型提供的对象、方法和属性,可以编写脚本来设置QTP、运行测试,而不需要在QTP的界面上手工进行。

    下面是一个简单的C#调用QuickTest自动化对象模型的例子:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

     

    namespace Test7

    {

        public partial class Form1 : Form

        {

            public Form1()

            {

                InitializeComponent();

            }

     

            private void button1_Click(object sender, EventArgs e)

            {

     

                // 创建QTP应用程序实例

                QuickTest.Application app = new QuickTest.Application();

     

                // 启动QTP

                app.Launch();

     

                // QTP可见

                app.Visible =true;

     

            }

        }

    }

  • 转:干净地卸载QTP的小工具 - QTPCleanUninstaller

    2008-06-05 16:07:19

    QTPCleanUninstaller是一个可干净地卸载QTP的小工具。

    有时候会碰到一些QTP的问题,需要重新安装,而QTP默认的卸载程序在卸载完QTP后会残留很多信息在注册表,如果手工清理则会耗费很多时间,QTPCleanUninstaller可以自动清除QTP的大部分注册表信息。

    可到以下网址下载:

    http://www.knowledgeinbox.com/documents/qtp_cleanuninstall.html

数据统计

  • 访问量: 17432
  • 日志数: 33
  • 建立时间: 2008-03-07
  • 更新时间: 2008-09-22

RSS订阅

Open Toolbar