软件测试论坛

 找回密码
 软件测试论坛注册页
查看: 6864|回复: 25

Robot使用技巧和实用函数集贴

  [复制链接]
发表于 2004-12-23 18:55:00 | 显示全部楼层 |阅读模式
软件测试工程师就业班马上开班
第一个:(转自网上)

*******************************************************************
功能说明:出现一个提示对话框,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
*******************************************************************

ISTQB
 楼主| 发表于 2004-12-23 19:02:00 | 显示全部楼层
软件测试工程师就业班马上开班
第二个:(来自于网上)
******************************************************************
关于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","arentRecognition",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
抓出来的是树型结构中指向该控件的全部路径



[此贴子已经被作者于2004-12-23 11:09:46编辑过]

ISTQB
 楼主| 发表于 2004-12-23 19:11:00 | 显示全部楼层
软件测试工程师就业班马上开班
第三个:(来自于网上)

****************************************
Rational Robot中自动进行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
发表于 2004-12-23 19:24:00 | 显示全部楼层
软件测试工程师就业班马上开班
从网上也看到了一些,贴出来给大家看看.

------------------------------
自动化测试:SQA Basic中对将要出现的环境进行判断
Authoravid Euler
Date: 2004/10/20
Email:de_euler-david@yahoo.com.cn

有任何问题,请与我联系

使用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

发表于 2004-12-23 19:25:00 | 显示全部楼层
软件测试工程师就业班马上开班
识别控件
需要相应的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选择了。
发表于 2004-12-23 19:27:00 | 显示全部楼层
软件测试工程师就业班马上开班
出现一个提示对话框,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
发表于 2004-12-23 19:28:00 | 显示全部楼层
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”是父子关系。这两个命令的效果完全一样。
发表于 2004-12-23 19:28:00 | 显示全部楼层
SQABasic头文件包含一系列的声明,头文件可以应用到

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

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

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

     ’$include “global.sbh”

SQABasic头文件类型

Sqabasic支持两种头文件类型:

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

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

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

库文件


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

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

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

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

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



.sbl
.rec
.dll

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

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

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


任何.rec文件都能作为库文件。不管怎样,如果一个.rec文件作为脚本(可以从robot中直接运行或者用callscript命令),他必须有一个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]DefaultTestScriptDatastoreTMS_ScriptSQABas32

设置步骤:

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和Data
发表于 2004-12-23 19:29:00 | 显示全部楼层
Rational Robot中文件操作(一)

Rational Robot中提供了一个文件操作命令,语法如下:
Open filename$ [For mode] [Access access] [lock] As [#] filenumber% [Len = reclen]
这里我们把它的语法分为两部分,因为这个文件操作命令有两种文件操作模式,一种是顺序文件,一种是随机文件。

下边是对顺序文件操作的语法:
Open filename$ [??For [Input |Output |Append] As [#]filenumber [Len = buffersize]
参数说明:
说明:

  (1)参数filename$表示要打开的文件名,文件名可以包含有驱动器和目录

  (2)Input Output 和Append用于设置顺序文件的打开方式。其中,Input表示从打开的文件中读取数据。以这种方式打开文件时,文件必须存在,否则会产生错误。Output表示向打开的文件中写入数据。以这种方式打开文件时,文件中原有的数据将被覆盖,新的数据将从文件开始写入。如果文件不存在,则创建一个新文件。Append表示向打开的文件中添加数据。以这种方式打开时,文件中原有的数据将被保留,新的数据将从文件为开始添加。如果文件不存在,则创建一个新文件。

  (3)As[#]filenumber 子句用于为打开的文件指定文件号.对文件进行读写操作时,要用文件号表示该文件.文件号是介于1~511之间的整数,既可以是数字,又可以是变量.也可以省略不用.

  (4)当在文件与程序之间拷贝数据时,Len=buffersize子句指定缓冲区的字符数.

例子:
Open “c:\test.dat" For Output As 1
Open “c:\test.dat" For Output As 1
  这两句代码在c盘所在目录下创建了一个名为test.dat的文本文件,分配文件号为1.
Open “c:\test.dat"??For Input As [#]filenumber  这条语句是从文本文件中读取数据.
Open App.Path + "\test.dat" For Append As [#]filenumber?? 这条语句则是向文本文件中添加数据
随机文件的操作:
  操作随机文件之前,首先必须定义用于保存数据项的记录类型.该记录是用户自定义数据类型,他们是随机文件中存储数据的基本结构.例如:

Type Student
 No As Integer
 Name As String * 20
 age As Integer
End Type

Dim Stud As Student ‘定义一个可以存放学生材料的变量
  随机文件中,所有的数据都将保存到若干个结构为Student类型的记录中, 而从随机文件中读出的数据则可以存放到变量Stud中.之后我们就可以打开并读写文件了.

随机文件的操作语法格式:
Open filename For Random as [#]filenumber Len = Reclength
  说明:
  (1)参数filename 和filenumber 分别表示文件名或文件号.
  (2)关键字Random 表示打开的是随机文件
  (3)Len子句用于设置记录长度,长度由参数Reclength指定.Reclength的值必须大于0,而且必须与定义的记录结构的长度一致.计算记录长度的方法是将记录结构中每个元素的长度相加.例如前面声明的Student的长度应该是2+20+2=24字节.
打开一个记录类型为Student 的随机文件的方法是:
Open "c:\Student.txt " For Random As #1 Len = 25

这里还有一种文件操作方式二进制文件,下边是他的语法格式:
Open pathname For Binary As [#]filenumber
  说明:
  (1) 参数filename 和filenumber 分别表示文件名或文件号.
  (2)关键字Binary 表示打开的是二进制文件
  (3)对于二进制文件,不能指定字节长度.每个打开的二进制文件都有一个自己的指针,文件指针是一个数字值,指向下一次读写操作的文件中的位置.二进制文件中的每个”位置”对应一个数据字节,因此,有n个字节的文件,就有1到n个位置.

  我们可以用Seek()函数返回当前的文件指针位置(即下一个要读写的字节 );用Loc()函数返回上一次读写的字节位置,除非用Seek语句移动了指针,Loc()返回值总比Seek()的小1.我们来看下面的例子:
Open “路径:\student.txt” for Binary as #1? ? 该语句用二进制的方式打开了student.txt文件.


发表于 2004-12-23 19:29:00 | 显示全部楼层
Rational Robot中文件操作(二)

二)写文件
  1、 顺序文件
  写顺序文件我们可以用Write # 和Print #语句向一个已经打开的文件中写入数据.
  下面是他们的格式和说明:

  Print # 的语法格式:

  Print # 文件号,变量列表

  例如,将文本框中的文本写到文件中,代码如下:

Open "file.txt" For Output As #filenum

Input #filenum, text1.text

  Write # 语句的语法格式:

Write # 文件号,变量列表

  说明:用Write # 语句写入的信息便于以后用Input #语句来读取数据,因为Write #语句自动将写入到文件中的信息用逗号分开,并为字符串数据加上双引号.例如:

Open "student.txt" For Output As #filenum

Write #filenum, "张三", "初一年级", 14
Write #filenum, "李四", "职业高中", 18

  2、 随机文件

  向随机文件中写入数据,使用Put #语句.语法格式如下:

Put [#] FileNum ,[RecNum],UserType

  说明:

  (1) FileNum 是要打开的文件号;RecNum是要写入的记录号,若省略,则再上一次用Get 和Put语句所读写过的记录的后一条记录中写入,如果没有执行过Get 和Put语句,就从第一条记录开始

  (2)UserType 是包含要写入数据的用户自定义的数据类型变量.例如:我们向前面的student.txt文件中的第5个记录写入数据,可用这些语句:

stud.No = 0301
stud.Name = “王武”
stud.Age =20
Put #1 ,5,stud

  如果要插入的数据不只一两条的话,首先要确定文件和每条记录的长度,这样就可以计算出文件中究竟有多少条记录.我们可以用Lof()函数返回文件的长度,Len()函数返回每个记录的长度,计算文件中的记录个数可以用文件的长度除以给个记录的长度.示例如下:

Nextrec= (Lof(1)\Len(UserType))+1

Put #1,Nextrec,UserType

  3、二进制文件

  下面是以二进制方式写入文件的语句格式及其说明:

  格式:

Put [#]fileNumber ,[Pos], Var

  功能: 用二进制方式,从文件的中指定的位置开始写入,所给变量长度的数据

  说明:

  (1)FileNumber是以二进制方式打开的文件号.

  (2)Pos用来指定写操作发生时的字节位置,若省略,则使用当前文件指针位置.

  (3)Var是用来存放写入的数据的变量.该语句会自动根据var变量包含的字节长度写入文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.

  使用方法可参考二进制文件的读操作.

以上是Rational Robot中的文件操作的总结,欢迎大家交流!


发表于 2004-12-23 19:30:00 | 显示全部楼层
Rational中DataPool的介绍与实际应用

本文对datapool进行简单介绍的同时结合实际功能测试和性能测试的来讲界使用datapool。希望对广大的软件测试人员有帮助。由于写作



DataPool是一种测试数据集,在测试脚本回放的时候提供给脚本的变量。datapool可以由rational产品robot或TestManager创建,下边的表格列举出在robot和testmanager中可以对datapool执行的操作:



操作
Robot
TestManager

在测试脚本中自动建立datapool

  

创建测试脚本并产生自动数据



修改vu脚本中的datapool设置

  

修改datapool字段定义并修改测试数据



创建并修改数据类型
  


管理datapool比如改名或者拷贝
  


倒入到出数据
  


倒入数据
  



备注:rational中datapool有两种文件:txt和csv文件,创建datapool成功后会保存在

盘符:\工程文件目录\TestDatastore\DefaultTestScriptDatastore\TMS_Datapools文件夹下

测试数据保存在有csv扩展名的文本文件中,所有字段信息保存在后缀名为spc的文件中,该文件由testmanager管理。



datapool有两种创建方法,一种是在testmanager中建立,一种robot录制vu脚本时自动建立同名datapool,只有在robot中tools->session record options, 设置Generator页面general的use datapool选项,才可以生效。下边分别介绍这两种创建和使用方法:

一.

建立datapool:

  1.启动Rational TestManager;

2.Tools>Manage>Datapool,点击New…,输入数据池名称点“确定”;

3.在打开的Data Type Specification中添加字段定义;(字段定义说明见后)

4.生成数据Generate Data(产生大量数据,这里默认产生100个数据)

5.修改其中的数据Edit DataPool data



其中字段定义说明:

1) Name 指的是数据池列标题名它与测试脚本中变量相一致。如果你改变了数据池列名,也必须保证测试脚本中的变量做相应的改变;如果你不是在Rational测试环境下建立的数据池然后导入它,TestManager自动给数据池列分配缺省的名称。也必须保证测试脚本中的变量与其相一致。你可以用ime给datapool字段起多字节的名字

2) Type 标准的或用户定义的数据类型都按名称向数据池列提供其值。犹如建立数据库,先建立字段名,后改动类型。

制定数据池列的数据类如下操作:

a、选择标准类型或已存在的用户定义数据类型,点击当前显示的数据类型名称,然后从列表中选择新的数据类型。

b、可以选择rational中的标准的数据类型。

c、如果想自定义一个类型名称而不是进行选择,在用户定义数据类型前输入星号,如:*MyData;

d、建立新的用户定义数据类型,输入数据类型名称(不要带*),然后点击Return。在你点击了Yes确定你想要建立用户定义的数据类型,

  例如:建立新的column,输入列名,输入DemoType(自定义类型),保存。这时会出现数据类型属性编辑对话框(我向Description中输入描述信息,确定按钮不可用,可能是rational的bug,不知道告诉ratioanl有没有奖励),确定,出现另一个数据类型属性编辑界面,输入测试数据,退出。选中该行生成数据,testmanager会自动创建你输入的数据。

e、建立新的用户定义数据类型。

3) Sequence 数据类型的值的顺序被写入数据池列中。只要从中进行选择即可:-Random-随机向数据池列中写入数字和字母的值。-Sequential-顺序写出,如0,1,2,3,... Sequential仅仅支持数字值(包括日期和时间) 和生成的用户定义的日期类型。当你选择数字类型,必须确定其最大和最小的范围,间隔必须大于0;-Unique即其中的值是唯一的。也可定义最大最小值。

4) Repeat 即出现在数据池列的时间,Repeat不能为0。要想设置有符号的整数和用户定义的数据类型的唯一性,设置Reapeat为1。当定义唯一值时,确定生成的数在你定义的范围之内。

5) Length 数据池列中存在的最大的数。这个长度包括小数点和负号。

6) Decimals 定义最大的浮点数的小数位,最大的设置是6位。

7) Interval 如果你在数据池列中设置了间隔,那么将按照你设置的顺序,而顺序变化。最小的间隔是1,最大的间隔是999999在数字数据类型下选择了Sequence,并定义了最大和最小范围,间隔必须大于0。这设置仅仅在数字设置时有效。

8) Minimum 确定数字最小值这设置仅仅在数字设置时有效。

9) Maximum 确定数字最大值这设置仅仅在数字设置时有效。

10) Seed 是Rational Test为了计算随机值的数。相同的种子数产生相同的随机数,要改变随机顺序,改变种子数。

11) Data File 用户定义的数据类型的路径,这个路径是自动付给你的,不能进行修改。数据类型文件存放在你的项目文件中的Data Type目录,不能进行直接修改。

4、 在设置好字段后,在No. of records to genarete:中输入要生成的记录数,然后点击Genarete Data 即可生成数据,或者点击SAVE按钮,关闭当前窗口,然后点击manage datapools>edit>edit datapool data,直接手工输入数
发表于 2004-12-23 19:31:00 | 显示全部楼层
Rational中DataPool的介绍与实际应用2  

第一步:创建名字为dp的datapool,假如字段name,password并自动生成数据,然后把测试用例中各种数据输入dp中

第二步:录制功能测试脚本,脚本如下:



Sub Main

    Dim Result As Integer



    'Initially Recorded: 2004-4-24  10:59:24

    'Script Name: Five

    StartApplication "xxx"

   

    Window SetContext, "Caption=登陆", ""

    InputKeys "sa"

    EditBox Click, "ObjectIndex=1", "Coords=34,9"

    InputKeys "sa"

    PushButton Click, "Text=登陆"

   

    Window SetContext, "Caption=登陆;Class=#32770", ""

    PushButton Click, "Text=确定"

   

End Sub



第三步:循环读出datapool数据,进行自动化测试,脚本如下

'$Include "sqautil.sbh"



Sub Main

    Dim Result As Integer

    Dim dp_id as Long

    Dim dp_Result as Long

   

    Dim strName as String

    Dim strPassWord as String

   

    'Initially Recorded: 2004-4-24  10:30:51

    'Script Name: Four



    StartApplication "xxx"

    Window SetContext, "Caption=登陆", ""

    dp_id = SQADatapoolOpen ("dp", FALSE, SQA_DP_SEQUENTIAL, FALSE)

   

dp_Result = SQADatapoolFetch (dp_id)

   

     while dp_Result <>  sqaDpEOF

   

           dp_Result = SQADatapoolValue (dp_id, "name", strName)

           dp_Result = SQADatapoolValue (dp_id, "password", strPassWord)

           dp_Result = SQADatapoolFetch (dp_id)

         

           InputKeys strName

           EditBox Click, "ObjectIndex=1", "Coords=34,9"

           InputKeys strPassWord

           PushButton Click, "Text=登陆"

   

           Window SetContext, "Caption=登陆;Class=#32770", ""

           PushButton Click, "Text=确定"

    wend



    dp_Result = SQADatapoolClose (dp_id)

   

End Sub



第四步: 加入执行成功和失败的result信息并写入Result report中,和必要的除错处理。对脚本进行优化。加入BASELINE设置(对于测试基线有两种思路,一种是文件处理,采用文件类型为文本文件或者EXCEL或者WORD,读取DATAPOOL测试数据和文件内容对比,检测测试数据是否在文件中存在,当然这里的测试基线考虑的不够周全,你可以定制规则,逐步完善,一种是直接从数据库中读取数据进行对比,用数据库作为baseline来避免以后增加测试用例后改动baseline文件,当然这么做跟测试理论不合,应该把预期输出保存到特定文件中作为baseline,这个留给你自己动手来改进)。

发表于 2004-12-23 19:32:00 | 显示全部楼层
Rational中DataPool的介绍与实际应用3

'$Include "sqautil.sbh"



Sub Main

    Dim Result As Integer

    Dim dp_id as Long

    Dim dp_Result as Long

   

   

    Dim strMessage as String

    Dim vSText as string

   

    Dim cnn As object

    Dim Rst As object

  

  Dim strLink As String

    Dim strSql As String

   

    Dim strName as String

    Dim strPassWord as String

   

    'Initially Recorded: 2004-4-24  10:30:51

    'Script Name: Four

   

    strLink = "连接字符串"

   

    Set cnn = CreateObject("ADODB.Connection")

    Set Rst = CreateObject("ADODB.Recordset")

  

    cnn.Open strLink

    Rst.CursorLocation = 0

    Rst.LockType = 1

    Rst.CursorType = 2

  

   

   

     On Error Goto Last

     StartApplication "xxx"

   

     Window SetContext, "Caption=登陆", ""

     

     dp_id = SQADatapoolOpen ("dp", FALSE, SQA_DP_SEQUENTIAL, FALSE)

   

     dp_Result = SQADatapoolFetch (dp_id)

     

     if (dp_Result = 0) then

          while dp_Result <>  sqaDpEOF

   

                dp_Result = SQADatapoolValue (dp_id, "name", strName)

                dp_Result = SQADatapoolValue (dp_id, "password", strPassWord)

                dp_Result = SQADatapoolFetch (dp_id)

           

               

                     

                InputKeys strName

                EditBox Click, "ObjectIndex=1", "Coords=34,9"

                InputKeys strPassWord

                PushButton Click, "Text=登陆"

               

           strMessage = "用户名:" + strName + "; 密码:" + strPassWord  

               

strSql = "select * from login where name = "" " + strName + " "" and password = """ + strPassWord + """"

                Rst.open strSql, cnn

   

   

     Window SetContext, "Caption=登陆;Class=#32770", ""

   ‘这个函数是作为插入验证点,验证点为窗体提示信息,没有用window image来作为验证点,是因为无法把该脚本进行模块化,存入shl文件中,将来多平台使用。

                SQAGetProperty  "Label", "Text", vSText

                              

               

'如果rst.RecordCount返回值为1,说明此用户在数据库中存在测试用例分为成功,失败的测试用例,

失败的测试用例中即使数据错误,但有预期输出就是成功的用例,所以写入result report中的信息分

为三种,成功,失败,预期失败,对于程序中有不是预期的窗体,用程序自动关闭掉,继续执行,这

安全的做法做标志然后关闭整个软件,重新启动软件,测试脚本从失败处继续执行

if Rst.RecordCount= 1 then

    if (vSText="登陆成功") then

      PushButton Click, "Text=确定"

      SQALogMessage sqaPass, "测试数据为" + strMessage + "的测试用例执行成功", "项目名称"

     else

      '出现异常窗体,该用例测试失败

     SQALogMessage sqaFail, "测试数据为" + strMessage + "的测试用例执行失败", "项目名称"

     SQAGetProperty "Window", "Text", vSText   

     SQALogMessage sqaFail, "出现错误窗体:"+ vSText, "项目名称"

     Window CloseWin, "Caption=" + vSText, ""

    end if   

  else

     if (vSText="登陆失败") then

     '数据错误,用例执行失败,软件功能正常

      PushButton Click, "Text=确定"   

      SQALogMessage sqaFail, "测试数据为" + strMessage + "的测试用例执行失败但软件功能正常", "项目名称"

       else

      '出现异常窗体,该用例测试失败

      SQALogMessage sqaFail, "测试数据为" + strMessage + "的测试用例执行失败", "项目名称"

       SQAGetProperty "Window", "Text", vSText   

        SQALogMessage sqaFail, "出现错误窗体:"+ vSText, "项目名称"

        Window CloseWin, "Caption=" + vSText, ""  

        end if   

        end if

               

          wend

   

          dp_Result = SQADatapoolClose (dp_id)

    else

         SQALogMessage sqaFail, "数据池打开失败", "项目名称"

    end if



Last:

      SQALogMessage sqaFail, "测试脚本发生异常,测试脚本执行失败", "项目名称"     



   

End Sub





总结:

      上边脚本是对登陆功能测试自动化初步优化后的代码,后边还要做的是脚本模块化,
发表于 2004-12-23 19:32:00 | 显示全部楼层
Rational中DataPool的介绍与实际应用4

二.性能测试脚本自动建立测试datapool

在robot中tools->session record options, 设置Generator页面general的use datapool选项,才能在产生datapool.

一般录制性能测试脚本,遵循如下步骤:

第一.设置录制Session选项

第二.启动录制对话

第三.启动客户端程序

第四.产生脚本

第五.关闭客户端程序

第六.停止录制



设置选项:

1.录制方法(method): api, network,proxy,custom四种选项设置

   通过分析要测试的软件架构来选择录制的方法,下边的表格提供参考:

Situation
Api
NetWork
Proxy

The client application access secure data from a Web server
Required
  
  

The Client Application access data from a web server
Recommended
Fist Alternate
Second alternate

The client application accesses objects on a DCOM Server
Required
  
  

The client application access an oracle8 database or oracle arrays.
Required
  
  

The client application access an Oracle database.(For network and proxy recording, supply the name of the oracle database,)
Recommended
First alternate
Second alternate

The client application is not installed on the local computer
  
Recommended
Alternate

The client application is not running on Windows NT4, Windows XP, or Windows 2000
  
Recommended
Alternate

You want to record traffic from multiple client applications that reside on different commputers
  
Recommended
Alternate

You want to record traffic between multiple,specific clent and server computers.
  
  
Recommended

Neither the client nor the serer computer is on same network segment  as  the  local computer
  
  
Required

An Ethernet controls network traffic, and neither the client nor the server application is installed on the computer
  
  
required

The client application accesses a TUXEDO Server
Recommended
Alternate
  

“On-the-wire” recording support is lacking
Recommended
  
Alternate

Api recording is not functioning properly
  
Recommended
Alternate

FDDI,ATM,or other hight-speed networks are used
  
  
Recommended


备注:上图参考rational robot user’s guide,

      NetWork录制方式必须安装Rational网络驱动才能生效

      安装方法:

1.     开始-〉设置-〉网络和拨号连接

2.     点本地连接

3.     点安装,选择协议,点添加

4.     点选者从磁盘安装

5.     打开安装目录C:\Program Files\Rational\Rational Test\driverw2k(安装rational的目录),选者inf文件,确定

6.     选择ethernet 或者 token ring都可以



2.Generator Filtering

  Filtering

(1).设置autoFiltering使robot生成脚本时自动选择可用协议,下边协议选者列表可用

特别说明DCOM是一种独占的协议,不能和其他协议共存

       如果后台是SQLSERVER,选择SQLSERVER,如果后台是ORACLE,选择ORACLE协议。根据软件实现方式,选择不同的协议。

           (2). 设置Manual Protocol Filtering使robot生成脚本时手工选择协议

3.Generator Per Protocol

  只能对在generator Filtering选择的部分协议(http,iiop,Oracle,Tuxedo,和dcom)起作用。


发表于 2004-12-23 19:33:00 | 显示全部楼层
Rational中DataPool的介绍与实际应用5  


实际应用:

为了说明问题。我用分别用vb,delphi, DotNET实现一个简单添加用户的功能,后台用ACCESS数据库,例用ado通过odbc连接。

1.         分析程序实现的结构,是简单的c/s结构,利用odbc连接。并且客户端,服务器端都配置在一台计算机。(请注意这个是条件,我们第二步选择的基础)

2.         设置session Record Options

录制方法选择api record录制,协议用odbc。(如果我后台换sqlserver或则oracle,其他实现方式不变,应该选择什么协议,因该添加什么协议)

3.         Vb,delphi编码方式的功能脚本录制成功(创建同名datapool)。DotNet脚本录制成功,却无法产生同名的datapool(怎么办)。不成功脚本如下:

       /*

      ->-> Session File Information <-<-

       Created: Sun Apr 25 23:24:36 2004

          Name: G:\Program\robot\lead\TestDatastore\DefaultTestScriptDatastore\TMS_Sessions\demo.wch

          Type: Rational Robot - API

                (with ODBC)

*/



#include <VU.h>

{



push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */

push Think_def = "LR";

Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */

push Timeout_val = Min_tmout;



/* No Datapool Items Remain */

/* After All Data Analyses. */





VBNETDemo = sqlconnect("VBNETDemo", "", LOOKUP_PWD,

                       "VBNETDemo", "odbc",

                       "DRIVER_INFO='DSN=?;;UID=DEFAULTWD=DEFAULT;'");



/*

{ INFO SERVER "UNKNOWN"="0.0.0.0"; }  */

/*

Unable to determine Server Name/Address  */



set Server_connection = VBNETDemo;



push Think_avg = 0;

stmt_2_1_id = sqlopen_cursor ["pre001"] "", "select * from login";





set Think_avg = 313;

push CS_blocksize = 1;



sqlfetch_cursor ["pre002"] stmt_2_1_id, ALL_ROWS;



set Think_avg = 0;



sqlclose_cursor ["pre003"]  stmt_2_1_id ;





set Think_avg = 4078;

stmt_2_2_id = sqlopen_cursor ["pre004"] "", "INSERT INTO `login` (`name`,`password`) VALUES (?,?)",

   "'f\002'<varchar(50):I>",

   "'f\002'<varchar(50):I>";





set Think_avg = 0;



sqlfree_cursor( stmt_2_2_id );



set Think_avg = 2781;



sqlfree_cursor( stmt_2_1_id );





sqldisconnect(VBNETDemo);



pop [Think_def, Think_avg, Timeout_val, Timeout_scale];



pop CS_blocksize;



}

        点 EDIT->Datapool information 报错没有datapool config ,那就动手修改脚本

4.修改脚本后如下

            /*->-> Session File Information <-<-

       Created: Sun Apr 25 23:24:36 2004

       Name: G:\Program\robot\lead\TestDatastore\DefaultTestScriptDatastore\TMS_Sessions\demo.wch

          Type: Rational Robot - API

                (with ODBC)

*/



#include <VU.h>

{



push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */

push Think_def = "LR";

Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */

push Timeout_val = Min_tmout;



/* No Datapool Items Remain */  红色字体是无法生成datapool的解释

/* After All Data Analyses. */



DP1 = datapool_open("lead");   //添加的脚本

datapool_fetch(DP1);          //添加的脚本





VBNETDemo = sqlconnect("VBNETDemo", "", LOOKUP_PWD,

                       "VBNETDemo", "odbc",

                       "DRIVER_INFO='DSN=?;;UID=DEFAULTWD=DEFAULT;'");



/*

{ INFO SERVER "UNKNOWN"="0.0.0.0"; }  */

/*

Unable to determine Server Name/Address  */



set Server_connection = VBNETDemo;



push Think_avg = 0;

stmt_2_1_id = sqlopen_cursor ["pre001"] "", "select * from login";





set Think_avg = 313;

push CS_blocksize = 1;



sqlfetch_cursor ["pre002"] stmt_2_1_id, ALL_ROWS;



set Think_avg = 0;



sqlclose_cursor ["pre003"]  stmt_2_1_id ;





set Think_avg = 4078;

stmt_2_2_id = sqlopen_cursor ["pre004"] "", "INSERT INTO `login` (`name`,`password`) VALUES (?,?)",

   "'f\002'<varchar(50):I>",

   "'f\002'<varchar(50):I>";





set Think_avg = 0;



sqlfree_cursor( st
发表于 2004-12-23 19:34:00 | 显示全部楼层
用Excel做Datapool实现Rational Robot 功能测试的一个实例
Rational Robot是一个比较通用的软件测试工具。她主要通过录制(自动或手工)脚本用于功能测试和性能测试。

在手工修改Robot录制的GUI脚本时,经常用到Datapool这一概念,由于Rational自带的Datapool工具只能支持2000行的数据池纪录,而且编辑不是很方便。现用比较方便的Excel作为数据源,实现自动测试的功能。

前提条件:OS系统中已经安装Office。

[源码]

'$include "sqautil.sbh"
Sub Main
    Dim Result As Integer
    dim excel as Object
    dim book as Object
    dim worksheet as Object
    dim s_name as String
    dim s_pass as String
    dim count as Integer

    'Initially Recorded: 2004-4-2  :16:55
    'Script Name: AUT_1_Login
   
    Window SetContext, "Caption=Program Manager", ""
    StartBrowser "C:\Program Files\Internet Explorer\IEXPLORE.EXE", "WindowTag=WEBBrowser"
   
   
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Initiliaze excel
    on error resume next
    Set excel = GetObject(,"excel.application")
    if(excel Is Nothing) then
        Set excel = CreateObject("excel.application")
        if(excel Is Nothing) then
            MsgBox "Couldn't find Excel!"
            Exit Sub
        End if
    End if
   
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Set book = excel.Workbooks.Open("Your Book1.xls")
    Set worksheet = book.Worksheets("Your Excel sheet's name")
        
    For count=1 To 2
    s_name = worksheet.Cells(1,count).Value
    s_pass = worksheet.Cells(2,count).Value
    'print s_name,s_pass
   
    Window SetContext, "Caption=Web应用系统 - Microsoft Internet Explorer", ""
    Browser SetFrame,"Type=HTMLFrame;HTMLId=mainframe",""
    Browser NewPage,"HTMLTitle=Title",""
    EditBox Click, "Type=EditBox;Name=userAccount", "Coords=26,10"
    InputKeys s_name &"{TAB}"&s_pass
    PushButton Click, "Type=PushButton;HTMLText=登录"
   
    Window SetTestContext, "Caption=Web应用系统 - Microsoft Internet Explorer", ""
    Browser SetFrame,"Type=HTMLFrame;HTMLId=mainframe",""
   
    Window SetTestContext, "Caption=Microsoft Internet Explorer", ""
    Result = LabelVP (CompareProperties, "Text=输入错误,请重新输入!", "VP=Object Properties;ExpectedResult=FAIL")
    Window ResetTestContext, "", ""
      
    Next count

    'Quit Excel'''''''''''''''''''''
    excel.Quit
    Set excel = Nothing
   
    Window CloseWin, "", ""
   
End Sub

发表于 2004-12-23 20:30:00 | 显示全部楼层
不错!顶!!
发表于 2004-12-24 00:31:00 | 显示全部楼层
我也弄两段。哈哈!

Robot GUI脚本操作SQL SERVER数据库

代码如下(手工编写):

'$Include "sqautil.sbh"
Sub Main
    Dim Result As Integer
    Dim connection As Long
    Dim retcode As Variant
    dim outputstr,query as string   
    Dim out(1 To 1,1 to 1)  As Variant   
    '通过ODBC连接到数据库,要先创建ODBC
    connection = SQLOpen("DSN=server;UID=saWD=998855", outputstr,)
    '查询语句
    query = "select password from customerinfo where userid=100"
    '执行查询
    retcode = SQLExecQuery(connection,query)
    '取回结果,结果存入二维数组
    retcode = SQLRetrieve(connection,out())
    '取回结果,如果结果存入文件请使用
    'retcode = SQLRetrieveToFile(connection,"c:\test.txt"
    '显示结果
    msgbox  out(1,1)  
    '关闭数据库连接
    retcode = SQLClose(connection)        
End Sub
   
发表于 2004-12-24 00:34:00 | 显示全部楼层
数据池(DATAPOOL)应用技巧――如何生成定制数据

数据池可以按一定的规则生成测试数据列,但是它不能直接生成定制的数据。下面介绍使用数据池生成定制数据的一种方法:

    测试数据要求:数据由用户和产品数据组成,依次为用户名、用户密码、产品ID、产品价格。用户名和用户密码一一对应,产品ID和产品价格一一对应。要求用户数据和产品数据随机组合,生成大量测试数据。
数据生成过程:
1、从数据库中用Select语句分别从用户表和产品表中检索出用户数据和产品数据,检索结果分别存为CSV文件,文件名为user.csv和product.csv;

2、在Testmanager中新建DATAPOOL,命名为testdata,插入两个字段,TYPE选择“Read from File”,分别选择上一步生成的CSV文件,Sequense按需要选择;

3、按“Generate Data”按钮生成数据,close关闭窗口;

4、“Edit Datapool Data”查看生成的数据,可以看到只有两列数据,关闭窗口;

5、Manage Datapools窗口上点击“Import”按钮,选择测试项目目录中的..\TestDatastore\DefaultTestScriptDatastore\TMS_Datapools\ testdata.csv(上一步生成的数据池的CSV文件),输入新的DATAPOOL名afterdata,按“确定”按钮;

6、打开afterdata查看生成的数据,数据为4列,数据成功生成。
发表于 2004-12-24 00:36:00 | 显示全部楼层
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”是父子关系。这两个命令的效果完全一样。
发表于 2004-12-24 00:37:00 | 显示全部楼层
Rational Robot如何测试帮助c++程序员识别自定义或则第三方控件

大家都知道Rational Robot利用Delphi Enabler支持识别Delphi第三方控件和自定义控件,但是识别C++程序中遇到的第三方控件呢?我将在下边介绍识别他的方法,希望对大家有所帮助。

SQA Object Testing Control

如果你测试软件是vb编写的,那么利用SQA Object Testing Control: (SQAOTE32.ocx)来获得控件信息很对你来说很熟悉,通过它可以获取到软件运行时候的控件信息和方法。Robot可以根据提供的信息建立强壮的脚本,验证那些方法或功能是否正确,也就是最后的验证点。
如果你的c或则c++程序中包含自定义或者第三方的ActiveX(ocx)控件,你可以同样把这个控件放到每一个包含第三方控件或者用到自定义控件的窗体上。
安装Rational TeamTest或者Robot,Object Testing Control (SQAOTE32.ocx)会默认安装到系统目录system32中:C:\WINNT\system32\sqaote32.ocx.。

添加Rational ActiveX Test Control

  如果想让ActiveX Test Control起作用,需要在VC中设置ActiveX可用。以下用MFC举例
第一.        建立工程,设置ActiveX控件可用
      
第二.        在有第三方控件的地方添加Rational ActiveX Test Control
有一个窗体中包含MSTreeView,运行Rational Robot利用object properties来抓取MSTreeView属性,Rational Robot无法识别该对象(对象为UNKNOW)。添加SQA Object Testing Control(右键插入ActiveX控件,出现下图窗体)。

添加Rational ActiveX Test Control后窗体上出现一个robot的图标,你不用在代码中做任何处理就可以使用他。SQA Object Testing Control是个不可见控件,运行软件后他不会显示在窗体上。

     
      
再没有添加SQA Object Testing Control的时候Robot只能识别这个控件的通用属性,添加后Robot可以识别自定义控件或者插件的大部分属性。


注意
如果用到得自定义控件继承自MFC或者用APIS实现,即使添加SQA Object Testing Control控件Robot也无法有效的工作。那么定义该对象继承相近的类别。
方法1:运行的时候当用Object properties识别对象为unknow的时候,在出现的对话框中定义无法识别控件到相近的基类中。
方法2:打开robot,Tools->General Options,切换到object mapping页面。选择基类,然后添加无法是别的控件到该类中。
这样做可以识别该控件的通用类别属性。

总结:针对无法识别自定义和第三方控件建议添加Rational ActiveX Test Control,通过他能使Robot识别对象的大多数属性,帮助Robot建立强壮的脚本。

发表于 2004-12-24 00:39:00 | 显示全部楼层
数据池(DATAPOOL)专题

数据池在rational测试中是使用率很高,同时它也充分体现了自动化测试的优势。通过使用数据池,可以通过简单的脚本完成大量数据的测试,缩短测试时间、提高测试效率和测试质量。下面将介绍数据池的概念、创建以及在GUI、VU脚本中的应用。
    数据池(DATAPOOL)用于存储测试数据,在脚本中插入数据池命令并增加相关的控制命令后,在脚本回放时就可以自动从数据池中取出数据,完成多组测试数据的测试。
(一)数据池(DATAPOOL)创建
1、启动Rational TestManager;
2、Tools>Manage>Datapool,点击New…,输入数据池名称点“确定”;
3、在打开的Data Type Specification中添加字段定义;
字段定义说明:
Name:字段名称
Type:数据类型
Sequence:次序,包括Random(随机)、Sequential(连续)、Unique(唯一)
Repeat:数据重复次数
Length:数据长度
Decimals:小数位数
Interval:间隔,相邻两个数据的间隔数
Mininum:最小值
Maxinum:最大值
Seed:Sequence设为Random时,Seed输入不同的数据,生成不同的随机数
4、在设置好字段后,在No. of records to genarete:中输入要生成的记录数,然后点击Genarete Data 即可生成数据,或者点击SAVE按钮,关闭当前窗口,然后点击manage datapools>edit>edit datapool data,直接手工输入数据;
5、这样就完成了数据池的创建,还可以执行数据池的编辑、改名、删除、导入、导出等操作;
6、数据池有数据生成能力,但是不具备数据的计算能力。这种情况下可以利用其他工具(如EXCEL)生成数据,并保存为csv(逗号分割文件)格式,然后在manage datapools中导入;
(二)、
1、数据池在GUI脚本中的应用
这是计算器测试的例子,在GUI中使用数据池需要手工编码,robot不能自动生成,在手工编码时可以参考Robot的在线帮助。
'$Include "sqautil.sbh"

Sub Main
    Dim Result As Integer
    dim x as integer
    dim num1 as string
    dim num2 as string
    dim sum as string

   
    'Initially Recorded: 2003-7-18  8:51:18
    'Script Name: 计算器-2

    StartApplication "C:\WINNT\system32\calc.exe"
   
    dp=SQADatapoolOpen("jsq"
'打开数据池,jsp为数据池的名称,这个数据池是预先按照上述规范做好的

    for x=1 to 5
Call SQADatapoolFetch(dp)
'从数据池中读取记录
    Call SQADatapoolValue(dp,1,num1)
    Call SQADatapoolValue(dp,2,num2)
Call SQADatapoolValue(dp,3,sum)
'将从数据池中读取的数据赋予相应变量
    Window SetContext, "Caption=计算器", ""
    InputKeys num1 &"{+}"& num2 &"{ENTER}"
   
    Result = LabelVP (CompareNumeric, "Text="& sum &".", "VP=Alphanumeric;Value="& sum &"."
   
    next
   
    Call SQADatapoolClose(dp)
    '关闭数据池
    Window CloseWin, "", ""

End Sub

2、数据池在VU脚本中的应用
   VU脚本中的数据池可以通过录制自动产生,如果不能自动产生可以手工编码加入。

   以下录制在Google上搜索的脚本,数据池时录制时自动产生的:
  #include <VU.h>
{

push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */
push Think_def = "LR";
Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */
push Timeout_val = Min_tmout;

DP1 = datapool_open("googlw";
datapool_fetch(DP1);
            
push Think_avg = 0;

www_google_com = http_request ["googlw001"] "www.google.com:80",
   HTTP_CONN_DIRECT,
   "GET / HTTP/1.1\r\n"
   "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, applicat"
   "ion/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, ap"
   "plication/x-shockwave-flash, */*\r\n"
   "Accept-Language: zh-cn\r\n"
   "Accept-Encoding: gzip, deflate\r\n"
   "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR"
   " 1.1.4322)\r\n"
   "Host: www.google.com\r\n"
   "Connection: Keep-Alive\r\n"
   "Cookie: PREF=ID=6011af2d9ae9ecc9:TB=2:TM=1079509149M=1079509149:S=Bbt"
   "iwXYs9ldWNF0T\r\n"
   "\r\n";
set Server_connection = www_google_com;

http_header_recv ["googlw002"]  302;    /* Moved Temporarily */

http_nrecv ["googlw003"]  100 %% ;      /* Internally Generated */

{
  string SgenRes_001[];
  SgenRes_001 = http_find_values("RedirectPrefix", HTTP_REDIRECT_PREFIX, 2);
  CHECK_FIND_RESULT(SgenRes_001,"RedirectPrefix","/intl/zh-CN/"
}

set Think_avg = 190;

/* Keep-Alive request over connection www_google_com */
http_request ["googlw004"]
   "GET " + SgenRes_001[0] + " HTTP/1.1\r\n"
   "Accept: imag
发表于 2005-1-18 21:03:00 | 显示全部楼层
不错!
发表于 2005-1-25 18:38:00 | 显示全部楼层
Rational Robot SQABasic数据库操作相关命令  


SQLClose 功能函数
断开由SQLOpen确定的与ODBC数据源连接。
SQLClose ( connection& )
语法: 参数 解释
connection& 由SQLOpen返回的一个长整型的名称参数。
注解:
返回的是一个变量。成功返回0并连接随后关闭或断开。如果连接不正常,返回-1。

This example opens the data source named "SblTest," gets the names in the ODBC data sources, and closes the connection.
Sub main
' Declarations
'
Dim outputStr As String
Dim connection As Long
Dim prompt As Integer
Dim datasources(1 To 50) As Variant
Dim retcode As Variant
Dim action1 as Integer
Dim qualifier as String

prompt = 5
' Open the datasource "SblTest"
connection = SQLOpen("DSN=SblTest", outputStr, prompt:=5)

action1 = 1 ' Get the names of the ODBC datasources
retcode = SQLGetSchema(connection:=connection,action:=1, qualifier:=qualifier, ref:=datasources())
' Close the datasource connection
retcode = SQLClose(connection)

End Sub

SQLError功能函数
可以用来接收做ODBC函数调用时发生的多条错误的详细信息。为最近ODBC函数调用和连接返回错误信息。
SQLError ( destination() )
语法: 参数 解释
destination() 两维数组的每行包含一个错误。名称参数是必要的,必须是变量的数组。

注解
没有返回值。域: 1) 表示ODBC错误类型/下级分类的字符串, 2)表示数据源错误编码的数字值, 3)表示错误的文本信息。

如果没有错误从先前的ODBC函数调用发生,则0被返回到调用者数组的(1,1)里。如果数组不是2维的或不支持上面提到的三个域,则一个错误信息被返回到调用者数组的(1,1)里。

SQLError Example
This example forces an error to test SQLError function.
sub main
' Declarations
Dim connection As long
Dim prompt as integer
Dim retcode as long
Dim errors(1 To 3, 1 To 10) as Variant
Dim outputStr as String
' Open the datasource
connection = SQLOpen("DSN=SBLTESTW;UID=DBAWD=SQL",outputStr,prompt:=3)
' force an error to test SQLError select a nonexistent table
retcode = SQLExecQuery(connection:=connection,query:="select * from notable ")
' Retrieve the detailed error message information into the errors array
SQLError destination:=errors
retcode = SQLClose(connection)
end sub


SQLExecQuery Function
在SQLOpen确定的连接上执行一个SQL语句。
SQLExecQuery ( connection& , query$ )
语法: 参数 解释
connection& 指定参数、必须。长整形、由SQLOpen返回。
query$ 包含一个有效SQL语句的字符串,返回值是个变量。
注解:
对于SQL SELECT返回结果集的栏数目;对于UPDATE, INSERT, 或 DELETE返回受语句作用的行的数目。任何其它SQL语句返回0。如果函数在指定数据源不能执行此查询,或如果连接不可用,则返回为负的错误编码。

如果SQLExecQuery被调用但连接上还有一些未处理结果,则这些等待结果被新的结果所代替。

SQLExecQuery Example
This example performs a query on the data source.
Sub main
' Declarations
'
Dim connection As Long
Dim destination(1 To 50, 1 To 125) As Variant
Dim retcode As long
Dim outputStr as String
Dim query as String
' open the connection
connection = SQLOpen("DSN=SblTest",outputStr,prompt:=3)
'
' Execute the query
query = "select * from customer"
retcode = SQLExecQuery(connection,query)
'
' retrieve the first 50 rows with the first 6 columns of each row into
' the array destination, omit row numbers and put column names in the
' first row of the array
'
retcode = SQLRetrieve(connection:=connection,destination:=destination,columnNames:=1,rowNumbers:=0,maxRows:=50, maxColumns:=6,fetchFirst:=0)

' Get the next 50 rows of from the result set
retcode = SQLRetrieve(connection:=connection,destination:=destination,columnNames:=1,rowNumbers:=0,maxRows:=50, maxColumns:=6)
' Close the connection
retcode = SQLClose(connection)
End Sub


SQLGetSchema功能函数
返回各类信息,包括数据源可用的信息,当前用户ID、表格名称、表格列的名称和类型、及其它数据源/数据库相关信息。
SQLGetSchema (connection& , action% , qualifier$ , ref() )
语法: 参数 解释
connection& 由SQLOpen返回的一个长整形。
action% 必需项。
qualifier$ 必需项。
ref() 动作请求的对应的结果的变量数组,必须有一个数组即使仅一个参数的一维数组。返回值是一个变量。

注解:
返回一个
发表于 2005-1-28 21:43:00 | 显示全部楼层
Robot GUI脚本操作SQL SERVER数据库

代码如下(手工编写):

'$Include "sqautil.sbh"
Sub Main
    Dim Result As Integer
    Dim connection As Long
    Dim retcode As Variant
    dim outputstr,query as string   
    Dim out(1 To 1,1 to 1)  As Variant   
    '通过ODBC连接到数据库,要先创建ODBC
    connection = SQLOpen("DSN=server;UID=saWD=998855", outputstr,)
    '查询语句
    query = "select password from customerinfo where userid=100"
    '执行查询
    retcode = SQLExecQuery(connection,query)
    '取回结果,结果存入二维数组
    retcode = SQLRetrieve(connection,out())
    '取回结果,如果结果存入文件请使用
    'retcode = SQLRetrieveToFile(connection,"c:\test.txt"
    '显示结果
    msgbox  out(1,1)  
    '关闭数据库连接
    retcode = SQLClose(connection)        
End Sub
   
    详细的命令用法,可以查阅Robot在线帮助。
发表于 2005-2-17 01:03:00 | 显示全部楼层
好帖子,收藏。

本版积分规则

Archiver|手机版|小黑屋|领测软件测试网 ( 京ICP备10010545号-5 )

GMT+8, 2021-10-23 09:40 , Processed in 0.187492 second(s), 11 queries , Xcache On.

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表