• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 经济贸易 > 正文

    浅谈LoadRunner中Winsock参数化的实现

    时间:2020-09-15 07:56:03 来源:达达文档网 本文已影响 达达文档网手机站

    摘要:在使用性能测试工具LoadRunner测试socket协议的应用程序时,为了克服模拟测试时测试单一跟实际使用偏差较大,需要跟其他协议一样对测试脚本进行参数化,先在脚本中找到需要进行参数化的地方,再对其实行参数化,最终结果表明,在运行测试时,能够实现客户端向服务器端提交不同的数据,完成自动化性能测试。

    关键词:性能测试;Winsock协议;LoadRunner;场景录制;参数化

    中图分类号:TP393文献标识码:A文章编号:1009-3044(2011)31-7698-05

    Brief Discussion of Implementation of Winsock to be Parameterized in LoadRunner

    ZHANG Hai-mei1, XUE Ya-min2

    (1. Changzhou Automation Research Institute of China Coal Technology and Engineering Group Corporation, Changzhou 213015, China; 2. Guoguang Electronic Information Technology, Changzhou 213015, China)

    Abstract: In the use of performance testing tool LoadRunner tests socket protocol application, in order to overcome that a test is monotonous and has large deviation from the actual use in the simulation test, so it needs to parameterize test script as the same as other protocols, firstly it needs to find the place where has to change into parameters in the script, then they are to be parameterized. The results show that when the test is running, it can be realized that the client submit a different data to the server, and complete automated performance testing.

    Key words: performance test; Winsock protocol; LoadRunner; scene recording; parameterized

    Windows Sockets(简称Winsock)是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。已成为Windows网络编程的事实上的标准。它是起源于UNIX上的Berkeley Software Distribution(BSD)版本的套接字,并为Windows进行了专门地扩展。Internet是在UNIX系统上发展起来的,在UNIX上有许多成熟的编程接口,其中最通用的是一种叫做sockets(套接字)的接口。套接字的实质是通信端点的一种抽象,它提供一种发送和接收数据的机制。一般Windows下基于TCP/IP协议网络环境下的应用程序,其实现数据通信都是通过调用Winsock的接口函数来实现的。

    Client/Server(C/S)模式,即客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性[1]。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。C/S模式能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。但它一般只适用于局域网,并且客户端需要安装专用的客户端软件。

    本文介绍的案例系统是C/S架构的Windows下的应用在医院局域网环境下的应用程序。

    1 LoadRunner工具支持的协议

    LoadRunner是目前主流的一种软件性能测试工具。它通过模拟上千万个虚拟用户实施并发测试或负载测试及实时性能检测的方式来确认和查找问题,能够对整个企业架构进行测试。

    LoadRunner支持的协议比较广泛,参考

    安装LoadRunner工具后生成的帮助文档内容,Vuser类型可以分为以下几种:

    1)应用程序部署解决方案:使用于Citrix协议。

    2) 客户端/服务器:适用于 DB2 CLI、DNS、MS SQL、ODBC、Oracle (2层)、Sybase Ctlib、Sybase Dblib 和 Windows Sockets 协议。

    3)自定义:适用于 C 模板、Visual Basic 模板、Java 模板、Javascript 和VBscript 类型的脚本。

    4)分布式组件:适用于 COM/DCOM、CORBA-Java 和 RMI-Java 协议。

    5)电子商务:适用于 FTP、LDAP、Palm、Web (HTTP/HTML)、Web Services和双 Web/Winsocket 协议。

    ……

    本文主要介绍使用LoadRunner测试“客户端/服务器”类型的应用程序时,只能选用Windows Sockets协议。

    2 LoadRunner的组件及功能

    LoadRunner工具中包括三个组件,分别为:LoadRunner Virtual User Generator、LoadRunner Controller、LoadRunner Analysis。

    1)LoadRunner Virtual User Generator是虚拟用户生成器,来记录模拟真实用户使用应用程序的虚拟用户脚本。

    2)LoadRunner Controller是一个创建、维护、执行场景的管理中心。它往场景中加载虚拟用户和负载生成器,开始和停止负载测试,还有其他管理性的任务。

    3)LoadRunner Analysis提供图表和报告,这些图表和报告为测试结果分析提供了数据来源,最终可以总结系统性能。

    3 案例项目(PACS&RIS系统性能测试)

    3.1 PACS&RIS系统介绍

    PACS系统是Picture Archiving and Communication Systems的缩写,意为图像归档与传输系统。它是应用在医院影像科室的系统,主要的功能就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络)以数字化的方式海量保存起来。

    本案例是医用PACS&RIS系统,采用了最新的DICOM3.0协议标准,运用了数据库管理、视频采集,数字图像处理,DICOM的通信等各种先进技术实现了对放射科乃至全院的影像和图文报告的管理、共享。医学数字影像传输(DICOM)标准是第一个广为接受的全球性医学数字成像和通信标准,它利用标准的TCP/IP(transfer control protocol/internetprotocol)网络环境来实现医学影像设备之间直接联网。因此,PACS是数字化医学影像系统的核心构架,DICOM3.0标准则是保证PACS成为全开放式系统的重要的网络标准和协议。

    该系统主要功能包括“病人登记系统”、“诊断报告系统”、“病人管理系统”、“统计分析系统”。

    3.2 测试要求及测试工具引入

    需要对某医院用PACS&RIS系统做性能测试,根据相关资料了解,该系统的架构为C/S架构,即使用时需要客户端安装应用软件及数据库客户端系统,通过操作将数据暂时存储在客户端,再通过数据同步的方式将数据上传至服务器或从数据库服务器中下载最新数据记录。

    测试环境要求及设计:

    客户的环境要求如表1所示。

    最终确定的测试环境如表2所示。

    每台电脑的显示器分辨率都设置为1024×768(32 位色)。

    本次测试采用LoadRunner工具作为性能测试工具。

    3.3 测试用例设计

    根据性能要求,确定测试内容,主要是“病人登记系统”和“病人管理系统”中的并发测试。最终确定了几个场景,表3给出了该案例的测试场景列表。

    在确定测试场景后,可以进一步作成测试用例[2],以系统应用场景5为例,其“病人登记系统:登记病人信息操作”业务可以描述如下:

    用例编号:TC_**-1

    用例条件:用户具有录入病人信息的权限

    用户步骤及结果验证:

    1) 点击“登记系统”按钮,在提示框中输入用户名和密码,点击“登录”按钮,登录病人登记系统,进入病人登记系统页面。

    [验证]页面出现“病人登记系统”提示字符串。

    2) 用户在页面左侧菜单上点击“检查登记”链接,进入检查登记页面。

    [验证]页面出现“检查号”提示字符串。

    3) 用户在检查登记页面中填入病人姓名等基本信息后,点击“保存病人”按钮,画面更新为“新建病人”页面。

    [验证]页面出现“保存成功”提示字符串。

    4 Laodrunnner录制Winsock协议的脚本及参数化

    因案例系统涉及的上层协议较多且结构较复杂,本次测试经多次尝试,发现使用LoadRunner测试时,只有当选择协议Windows Sockets时,才可以将客户端和服务器之间的数据通信完整地录制下来。

    4.1 使用LaodRunnner录制脚本

    案例中,以4.3中的测试用例为例,使用LoadRunner录制脚本,打开LoadRunner Virtual User Generator,点击新建脚本,出现协议选择提示信息窗口,选择单协议,在Category下拉框中选择Client/Server,再选择协议Windows Sockets,如图1所示。

    点击“Create”开始,进入图2页面,图中点击“①”选择本地的客户端应用程序(一般是后缀为exe的执行文件),点击“②”设置工作路径,即一些log文件存的路径。

    点击OK,开始录制,LoadRunnner会自动打开客户端软件,登录时使用的帐号为“test10”,密码为“test10”,此时按照测试用例的操作步骤一步步操作,填写病人信息,然后保存信息。

    注意:因为Windows Sockets方式录制的脚本可读性较差,为了方便找到所需要的信息,可以将每一步打开页面的步骤记录为一个事务(Transaction),最终需要统计点击“保存病人”按钮的响应时间小于3秒,故在点击“保存病人”之前插入集合点(Rendezvous)。

    VuGen(4) 可以以两种方式显示 WinSock 脚本:

    1)作为基于图标的脚本表示形式。这是默认的视图,称为树视图。

    2)作为基于文本的脚本表示形式,它显示 Windows 套接字 API 调用。这称作脚本视图。

    录制完成后的脚本视图如图3所示。

    其中脚本包含四个部分:

    vuser_init、Action、vuser_end、data.ws

    LoadRunner脚本一般包含三个部分:vuser_init、Action、vuser_end

    录制时,可以选择将脚本放在哪一部分,一般初期化的脚本可以放在vuser_init中,操作过程放在Action中,录制时,Action中可以定义新的Action,vuser_end中可以不录制事务,也可以将退出应用程序的操作放在vuser_end中。

    除了 Vuser 脚本外, VuGen( Vuser Generator)还将创建数据文件data.ws,该文件包含在录制会话期间传输或收到的数据。

    注意:vuser_init中的内容是不可以参数化的。需要参数化的内容应该放在Action中,本案例中从输入登录信息开始的内容都应该放在Action中。

    4.2 找到需要参数化处

    LoadRunner录制完测试脚本后,需对脚本进行进一步完善,例如,5个用户登录病人登记系统,登记病人信息操作,并发保存病人信息;至少需要5个用户是不同的用户,至于病人信息也应该是不同的,这个比较复杂,在此不详细展开。那我们就需要对登录系统的用户进行参数化。LoadRunner在winsock协议下典型会话期间,将录制下列函数序列:

    lrs_startup 初始化 WinSock DLL。

    lrs_create_socket 初始化套接字。

    lrs_send 在数据报上或者向流套接字发送数据。

    lrs_receive 接收来自数据报或流套接字的数据。

    lrs_disable_socket 禁用套接字操作。

    lrs_close_socket 关闭打开的套接字。

    lrs_cleanup 终止 WinSock DLL 的使用。

    可见lrs_send是客户端往服务器端发送数据报,而lrs_receive是客户端接收服务器端返回的信息。首先在脚本中找到定义“登录”事务的地方,如下面代码所示:

    #include "lrs.h"

    Action()

    {

    lr_start_transaction("LOGIN");

    lr_think_time(22);

    lrs_send("socket0", "buf4", LrsLastArg);

    lrs_receive("socket0", "buf5", LrsLastArg);

    lrs_send("socket0", "buf6", LrsLastArg);

    lrs_receive("socket0", "buf7", LrsLastArg);

    ……

    然后在LoadRunner树视图中查找登录信息,如图4所示。

    可以确定登录的帐号信息是存放在buf6中的,在脚本视图中点击左边菜单“data.ws”,检索buf6,找到buf6中的二进制文件内容,如下面代码中的红色部分即为test10。

    send buf6 224

    "\x01\x01\x00\xe0\x00\x00\x01\x00"

    ……

    "U""\x00""s""\x00""e""\x00""r""\x00""N""\x00""a""\x00""m""\x00""e""\x00""=""\x00"

    "t""\x00""e""\x00""s""\x00""t""\x00"" "\x00""1""\x00""0"

    ……

    recv buf7 124

    参数化方法:考虑将以上代码中的用户名test10中的“1”、“0”用参数替换,分别取值为10,11,12……20等。密码录制后是通过DLL加密后显示的,简便的方法是采用相同的密码,不做参数化。这样事先在数据库中添加了同样权限的用户20个,名称为test10,test11…test30,密码都是与test10的密码一致。

    4.3 参数化实施步骤:

    4.3.1 对test10中的1进行参数化

    选中“data.ws”中buf6的test10的1,点击鼠标右键,选择“Replace with a Parameter”,如图5所示。

    点击后弹出的对话框,如图6,将参数类型选为File,参数命名为“userID1”,确定后,原来的“1”即显示为参数“”。

    注意:在winsock协议脚本中参数默认用“<>”表示,LoadRunner工具中使用其他的协议时,参数都是默认用“{}”表示的。

    4.3.2 userID1的参数类型及内容设定

    选中参数userID1点击鼠标右键,选择“Parameter Properties”,设置参数属性, 在弹出的属性设置框中,点击[Add Column],添加一列,如图7所示。

    添加新列取名userID2,然后点击“Edit with Notepad”,编辑数据,Notepad的内容如图8所示,注意最后输入“2,0”后要键入回车键。

    关闭并保存记事本信息。

    4.3.3 userID1的参数属性设置

    如图9所示,设置参数userID1取文件的第一列,目标是将原来的用户名test10中的10分别以两个参数userID1和userID2替换,参数userID1取参数文件的第一列,参数userID2取参数文件的第二列,这样就能实现用户名的参数化了。即运行5个用户时,用户名依次取值为test10,test11,test12,test13,test14,test15。

    参考图9中红色框部分,

    [①]:选择参数对应的列名userID1。

    [②]:指名以何种方式从数据池中获取数据,选择Unique(唯一的数),表示每次取唯一值。

    [③]:选择每次迭代,即迭代一次后再取下一个参数值。

    [④]:When out of values选项只有在Select next row设置为Unique

    时才有效,当数据池中的数据量不支持迭代和Unique要求的数据量时,可以通过设置该选项的值指示LoadRunner的处理方法。这里选择Continue in a cyclic manner,指遇到该情况,重新从数据池的第一个取值开始循环[3]。

    4.3.4 test10中的0的参数化

    类似于(1),只是新建时参数名命名为userID2,选择userID鼠标右键打开参数属性,参数类型选择File,在File选择框中选择userID1.dat,打开参数文件,如图10所示。

    选择参数对应的列名为userID2,即参数从文件userID1.dat的第二列数据取值,select next row选择Same Line As userID1:和前面定义的参数userID1 取同行的记录。

    4.3.5 脚本中其他出现test10地方的参数化替换

    事先了解案例应用程序哪些页面会出现与用户名test10关联的数据,如登录后的页面

    标题会出现test10的字样,需要将其他页面的所有用户名test10都替换成参数。

    在Action的树视图的Binary view中查找,记录下出现用户名test10的对应的buf编号,如buf10,再在data.ws中检索到buf10,

    找到test10,选中 1,点击鼠标右键,选择Use Existing Paramater,

    选择userID1;选中 0,点击鼠标右键,选择Use Existing Paramater,

    选择userID2。按此方法将脚本中出现的所有的跟用户名相关的都替换为参数userID1和userID2。

    注意:有些地方虽然也出现test10,但跟登录的用户没有关系,只是一些列表中的数据,就不需要做参数化

    完成用户名的参数化后,查看脚本的树视图,可以看到原来的test10的1和0已经被参数替换了,如图11所示。

    当需要参数化的数据较多,使用类似的方法,只是定义第一个变量文件时,需要添加多个列。

    5 结论

    介绍了使用LoadRunner在Winsock协议下的参数化方法,参数化完成后可以设置选项在LoadRunner Controller中运行性能测试。但也存在一定的局限性:若信息差异性较大,参数化就不太好实现,如登记的病人信息差异性很大;或是录制后加密了的文字参数化方法也较复杂。这里就不展开了。

    参考文献:

    [1] 曹向志,于涌高.软件测试项目实践——技术、流程与管理[M].2版.北京:电子工业出版社,2010.

    [2] 段念.软件性能测试过程详解与案例剖析[M].北京:清华大学出版社,2006.

    [3] 刘艳会.LoadRunnner使用说明[Z].软件测试中心,2003.

    相关热词搜索: 浅谈 参数 LoadRunner Winsock

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网