我不在办公室就在星巴克,我不在星巴克就在去星巴克的路上

robot函数实例讲解(一)【转载】

上一篇 / 下一篇  2008-01-26 23:47:22 / 个人分类:robot

功能说明:出现一个提示对话框,N秒后消失,比如说:提示等待一个窗口阿,有时候这个窗口没了,我也不知道脚本运行到什么地方了,提示一下挺好,也方便其他测试员修改,而且,也不影响无人值守的操作

例子:SQAMsgbox "test","title",5

Global iTime as Integer

Declare Function TimedDlgFunc(id As String, Action As Integer, Suppvalue As Long) As Integer

Declare Function SQAMsgBox(sMsgText as String, Optional vMsgCaption as Variant, Optional vTimeOut as Variant) as Integer


Function TimedDlgFunc(id As String, Action As Integer, Suppvalue As Long) As Integer
    Static StartTime
    Dim EndTime
    Dim vTimeoutvalue as Variant

    Select Case Action
        Case 1      'Dialog box Initialization
                StartTime = Timer

                If StartTime + iTime >= 86400 Then
                        StartTime = 86400 - StartTime - iTime
                End If
                TimedDlgFunc = 1

        Case 2      'Button pushed or any control changed (except typing in text or combo box)
            Select Case Suppvalue
                Case 1
                    DlgEnd -1
                Case 2
                    DlgEnd 0
                Case Else
                    TimedDlgFunc = 0
            End Select

        Case 3      'Change in text or combo box contents
                TimedDlgFunc = 1

        Case 4      'Change of control focus
                TimedDlgFunc = 1

        Case 5      'Idle state (return 0 to prevent this being continually called)
                EndTime = Timer
                If (EndTime - StartTime) >= iTime Then
                        DlgEnd -1
                End If
                vTimeoutvalue = Format(iTime - (EndTime - StartTime), "#.#")
                DlgText DlgControlID("txtTimevalue"), CStr(vTimeoutvalue)
                TimedDlgFunc = 1
    End Select

End Function


Function SQAMsgBox(sMsgText as String, Optional vMsgCaption as Variant, Optional vTimeOut as Variant) as Integer
    Dim Result as Integer
    Dim TotalTime As Integer
    Dim sCmdText as String   
    Dim sTimeoutText as String
    Dim vvalue as Variant

   
    If IsMissing(vMsgCaption) Then
        vMsgCaption = "SQAMsgBox"
    End If
    If IsMissing(vTimeOut) Then
        vTimeOut = 20       'seconds
    End If

    sTimeoutText = "Timeout: "
   
'-----
    Begin Dialog dlgMsgBox 200, 80, vMsgCaption, .TimedDlgFunc
        GroupBox 5, 2, 190, 40, "", .grpMsgTxt
        Text 15, 11, 175, 25, sMsgText, .txtMsgText
        Text 15, 47, 180, 20, sCmdText, .txtCmdText
'--------------
        Button 20, 60, 40, 14, "&OK", .btnOK
        Button 140, 60, 40, 14, "&Cancel", .btnCancel
        Text 78, 63, 30, 10, sTimeoutText, .txtTimeText
        Text 108, 63, 20, 10, vTimeout, .txtTimevalue
    End Dialog
'-----

    Dim TimedDlg As dlgMsgBox
    iTime = CInt(vTimeOut)
    Result = Dialog(TimedDlg)
   
    If Result = 2 Then
        SQAMsgBox = sqaFail
    Else
        SQAMsgBox = sqaPass
    End If   
   
End Function

关于Recognition
一共分为Recognition, ParentRecognition, FullRecognition
1. To find the recognition method of the currently active window:
Result=SQAGetProperty(".\","Recognition",value)
Returned value:
Type=Window;Name=frmMain
抓出来的是当前窗口的一些信息

2. To find the immediate parent of the tree view item Bach:
Result=SQAGetProperty("Name=treMain;\;ItemText=Bach","ParentRecognition",value)
Returned value:
Type=TreeView;Name=treMain
抓出来的是树型结构的父结点的信息

3. To find the complete object path of the tree view item Bach, beginning with the desktop and ending with the target object itself:
Result=SQAGetProperty("Name=treMain;\;ItemText=Bach","FullRecognition",value)
Returned value:
Type=Window;Name=frmMain;\;Type=TreeView;Name=treMain;\;Type=TVItem;ItemText=Bach
抓出来的是树型结构中指向该控件的全部路径

RationalRobot中自动进行100次操作
Rational Robot中的SQA Basic与Basic语言极为类似,下面是一个for循环的例子,其中cstri()函数把整数转换成字符串。
Sub Main
    Dim Result As Integer
    Dim i As Integer
    ……
  
     'begin of for loop
     for i=1 to 100 step 1
     ……
     InputKeys cstr(i*3) '这个地方设置输入值为I*3.
     ……
    next
    'end of for loop
    ……
End Sub

使用Rational Robot录制自动测试GUI脚本,在点击一个按钮以后,出现的结果可能有多种,可能会出现一个含“确定”按钮的对话框,也可能出现一个标题为”Title abcd”的窗体,可以使用SQAWaitForPropertyvalue方法来判断出现的属性,或者使用SQAWaitForObject来判断出现何种窗体,下面是两个对可能出现的属性进行判断的例子。

1).2秒内假若出现确定对话框,点击确定按钮,否则打印"确定按钮未出现" :
'等待2秒直到确定按钮出现.
Result = SQAWaitForPropertyvalue("Text=(O)确定", "Enabled",TRUE, 2000)
If Result <> sqaSuccess Then
print "确定按钮未出现"
Else  
    PushButton Click, "Text=(O)确定"   
End If

2).2秒内假若出现标题为"Title abcd" 的窗体,打印"出现标题为Title abcd的窗体" ,否则打印"未出现标题为Title abcd的窗体" :
'等待2秒直到标题为Title abcd的窗体出现.
Result = SQAWaitForPropertyvalue("Caption=Title abcd", "Enabled",TRUE, 2000)
If Result <> sqaSuccess Then
PushButton Click, "Text=(O)确定"
print "出现标题为Title abcd的窗体"
Else  
    print "未出现标题为Title abcd的窗体"
End If


说明:
1).Result是一个Integer型变量;

2).SQAWaitForPropertyvalue:顾名思义,指的是等待一个属性被指定值之前暂停执行。SQAWaitForPropertyvalue("Text=(O)确定", "Enabled",TRUE, 2000)表示等待2秒直到确定按钮出现,如果2秒内未出现,则返回sqlfalse,出现则返回sqlsuccess;

3).SQA Basic中<>表示不等于;

4).另外,可以用SQAWaitForObject来判断出现出现的对象类型:
Result = SQAWaitForObject("Type=PushButton;Text=OK", 2000)
If Result = sqaSuccess Then
     ...          ' add the rest of the actions/tests here
End If

识别控件
需要相应的enabler,你现在测试的程序是delphi开发的应用软件,那么就要加载相应的delphi enabler!

extension manager里边加入了delphi enabler,但是这个还是不能识别出delphi开发中用到的第三方控件或则其他控件!其实这里选择只是个打开使用真正的delphi enabler的开关,真正的delphi其实是一个sqasrvr.pas的单元文件,这个单元文件是识别控件的核心。

ratitonal 2003里边的test enabler安装选项中包含delphi enabler,但是它需要你本机上安装delphi,才会把delphi enabler安装到你的机器上。否则不会出现。

假如安装成功后,会在开始菜单中rational菜单下,rational test菜单下出现个delphi enabler(具体什么名字忘记了)的菜单项,通过它可以调用一个执行文件。
执行文件的功能就是把sqasrvr.pas自动放到工程文件的头。

delphi 工程文件只有加载了这个delphi enabler(核心 sqasrvr.pas)才会让robot识别,当然前提是你的extension manager中delphi选择了。

Robot手工编写GUI脚本如何获取对象识别方法和属性

以计算器为例,下面的脚本是键盘输入“1+1=”,然后关闭计算器。
Sub Main
    Dim Result As Integer

    StartApplication "C:\WINNT\system32\calc.exe"
   
    Window SetContext, "Caption=计算器", ""
    InputKeys "1{+}1{ENTER}"
    Window CloseWin, "", ""

End Sub
   
    Robot提供了获取对象识别方法和属性的利器――Inspector。通过Robot tools-Inspector..打开。现在使用SQAGetProperty命令获取1+1的结果值,并通过msgbox显示该值。
    鼠标左键按住Inspectot工具栏上的“Select Objcet”按钮,然后选择计算器的结果放开鼠标左键。Inspectot中显示出对象的识别方法,鼠标左键点击工具栏上的“Copy recognition String”按钮拷贝识别方法,属性值通过选择Inspector左下角窗口中的Text属性,然后鼠标左键点击工具栏上的“Copy”按钮拷贝属性。修改后的脚本如下:
Sub Main
    Dim Result As Integer
    Dim sum as Variant

    StartApplication "C:\WINNT\system32\calc.exe"
   
    Window SetContext, "Caption=计算器", ""
    InputKeys "1{+}1{ENTER}"
   
    Result = SQAGetProperty ("Type=Label;ObjectIndex=1", "Text", sum)
    msgbox sum
   
    Window CloseWin, "", ""

End Sub

    VU脚本是类C语言,区分大小写。所以在获取识别方法和属性值时最好的方法就是使用Inspector。
    自己编写脚本时,还有一个要注意的问题是窗口上下文,窗口上下文不正确会导致回放时找不到对象。上面的脚本中Window SetContext, "Caption=计算器", ""下面的操作都是在这个窗口上进行的。编写脚本时一定注意看一下窗口上下文是否正确。
    也可以在识别方法中指定窗口上下文,如Result = SQAGetProperty ("Type=Label;ObjectIndex=1", "Text", sum)可以改成Result = SQAGetProperty ("\;Type=Window;Caption=计算器;\;Type=Label;ObjectIndex=1", "Text", sum),第一个“\”代表桌面,“Type=Window;Caption=计算器”是计算器窗口,第二个“\”代表“Type=Window;Caption=计算器”和“Type=Label;ObjectIndex=1”是父子关系。这两个命令的效果完全一样。

SQABasic头文件包含一系列的声明,头文件可以应用到

一.声明共有或则全局常量,变量和用户定义类型

二.声明自定义sub,procedures和function

头文件中的声明可以应用到任何模块(脚本或者类库文件)。用’$include关键字,放在模块开始的地方-例如:

     ’$include “global.sbh”

SQABasic头文件类型

Sqabasic支持两种头文件类型:

一.头文件保存在sqabasic路径。不用指定任何路径信息就可以在本工程或者其他工程中应用他们

二.工程头文件可以保存在TMS_scrīpt文件夹中。不用指定任何路径信息就可以在同一个工程中处理。

这两种SQABasic头文件都有同样的扩展名- .sbh

库文件


库文件包含一个或者更多供procedure从其它文件调用的sub,procedure和function。

一.SQABasic库文件(扩展名为.sbl或则.rec)

注意,.rec文件可以作为脚本文件或者库文件,但是.sbl只能被用作库文件。

二.动态连接库文件(扩展名.dll)

下边的表格这几种类库文件不同的总结:


.sbl
.rec
.dll

位置
SQABasic路径
当前工程文件中Datastore(文件夹 TMS_scrīpt)
TMS_scrīpt/dll文家夹或则其他位置

范围
在SQABasic路径中,对所有工程文件都可用
对同一个工程所有脚本可用
依靠位置

验证点
不支持
支持标准的robot验证点
支持自定义验证点


任何.rec文件都能作为库文件。不管怎样,如果一个.rec文件作为脚本(可以从robot中直接运行或者用callscrīpt命令),他必须有一个main过程。

在SQABasic库文件中声明过程


如果在SQABasic过程中有一个自定义的过程,你声明类文件的方法同样适用声明过程。

下边的例子是在sqabasic库文件中(mylib.sbl)声明一个自定义过程(mysub):

     Declare Sub MySub Basiclib “MyLib”( arg1 as string,arg2 as integer)

一.关键字basiclib,表示过程mysub在一个sqabasic库文件中

二.库文件的名字“mylib”,这里不需要写扩展名(.sbl或者.rec)

备注:basiclib关键字特指.sbx库文件的声明(和.dll库文件相对),这里不需要也不推荐带有.sbx扩展名的声明。


什么地方声明SQABasic库文件

可以在任何位置声明SQABasic库文件

一.在脚本或者其他库文件,仅在模块中应用过程

二.头文件中,用道的模块

库文件包含不需要指定的例程或者’include头文件

在dll文件声明过程文件


如果在dll文件的自定义过程,声明过程同样可以声明dll文件。

下边是dll文件中(mydll.dll)声明自定义过程(mysub)的例子:

       declare sub mysub lib “mydll”(byval arg1 as string,Byval arg2 as integer)

一.声明中加入Lib关键字,表示声明的过程在dll文件中(相对于.sbl或者.rec sqabasic库文件)

二.库文件名字(mydll),跟随库指定的名称

三.参数声明通常包括关键字byval(参数声明包括任何关键字)


如果编译位置在sqabas32路径或在系统路径的库文件(.dll),你不用特别声明路径。如果库文件不再sqabas32或者在系统路径,你需要制定路径,比如

       Declare Sub MySub Lib “E:MyDll”  (byval arg1 as string,Byval arg2 as integer)

在什么地方声明dll文件


你可以声在任何为指声明dll文件:

1.脚本或者sqabasic库文件,要用过程的模块

2.头文件,任何模块指定的头文件

SQABasic路径


Sqabasic路径是robot保存和寻找sbl库文件和头文件的地方,用户在robot中也可以定义。

一旦你在robot中指定sqabasic路径,这个路径是固定的。不管怎样,robot自动设置sqabasic路径,当下列条件是真的时候:

           i.仍没有明确在robot中定义sqabasic

         ii.已经在rational Aministrator建立新的工程和数据仓库

        iii.打开最近创建的工程和数据仓库

当上边所有条件为真的时候,robot自动在新工程和数据仓库中设置sqabasic路径到下列位置:

[NewProject][NewDatastore]DefaultTestscrīptDatastoreTMS_scrīptSQABas32

设置步骤:

1)点Tools->General Options

2)点Preferences页面

3)在SQABasic路径中输入路径

Rational test早期版本没有提供菜单选项来设置sqabasic路径 – 参阅sqa common directory片断

指导使用头文件和库文件


推荐下边使用库文件方法:

a)自定义函数或者过程应该使用有同样文件名字的头文件(.sbh)和库文件(.sbl),比如DataFunctions.sbh和DataFunctions.sbl。这个过程和函数在头文件中定义(指定声明头文件)和在库文件中定义。看下边的例子

b)分离头文件(参阅常量头文件)用于包含常量,变量和用户定义类型用于脚本或者库文件调用。头文件用同样的文件名字后边附加_x或则_C(附加是早期命名规定)。注意包含常量和变量的头文件必须加入到声明头文件和库文件之前。(DataFunctions.sbh和DataFunctions.sbl),比如’include “DateFunctions_c.sbh”。这样做很容易维护。

c)通过分类或者程序把相关的函数放在同一个库里,例如,把所有日期相关的函数放到DataFunctions.sbh/sbl,或者把所有的函数加入为特定程序开发的函数库中(比如AppName.SBH/SBL)


d)函数是在库文件中子程序的的首选方式,处分过程的结果对于调用脚本是不相关的。函数应该返回一个值,或者适当的,数据可以通过变量或者数组返回。在后边的例子中,函数返回的结果表示成果或者失败。


e)库文件中的所有得函数和子程序必须有“注释“,包含这个过程的目的和用途::

请看下边的例子。


f)库文件的注释有合理的解释,通过读注释可以知道过程的逻辑


g)如果开发和维护robot库文件是集中管理的方式,那么你可以加入到’$include 所有库文件到global.sbh头文件中,这样做对所有头文件都有用。这可以加入缺省的脚本模板。作为选择,测试人员在每个脚本中可以选择或者包含需要的库文件。

转载请注明信息来源51testing


TAG: robot

 

评分:0

我来说两句

Open Toolbar