51Testing软件测试论坛

标题: winrunner脚本经验和一些开发资料 [打印本页]

作者: 84690267    时间: 2009-2-19 11:41
标题: winrunner脚本经验和一些开发资料
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 编辑 ]
作者: 84690267    时间: 2009-2-19 11:41
8,list_get_items_count("ListOBJ",TreeCount);
        参数说明:
        “ListOBJ” GUI抓取到的列表控件的对象名,
        “TreeCount” 存放列表中Item的总数.
        函数功能:
        获取列表控件”ListOBJ”的Item总数的变量.
        9,list_get_item("ListOBJ",ItemNum,ItemName);
        参数说明:
        “ListOBJ” GUI抓取到的列表控件的对象名,
        “ItemNum” Item所在的位置,
        “ItemName” 保存列表控件的某个Item的全名的变量.
        函数功能:
        获取列表控件”ListOBJ”中位置为”ItemNum”的Item的全名并保存到”ItemName”变量中.
        10,list_select_item ("ListOBJ", “ItemName” ,MOUSETYPE);
        参数说明:
        “ListOBJ” GUI抓取到的列表控件的对象名,
        “ItemName” 保存列表控件的某个Item的全名的变量,
        “MOUSETYPE” 鼠标操作的类型.LEFT为左点击,RIGHT为右点击
        函数功能:
        选择“ListOBJ”中全名为”ItemName”的Item,进行鼠标的操作”MOUSETYPE”.
        11,menu_select_item ("菜单项");
        参数说明:
        “菜单项” 点击右键弹出菜单中GUI抓取到的菜单名为”菜单项”的菜单.
        函数功能:
        选择右键弹出菜单GUI名位”菜单项”的菜单
        12,obj_find_text(OBJ,FindStr,coord_array,TRUE);
        参数说明:
        “OBJ” GUI中抓取到的窗体名
        “FindStr” 查找的字符串
        “coord_array” 保存该字符串在”OBJ”窗体中的位置.
函数功能:
        在OBJ中查找字符串为FindStr的位置并保存到coord_array中,查找执行的情况可以在函数的返回值中获知(详细返回值对应的意义可以查看TSL说明文档);
        13, obj_mouse_dbl_click (OBJ, Xst, Yst, LEFT);
        参数说明:
        “OBJ” GUI中抓取到的窗体名
        “Xst” x坐标
        “Yst” y坐标
        “LEFT” 鼠标左键
        函数功能:
        左键双击OBJ对象中相对位置为(Xst, Yst)的位置.
        14,obj_mouse_click (OBJ, Xst, Yst, “MOUSETYPE”);
        参数说明:
        “OBJ” GUI中抓取到的窗体名
        “Xst” x坐标
        “Yst” y坐标
        “MOUSETYPE” 鼠标点击类型,LEFT为左键点击,RIGHT为右键点击
        函数功能:
        鼠标”MOUSETYPE”操作单击OBJ对象中相对位置为(Xst, Yst)的位置.
        15,obj_get_text("OBJ", text);
        参数说明:
        “OBJ” GUI中抓取到的窗体名
        “text” 获取到的文本信息保存到该变量
        函数功能:
        获取OBJ对象的所有文本信息并保存到text变量中.
        16,button_press ("Button");
        参数说明:
        “Button” GUI抓取到的按钮名称
        函数功能:
        按下名为”Button”的的按钮
        17,win_exists("WIN",time);
        Obj_exists("OBJ",time);
        参数说明:
        “OBJ” GUI抓取到的窗体对象,
        “WIN” GUI抓取到的windows窗体对象,
        “time” 检测时间
        函数功能:
        检测”OBJ”或者”WIN”对象是否存在,最大的检测时间为time.
        18,toolbar_button_press ("ToolBar控件", "ItemName");
        参数说明:
        “ToolBar控件” GUI抓取到的ToolBar类控件的名称
        “ItemName”     ToolBar控件内的某按钮的名称.
        函数功能:
        点击“ToolBar控件”中按钮名为“ItemName”的按钮.
        19,report_msg("报告信息");
        参数说明:
        “报告信息” 记录在winrunner测试报告上的内容.
        函数功能:
        在winrunner测试记录上添加内容为”报告信息”.
        20,toolbar_get_button("ToolBar控件",i,button);
        参数说明:
        “ToolBar控件” GUI抓取到的ToolBar类控件的名称,
        “i”           按钮所在的位置
        “button”      保存按钮名称的变量.
        函数功能:
        获取“ToolBar控件”中第i个按钮的按钮名称并保存到button变量中.
        21, GUI_close_all();
        函数功能:
        关闭所有GUI.
        22, GUI_load ("C:\\9003\\GobalGui.gui");
        函数功能:
        加载包括路径全名的GUI文件.
        23,web_browser_invoke(IE,"URL" );
        参数说明:
        “IE” 使用什么工具打开IE,
        “URL” IE地址
        函数功能:
        打开IE并连接URL地址.
        24, call"C:\\9003\\CPC8888test_05"();
        函数功能:
        编译并调用脚本.
        25, button_set ( button, state );
        Button:按钮的逻辑名和描述。
        State:按钮的状态,如on ,off等。
        功能:设定指定按钮的状态。
        Example:
        button_set ("Rare", ON);
        25, index ( string1, string2 );
        string1, string2:字符串
        功能:返回string2在string1中的位置。如果string1中不存在string2,返回值为0。
        Example:
        Z = index("alibaba","ba"); z的值为4。
        26, substr ( string, position [, length ] );
        String:有效字符串
        Position:起始位置
        Length:取字符串的长度
        功能:从指定字符串中指定位置开始,取指定长度的字符串返回。
        Example:
        Substr(”student”,1,2);
        27, sprintf ( format, exp1, exp2,...expn );
        format:指定的格式
        exp1..:表达式
        功能:将变量变成特定的格式输出。
        Example:
        month = "January";
        x = sprintf ("The abbreviation for January is: %.3s", month);
        x=Jan。
        28, invoke_application ( file, command_option, working_dir, show );
        File:应用程序的绝对路径。
        command_option:命令行选项。
        working_dir:应用程序的工作路径。
        Show:指定应用程序打开后的方式(共有10中,查看帮助)。
        功能:在脚本中运行指定的windows应用程序。
        Example:
        if (invoke_application("notepad","","C:\\TEXT",SW_SHOWMINIMIZED)!=0)
        {
               report_msg("AUT is not found. exiting.");
               texit;
        }
        public secure_path="C:\\Program Files\\SecureCRT\\SecureCRT.EXE";
        public work_dir="C:\\Program Files\\SecureCRT";
        invoke_application(secure_path,"",work_dir,SW_SHOWMINIMIZED)
        29,login(in target_host,in user, in key)
        target_host:要登陆的对象。
        User:用户名
        Key:密码
        功能:登陆目标对象,输入用户名和密码。
        Example:
        Login(”pc1’,”administrator”,”123456”)
        30、command(in cmd)
        Cmd:要输入的命令行,字符串形式。
        功能:在防火墙上输入命令行。
        Example:
        Command(”ifconfig if1 10.2.0.1/24”);
        31、close_secure_crt(in target_host)
        Target_host:要关闭的对象。
        功能:关闭已经打开的防火墙或pc等。
        Example:
        fw_secure_crt=firewall & " - SecureCRT";
        close_secure_crt(fw_secure_crt);
        32、http_service(in src_host, in dst_addr,in web_file)
        Src_host:远主机
        Dst_addr:目标地址
        Web_file:html文件。
        功能:从源主机上对目标地址进行http service的测试。
        Example:
        rd=http_service(pc6,pc2_ip);
        33、ping_service(in src_host, in dst_addr)
        Src_host:源主机
        Dst_addr:目标地址
        功能:从源主机上对目标地址进行ping service测试。
        rd=ping_service(pc6,pc2_ip);
        34、telnet_service(in src_host, in dst_addr)
        Src_host:源主机
        Dst_addr:目标地址
        功能:从源主机上对目标地址进行telnet service测试。
        rd=telnet_service(pc6,pc2_ip);
        35、smtp_service(in src_host, in dst_addr)
        Src_host:源主机
        Dst_addr:目标地址
        功能:从源主机上对目标地址进行smtp service测试。
        rd=smtp_service(pc6,pc2_ip);
        36、pop3_service(in src_host, in dst_addr)
        Src_host:源主机
        Dst_addr:目标地址
        功能:从源主机上对目标地址进行pop3 service测试。
        rd=pop3_service(pc6,pc2_ip);
        37、ftp_service(in src_host, in dst_addr, in user, in key, in mode, in file, in trans_path)
        Src_host:源主机
        Dst_addr:目标地址
        User:ftp登陆用户名
        Key:ftp登陆密码
        Mode:ftp的方式(如get put)
        File:要put或get的文件名
        Trans_path:get 文件后要报存的路径。
        功能:测试源主机上对目标地址的tftp service。
        Example:
        rd=ftp_service(pc2,pc3_ip,ftp_user,ftp_key,"get",ftp_file,ftp_save_path);
        38、tftp_service(in src_host, in dst_addr, in mode, in file, in trans_path)
        Src_host:源主机
        Dst_addr:目标地址
        Mode:ftp的方式(如get put)
        File:要put或get的文件名
        Trans_path:get 文件后要报存的路径。
        功能:测试源主机上对目标地址的tftp service。
        Example:
        rd=tftp_service(pc2,pc6_ip,"get",tftp_file,tftp_save_path);
        39、ssh_service(in src_host, in dst_addr)
        Src_host:源主机
        Dst_addr:目标地址
        功能:从源主机上对目标地址进行ssh service测试。
        rd=ssh_service(pc6,pc2_ip);




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2