发布新日志

  • QTP测试常问问题及答案

    2011-06-10 16:55:40

    塔塔面试questions:

    1.     如何管理对象库

    1Browser只允许出现3种,即主页面(Main),次页面(Sub_O)、第三页(Sub_T),其中主页面Main没有creatontime标记,次页面Sub_Ocreatontime标记值为1,第三页面Sub_TSub_Ocreatontime标记值为2

    2Page页的名称需和页面的Title对应

    3)出现重复的对象,需要合并到(运用MI公司提供的QuickTest Plus中的插件Repositories Merge Utility合并

      http://www.yangfei.org/post/120.html

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

    http://www.51testing.com/?uid-216940-action-viewspace-itemid-218326

     

    QTP对象库管理和编写脚本

    http://blog.csdn.net/aerchi/archive/2010/01/05/5137234.aspx

     

    http://www.w3schools.com/Vbscript/vbscript_looping.asp

     

     

    2.     正则表达式

     我以前就已经知道什么是正则表达式,不过一直没在实际中用过,所以刚开始就想当然地使用。先把我出丑的过程说一遍,刚开始的时候我想检查一个“$123.45”格式。由于只扫了两眼QTP用户指南加上自己主观臆断,正则表达式如下“\$*\.*”。正确答案大家都应该知道了,应该是“\$[0-9]+\.[0-9][0-9]”
            --------------------------------------------------------------------------------
           
    以下是QTP用户手册关于正则表达式的内容

            使用反斜杠字符 ( \ )

            匹配任意单个字符 ( . )

            匹配列表中的任意单个字符 ( [xy] )

            匹配不在列表中的任意单个字符 ( [^xy] )

            匹配某个范围内的任意单个字符 ( [x-y] )

            特定字符的零次或多次匹配 ( * )

            特定字符的一次或多次匹配 ( + )

            特定字符的零次或一次匹配 ( ? )

            对正则表达式进行分组 ( ( ) )

            匹配几个正则表达式中的一个表达式 ( | )

            在一行的开始进行匹配 ( ^ )

            在一行的结尾进行匹配 ( $ )

            匹配包括下划线在内的任一字母数字字符 ( \w )

            匹配任意非字母数字字符 ( \W )

     

    3.     Do where, until

       Do… where

       Perform. a series of statements indefinitely as long as a specified condition is true.

       Do… until

       Perform. a series of statements indefinitely until a specified condition is true.

    4.     描述性编程的语法

     

     

    QTP中使用描述性编程是一个提高QTP脚本利用率的很好的方式。通常QTP是通过对象库来识别不同的对象,而描述性编程是QTP另外一种能够识别对象的途径,它不依赖于对象库,通过增加一些对象的描述来识别对象的。
    说明:本例子是以Flight飞机订票系统的登陆界面为测试页面进行描述的。
    步骤一:录制脚本
     Dialog("Login").WinEdit("Agent Name:").Set "Holly"
     Dialog("Login").WinEdit("Password:").SetSecure "46ef0dc7efe5834c73673898279af1204fea51a7"
     Dialog("Login").WinButton("Cancel").Click
    共录制3步操作,输入Agent Name, Password, 点击Cancel按钮

    步骤二:初级描述性编程
     Dialog("Regexpwndtitle:=Login").WinEdit("Attached text:=Agent Name:").Set "zhangsan"
     Dialog("Regexpwndtitle:=Login").WinEdit("Attached text:=Password:").Set "mercury"
     Dialog("Regexpwndtitle:=Login").WinButton("Class Name:=WinButton", "text:=Cancel").C
    在这里要注意有三点:

    1
    )如果需要两个以上特性来描述一个对象,需要使用逗号(,)对描述性语言进行分割
    2
    )使用:=来连接属性和属性值,并且:=两边不能有空格
    3
    )使用SPY查看对象的属性名和属性值(Tools -> Object Spy
    步骤三:描述性编程提高
     Dim descEditLogin
     Set descEditLogin = Description.Create()
     descEditLogin("Class Name").Value = "Dialog"
     descEditLogin("Regexpwndtitle").Value = "Login"
     Dialog(descEditLogin).WinEdit("Attached text:=Agent Name:").Set "Holly"
     Dialog(descEditLogin).WinEdit("Attached text:=Password:").Set "Mercury"
     Dialog(descEditLogin).WinButton("Class Name:=WinButton", "text:=Cancel").Click
    在这里需要注意有两点:

    1
    )把经常使用到的对象定义为一个对象变量,方便以后调用,减少代码工作量和错误
    2
    )使用SPY获取对象的属性和属性值
    步骤四:使用自定义的环境变量
    File>>Settings>>Environment中选择user-defined,增加一个变量
    dlgLogin =
    Login
    这样脚本可以被修改为:
     Dim descEditLogin
     Set descEditLogin = Description.Create()
     descEditLogin("Class Name").Value = "Dialog"
     descEditLogin("Regexpwndtitle").Value = Environment.Value("dlgLogin")
     Dialog(descEditLogin).WinEdit("Attached text:=Agent Name:").Set "Holly"
     Dialog(descEditLogin).WinEdit("Attached text:=Password:").Set "Mercury"
     Dialog(descEditLogin).WinButton("Class Name:=WinButton", "text:=Cancel").Click
    当然,参数化的方式很多,这边介绍的是使用环境变量

      总结:优点是当对象的一些属性变更后,脚本更容易维护。比如说对于一个通用对象,比如save, reset, cancel等按钮,一个页面有3个,30个页面就有90个对象,假如save变成保存,reset变成重置,cancel变成取消,那么对象库就会产生很大的变动。而使用了描述性编程只需要在导入的XML文件中修改一个值就可以了。当然描述性编程的作用远远不止这些,这次只是抛砖引玉,希望大家共同进步。在QTP中使用描述性编程是一个提高QTP脚本利用率的很好的方式。通常QTP是通过对象库来识别不同的对象,而描述性编程是QTP另外一种能够识别对象的途径,它不依赖于对象库,通过增加一些对象的描述来识别对象的。
      QTP的工作原理有点类似人类社会的某些场景.比如一个朋友委托你带东西给A,如果你认识A,这表明A的容貌特征以及一些联系已经在你脑海有了印象,那么你只要找到了A的住所,那么这个任务就很容易完成了,如果你根本就不认识A,则这个任务就很难完成了. 那在QTP中有没有一种方法,无须在对象库中记录任何关于某个对象的信息,就可以完成对该对象的操作呢,.那就是描述性编程,其工作原理就象上面这个例子
    .
      在QTP,有一按钮对象,对它的操作如下:Dialog("Login").WinButton("OK").Click但是如果我们在对象库中删除这个对象后,执行这句话就会出错,提示找不到对象,在这个时候,我们就可以通过描述性编程给他指定对象及其他的一些属性,修改如下
    Dialog("Login").WinButton("text:=OK").Click
      上面脚本中,通过WinButton("text:=OK")明确告诉QTP去寻找文本属性为OK的按钮,于是QTP正确识别到该对象,顺利的执行了脚本.这种不需要在对象库中存储对象的信息,就可以执行对象操作的方法,就是QTP中比较高级的用法:描述性编程(descrīptive progamming).描述性编程和传统的QTP脚本的区别是:他把需要识别的对象的属性从对象库中转移到了脚本里面,通过在脚本里面的特殊语法格式.来告诉QTP识别对象的方法.描述性编程更加灵活,因为他不需要经过录制这个步骤,可以直接通过编程的方式操作任何一个你想操作的对象,只要你在测试脚本代码里提供给QTP识别该对象的足够信息
      描述性编程的语法格式如下
    :
      
    micClases("property1:=value1","property2:=value2")
      micClass标志某个对象的类别,括号里面通过jproperty:=value的形式告诉QTP识别该对象的必要属性.我们继续修改一下测试脚本:Dialog("Login").WinButton("text:=OK").Click修改后:Dialog("Login").WinButton("nativeclass:=Button","text:=OK").ClickF5执行,结果运行顺利.这次修改,我们使用了一个通用的对象类WinObject,而把按钮当作一个基本属性nativeclass:=Button,同样可以完成对该按钮的操作
      由上面的叙述我们可以看出来,描述性编程没有严格的要求,只要遵循一个原则:在代码中告诉QTP足够他识别该对象的属性,QTP就可以不通过对象库,而是通过描述性编程的方式完成对指定对象的操作.所以描述性编程没有什么神秘的,他无非是把原来存储在对象库中的信息提到代码中来了而已.

    1. 如何管理report
    http://www.7dtest.com/site/html/26/t-3426.html
Open Toolbar