【分享】QTP那点事之Action篇

上一篇 / 下一篇  2011-07-17 14:09:55 / 个人分类:软件测试之QTP

一、Action的管理

QTPTestFlow也是一个层次结构,最顶层的Test工程,在工程下面挂着NAction,通常每个Action有自己的功能,就像C语言的main函数与一般函数。在每个Action下,可能还有一个或多个的Action被调用。这就是Action的层次,一层层调用。由此就可以看出Action之间有两种关系,举个例子:

Test Flow下挂着Action1Action2,而Action1下挂Action3Action4Action3下挂Action5。那么Action1Action2之间就是兄弟关系,而Action1Action3是父子关系。另外还有一种特殊的关系,Action1Action5,它们通过Action3来联系。

二、Action的拆分和合并

Action可以通过Split Action拆分,形式就有兄弟或者父子两种。父子关系就存在调用。

Action的合并有多种方式。

Call一个新的ActionCall一个已经存在的ActionCall一个存在Action的拷贝。

而每种方式又有两种模式,在Test工程的结尾调用或者在当前步之后调用。

Test工程的结尾调用:相当于与已经存在的Action是兄弟关系,而且新的ActionTest工程的末尾。

在当前步之后调用:就是在当前插入了一句调用新的Action的代码,当前步结束就执行被调用的Action

Action调用的语法:

RunAction "Action",迭代次数,输入参数列表,输出参数列表

 

RunAction "Action3", oneIterationnum1num2output

三、Action的迭代模式

Action的迭代次数根据两个因素:一是调用或者设置的迭代次数:oneIteration或者allIteration或者“1-n”;二是DataTable中的数据行数。Global是全局的,作为Test工程迭代数据、每个Action又有各自的sheet

四、Action间的参数传递

Action间的参数传递可以通过设置来实现,也可以进行参数化,在Call properties来进行设置。其中的参数传递必须要有直接的父子结构才行,如果像前面说到的Action1Action5,它们就不能直接来进行参数的传递,而必须通过中间的Action3来实现。

五、Action间的变量访问和共享

1.      通过DataTable共享

DataTable对于每个Action都是可见的

2.      通过环境变量共享

环境变量也是Test工程的共享变量,但是个人认为要是环境变量太多,会不会难以管理?

3.      通过Action之间的参数传递

Action的属性设置和对调用的属性设置来进行参数传递,只有有调用关系才能共享。

值得一提的是Public声明的变量并不能让Action间共享。

六、Action事务时间统计

一个小小的功能,提供对于一个事务的时间统计。

                                                                              

  • QTP那点事之对象识别篇

    2009-05-02 23:42:38

    QTP那点事之对象识别篇

    一、QTP对象识别原理

    从所周知,QTP是通过将对象添加到对象库来识别运行时对象的。那么究竟它是怎么样来识别对象的呢?

    Object Identification中我们可以看到对象识别时四种模式:

    1.      强制属性识别

    可以一个或多个属性的组合,如果根据此级别识别了对象,则退出识别流程。

    如果根据对象库的属性值与运行时不匹配,则报错(无法找到对象)。

    如果属性在当前Application中有多个对象匹配,则使用辅助属性识别模式。

    2.      辅助属性识别

    辅助属性识别是对强制属性识别的一个补充,当强制属性识别识别时匹配多个对象,就根据辅助属性识别设置的属性及属性值来进行识别。

    3.      顺序标识符

    顺序标识符有两个取值:一是Location,根据控件在窗口上的Location值来进行识别,每个控件对应自己的Location值,按从上到下从左到右的顺序取值。二是Index,根据控件各自的Index值来进行识别。比如在windows中的计算器程序,它的数字按钮都被识别为WinButton类型的对象,抛开它们的text值,每个按钮都有各自的Location值和Index值。

    4.      智能识别

    智能识别属性可以分为基本过滤属性和可选过滤属性,它们的关系就像强制属性和辅助属性。

    二、QTP对象模型

    在对象库中保存的对象以树形的结构存在,如果你了解面向对象,那么就很容易理解对象的层级结构。从一个顶层的对象开始(通常是windows对象或者Dialog对象,web程序通常是Browser对象或Page对象),此对象有很多的子对象,子对象下一层又有子对象,直到最底层的对象,例如一个button

    三、QTP对象类型

    曾经看到过有人问ROTO的区别,其实我们可以从它们的写法来判断。RORun-time object的缩写,很明显它是运行时的对象,也就是在实际运行的Application中的对象。而TOTest object的缩写,是测试对象,就是存在于对象库中的对象。

    录制的对象就成为了TOQTP就通过TO来操作RO,所以在TO中必须含有RO的特征才能正确识别RO。说到这,不得不提到其中的四个方法:

    GetRoProperty获取运行时对象属性

    GetToProperty获取测试对象属性

    GetToProperties获取测试对象的属性集

    SetToProperty 设置测试对象属性

    通过这些方法,我们可以对对象进行实时的监控,更重要的是可以在脚本回放过程动态的来修改对象的属性值。

    四、对象库管理

    对象的添加

    1.      录制时自动添加

    2.      对象库里添加

    3.      Active Screen添加

    4.      Step Generator添加

    1 2 4三种都需要Application,通过点击Application上的对象来进行添加,而3是通过Active Screen保存的快照中来点击添加,说穿了,它们都必要要有实际存在的对象才能添加。总不能无中生有,天降对象。

    除此之外,QTP还能实现怎样的对象管理?

    有时为了便于对象的管理,我们可能需要将不同的Action中的对象进行统一管理。这时候我们就可以将每个Action的对象导出到本地,然后比较和合并,进而做一些参数化的设置,最后进行对Action的映射。

    五、描述性编程

          在前面谈到的都是录制回放,必须要通过对象库中对象来识别RO时的对象,当Test工程比较大的时候,对于大量的对象管理也是一件比较费力的事。QTP提供了另外的一种机制,那就是描述性编程。意义在于通过录制下来的测试对象在回放时可能存在比较多的问题,不能回放,使用描述性编程将会灵活的操作对象。描述性编程可以分为行描述性编程和对象级描述性编程。以下代码来显示两者的区别:

    1.行描述性编程

    SystemUtil.Run "C:\WINDOWS\system32\calc.exe","","C:\WINDOWS\system32","open"
    with Window("regexpwndtitle:=计算器
    ","regexpwndclass:=SciCalc")
    .WinButton("text:=1","nativeclass:=Button").Click
    .WinButton("text:=\+","nativeclass:=Button").Click
    .WinButton("text:=2","nativeclass:=Button").Click
    .WinButton("text:=\=","nativeclass:=Button").Click
    .WinButton("text:=C","nativeclass:=Button").Click

    .Close
    end with

    对象类型(“属性1=属性值”,“属性2=属性值”)

    注意:只需指出对象的类型,而不必指定是哪个对象,具体的哪个对象通过属性来识别。

    2.对象创建方式

    需要通过自己创建对象来实现,然后设置对象的N个属性值,达到识别RO的目的。

    MyObj(“属性名”).value=“属性值”

     

     

    Option explicit

    Dim objWin,objBut

    SystemUtil.Run "C:\WINDOWS\system32\calc.exe","","C:\WINDOWS\system32","open"

    Set bjWin=description.Create()

    Set bjBut=description.Create()

    objWin("regexpwndtitle").value ="计算器"

    objBut("text").value="1"

    objBut("nativeclass").value="Button"

    Window(objWin).WinButton(objBut).Click

    objBut("text").value="\+"

    Window(objWin).WinButton(objBut).Click

    objBut("text").value="2"

    Window(objWin).WinButton(objBut).Click

    objBut("text").value="="

    Window(objWin).WinButton(objBut).Click

    Window(objWin).Close

    Set bjBut=nothing

    Set bjWin=nothing

     


  • TAG:

     

    评分:0

    我来说两句

    Open Toolbar