|
winrunner脚本经验和一些开发资料
来源:
http://softtest.chinaitlab.com/WinRunner/753600.html
Winrunner GUI说明:
1.GUI描述说明:
TDataListView_0 TTreeView_1
{ {
class: object, class: list,
MSW_class: TDataListView, MSW_class: TTreeView,
displayed: 1, index: 0
index: 0 }
}
示例a 示例b
以上a和b示例分别是非标准控件和标准控件的GUI描述,
首先,例子a的class描述是object,说明winrunner无法辨认该控件的运行特征,因此只将其辨认未object,winrunner将所有不能辨认其内部运行特征的对象都识别未object.
再者,例子b的class描述是list,说明winrunner将其辨认为了list类的控件,那么我们对该控件进行操作时就可以使用list类的函数(TSL库提供).
下面讲解一些比较重要的属性的意义(其他属性的意义可以查看winrunner的帮助文档):
1)Class: winrunner将该对象识别为class属性描述的对象
2)MSW_class: winrunner抓取的该对象的实际对象名称.
3)那么
{
class: object,
MSW_class: TDataListView
}
表示的就时将实际对象名称为TDataListView的对象识别为object对象进行操作.
4)Index与location属性时选择符属性 ,当一个GUI的属性识别出来有多个对象时需要使用选择符号来识别和区分:
(1)Index使用控件的默认索引来识别,例如edit1, edit2这2个控件都是Tedit控件,那么当一个界面上同事出现该2个控件时,那么用index识别,index: 1就代表了edit1,index:2表示edit2.
(2)Location使用TAB聚焦顺序来识别控件,同上,如果edit1和edit2的TAB聚焦顺序分别是第一个TAB聚焦edit2,第二个TAB聚焦edit1,那么location:2表示edit1,location:1表示edit2.
(3)如果一个控件经过识别之后包含了x,y的属性,那么它将是由x,y来帮助唯一识别的GUI描述,我们不建议使用x,y来识别,因为这将大大降低可移 植性.所以建议一个对象难以唯一辨认的时候请使用选择符号来帮助识别.(当然,局限性是要求程序员不要随便改动TAB的聚焦顺序和对象的索引).
5),winrunner的GUI的描述也提供了正则表达式的描述,例如模糊匹配上就有!.*
使用方法:
(1),!A.*表示以A为起始的任何字符.
(2),!.A*表示以A为结尾的任何字符.
2.对GUI对象的操作:
(1),如果是标准控件,请直接使用TSL库提供的标准函数操作.
(2),如果是非标准控件,用GUI配置影射为标准控件再使用TSL库的标准函数操作.
(3),如果是非标准控件无法影射为标准控件,那么也请识别为object对象,使用通过x,y进行操作的函数.
(4)如果是非标准控件识别为object对象,使用通过x,y进行操作的函数不能满足要求的情况下,请结合使用键盘模拟操作进行辅助.
(5)当以上情况均无法完成的情况下,可以考虑将非标准控件识别为object对象,并获取object的句柄,要后通过句柄来发送消息来驱动控件.
(6)最后就是开发DLL来驱动和模拟控件的操作了,一般结合(5)比较有效果,但是这带来的是可维护性低,脚本工作量过大,延误自动化测试框架的建立和造成环境移植的冲突,当程序代码有了修改,那么又不得不花费巨大得工作量去修改DLL以及与脚本通讯的函数.(例如通过DLL内的程序去访问所测对象的API接口,实现对所测对象的各种操作)
提示:一般不建议使用第6步,除非不得已或者所测平台的相应模块内部接口或者代码改动很小或者没有改动才考虑使用.事实上即使是非标准控件,大部分都可以 通过识别为object后使用自定义函数来封装对坐标计算,模拟操作,对象属性等进行编程来实现其功能.
Winrunner 脚本说明:
1.部分代码说明
1),load_dll("user32.dll");
extern int PostMessageA(in long, in long, in long, in long);
win_get_info("WIN","handle",hWnd);
PostMessageA(hWnd, 1128, 1, coord_array[1]);
以上代码是获取WIN句柄,使用user32.DLL中的PostMessageA进行发送消息来完成对控件的操作的代码.
基本上USER32.DLL里面的API都可以通过这个方式进行调用,其中PostMessageA和SendMessageA这2个方法最常用,特别在测试一些难于用TSL里面的标准函数进行操作的控件时,采用这2个方法会有非常好的收获,结合VC的SPY++会让你得心应手.
(最好大家再去了解一下WINDOWS SDK的编程原理,WINDOWS有一个消息机制,一直在循环等待,这也是WINDOWS的一个特点,通过消息来进行各种活动)
2),table = "Excel.xls";
rc = ddt_open(table, DDT_MODE_READ);
#打开Excel.xls
if (rc!= E_OK && rc != E_FILE_OPEN)
pause("Cannot open table.");
ddt_get_row_count(table,table_RowCount);
#获取数据驱动表的数据总数
for(table_Row = 1; table_Row <= table_RowCount; table_Row ++)
{
LCM = ddt_val(table,"数据列 ");
#获取数据驱动表的列名未”数据列”的一列的内容并赋值给LCM变量.
ddt_set_row(table,table_Row);
#设置数据驱动表table的获取信息在table_Row行中.
}
ddt_close(table);
以上代码时数据驱动例子;
应用举例:当一个测试用例涉及多个不同数据分别对平台进行测试,那么就需要使用数据驱动,例如对一个输入框进行测试,那么根据等价类划分,边界值,因果 图,RUP等获得测试数据样例,然后将测试数据样例放到数据驱动中,让winrunner脚本根据不同的数据循环执行某个脚本,最终获得对入口数据的全面 覆盖.同时也可以作为一个自定义的数据源来使用.数据驱动要灵活运用.
TSL常用函数说明:
1.TSL语言语法特点:
TSL语言实际上是一种类C语言,因为语句控制的关键字都是跟C语言一致的,部分C语言的函数也可以在TSL语言中使用,但是也有不同的地方,例如:
1,变量的声明:TSL语言没有整型,实型等的定义,只有auto,static,public等定义,(详细的区别可以去参考TSL说明文档)
2,函数的定义:TSL语言定义的函数需要有关键字function,如:
Function ShowMsg(in A,out B)
{
Auto C;
C = A;
B = C+B;
Return C
}
函数执行的过程是:从in 参数即A变量中传入,执行之后通过出口参数out 即B变量传会调用处,同事函数自己会有返回值C.
注意:在使用自定义函数之前需要先编译该函数即先运行该函数脚本.
3,TSL语言最大的特点就是有自己的库函数,就是TSL库,通过它可以方便的执行各种自动化测试操作.
4,TSL脚本的执行方式与普通的程序编译及运行顺序是有区别的.
2.数据库章:
(1)建立数据库连接:
db_connect("TNB","DSN=CPC8888;UID=sa; PWD=sinoccqa;APP=WinRunner;WSID=CHY ",20);
参数说明:
“TNB” 是数据库连接成功后的会话名,建立连接之后可以使用TNB来进行各种数据库操作,
“DSN” 是本机的数据源名称,
“UID” 是登陆数据的用户名,
“PWD” 是登陆数据库的密码.
函数功能:
当参数正确输入的情况下,建立了连接之后函数会返回E_OK,否则返回其他值(详细可以参考winrunner自带的TSL说明);
(2)执行SQL语句:
db_execute_query("TNB","SQL",record_number);
参数说明:
“TNB” 就是(1)上说的数据库连接会话名,通过它才能进行数据库操作,
“SQL” 是数据库所要执行的SQL,
“record_number” 是执行了SQL之后从数据库中返回的结果集数据数目.
(3)获取返回的数据集信息:
db_get_row("TNB",Row,modid);
参数说明:
“TNB” 是数据库连接成功后的会话名,
“Row” 是指函数要获取数据集中第几行的信息,
“modid” 是指将获得第Row行的数据集信息放到变量modid.
(4)断开数据库连接:
db_disconnect ("TNB");
参数说明:
“TNB” 是数据库连接成功后的会话名,
函数功能:
断开会话名为“TNB”的数据库连接.
3.DLL函数:
1,加载DLL:
load_dll(" PATH");
参数说明:
“PATH”加载DLL的带路径的全文件名;
2,使用DLL中定义的函数:
extern int DllFunctionName(in long);
在使用DLL中的函数前需要先加载DLL,然后使用extern关键字声明该函数之后才能在后面的脚本中使用;
4.窗体函数:
1,set_window ("Win", time);
参数说明:
“Win” 是一个windows窗体名(GUI中的名称),
Time 是设置执行该语句是查找"Win"窗体的最长时间.
函数功能:
要对某窗体下的控件进行操作时,首先需要设置其窗体环境"Win"
2,win_max ("Win");
参数说明:
“Win” 是一个GUI抓取到的窗体对象.
函数功能:
最大化窗口”Win”.
3,win_activate ("Win");
参数说明:
“Win” 是一个GUI抓取到的窗体对象.
函数功能:
激活窗口”Win”.
4,win_close ("Win");
参数说明:
“Win” 是一个GUI抓取到的窗体对象.
函数功能:
关闭窗口”Win”.
5,obj_wait_info("OBJ","属性",属性值,等待时间);
win_wait_info("WIN","属性",属性值,等待时间);
参数说明:
“OBJ” GUI抓取到的窗体对象,
“WIN” GUI抓取到的windows窗体对象,
“属性” 窗体或windows窗体的属性,
“等待时间” 等待的时间
函数功能:
等待窗体或windows窗体的”属性”的值为”属性值”,最大等待时间为”等待时间”.
6, obj_get_info(OBJ,"属性",Wst);
Win_get_info(WIN,"属性",Wst);
参数说明:
“OBJ” GUI抓取到的窗体对象,
“WIN” GUI抓取到的windows窗体对象,
“属性” 窗体或windows窗体的属性,
“Wst” 存放属性值的变量
函数功能:
获取OBJ或WIN窗体的属性名为”属性”的属性值,并保存到变量”Wst”中.
7, list_activate_item ("ListOBJ", “ItemName”);
参数说明:
“ListOBJ” GUI抓取到的列表控件的对象名,
“ItemName” 列表控件的某个Item的全名.
函数功能:
激活列表控件”ListOBJ”的全名为”ItemName”的Item.
[ 本帖最后由 84690267 于 2009-2-19 11:45 编辑 ] |
|