返回 科技论文 首页
浅谈LoadRunner中Winsock参数化的实现

  摘要:在使用性能测试工具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的密码一致。


【相关论文推荐】
  • 浅谈LoadRunner在网络流媒体中的应用
  • CAD开发中图形参数化的实现途径探
  • 基于VBA的Autocad中实现参数化标准零件的绘图
  • 非凸曲面参数化在游戏引擎中的实现
  • 利用参数实现Web自动化考试系统中的软件复用
  • WINSOCK在网络测试编程中的使用
  • 浅谈Winsock与DLL技术
  • QTP中的参数化研究
  • 基于WinSock的局域网聊天室设计与实现