当项目需要你的时候,开发人员可能充当不同的角色。比如身边的测试人员说,我不会压力测试。但是现在客户又需要压力测试,那怎么办呢?到底怎么办呢?做为就技术人员的你,这个时候就的勇敢的站出来- 开始研究loadrunner,对框架进行压力测试。
Loadrunner 简介:
LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。通过使用 LoadRunner,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。(摘自:百度知道)
LoadRunner 在网络上以及HP已经提供了相当多的的技术资料。网络上也有很多这方面的资料。至于详细的使用说明本文将不再一一阐述。
本文重点只是给大家分享我在使用loadrunner过程中曾经被困扰过的环节。
一、安装:
loadrunner 的安装需要注意:如你您是XP系统可以安装 loadrunner9.5如果想录制IE8脚本,您需要安装IE8插件。注:这个我自己没试
过,只是有安装过XP的同事有提及。具体的插件安装包,百度一下很容易找到。需要着重强调的是,如果您是win7操作系统,我亲身经历的感受就是装了loadrunner9.5 再装IE8插件,loadrunner 依然还存在各种问题、各种不稳定。网络上有文章指出将Loadrunner9.50升级至
9.5.1或者9.5.2然后在装HP的IE8补丁。最后google了下发现loadrunner最新版本是11。且可以支持WIN7。最后就没在折腾9.5.0版本。直接装上了11版本.
二、网络环境:
当我们使用Loadrunner录制脚本的时候,特别是通过IE录制脚本,要密切注意。安装loadrunner的机器的IE是否开启了代理设置
如果开启,Loadrunner11 在录制脚本的时候会出现各种不稳定。这个问题当时困扰了我很久。
三、录制脚本:
录制脚本属loadrunner 重要环节之一。这里挑出几条个人认为比较重要的来和大家分享:
1、参数设定
我们第一次录制脚本成功后生成C脚本内中的参数都是由web表单客户实际操作的业务数据,但是这些数据都是“硬编码”。简单的说我们把这脚本运行时,会将之前录入的内容插入到数据库内(假设数据校验都是合法)。可是我们的实际压力测试时不可能将录制的脚本只运行一次。实际会根据各种场景各种场合进行策略性的执行已录制脚本。同时我们也需要准备充分的数据集(比如File Parameter)让脚本来执行。这些都可以在脚本内使用Parameter 来替换,比如以下脚本:
web_submit_data("GetProvinceAutoInputData", "Action=http://192.168.0.1:8080/MasterData/GetProvinceAutoInputData", "Method=POST", "RecContentType=application/json", "Referer=http://192.168.0.1:8080/MasterData/BasCity", "Snapshot=t14.inf", "Mode=HTML", ITEMDATA, "Name=assemblyName", "Value=", ENDITEM, "Name=sortFields", "Value=", ENDITEM, "Name=displayFields", "Value=ProvinceCode;ProvinceName", ENDITEM, "Name=displayLabels", "Value=鐪佷唤缂栫爜;鐪佷唤鍚嶇О", ENDITEM, "Name=queryFieldName", "Value=ProvinceName", ENDITEM, "Name=recordsPerPage", "Value=5", ENDITEM, "Name=filter", "Value=", ENDITEM, "Name=parentFieldName", "Value=", ENDITEM, |
其中第14行中“Value=5”这里的5 是由UI段传入的。我们可以通过LoadRunner的参数将其替换,选中5点击右键选择Replace whith a parameter 输入parameter name、parameter type. name值可以取一个容易识别业务的名词。type的选项有13种,其中包括随机参数、自增长参数、文件参数等,这里不做一一介绍,具体的请查看相关文档。通过设置参数,我们就可以在脚本多次运行时候使用不同的业务数据模拟真实的用户操作和并发。
2、loadrunner file parameter 列之间互相依赖
这里提一下file parameter ,试想如果我们有20个用户去录入用户订单(order)。同时维护好订单明细(orderDetails)。假设
订单号是由用户自己输入的且是不能重复的。那么我们需要为这个场景准备录入数据。同时假设20人在某一段时间内录入20个订单
每人录入一个。这里以file parameter来处理录入数据。数据结构如下
OrderCode OrderPrice Operator 0001 100 user1 0002 200 user3 0003 300 user4 0004 400 user5 0005 600 user6 ..... |
以上文件在Loadruner中是以dat文件来保存,默认以notepad 打开。数据设置非常简单,唯一需要指出的是参数依赖。
比如我们选择这个file parameter作为某一个业务参数。只能选择order表中的一个列,而不是所有table。所以这里涉及到
table中列的互相依赖。假设一个用户用0001 OrderCode 那么这个用户必然会用到 100 的price和 user1的operator。
列之间互相依赖可以有Vuser -> Parameter List 进入修改界面。通过select next row 栏目选择 same line as 字段名
这样该列就能实现以上所述的列之间的依赖。
3、Loadrunner运行后参数返回值
继续参考Order 和 OrderDetail 例子,假设当Order保存后,应用程序自动生成 一个OrderId,且该OrderId为GUID。
也就是说该OrderId是我们事先无法预知的,也就无法准备该值来进行压力测试。我们以LoadRunner的的录制脚本来讲解这个场景下如何使用LoadRunner。
首先请先参考Loadrunner web_reg_save_param 这个函数参数说明:
语法:int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
参数说明:
ParamName:存放得到的动态内容的参数名称
list of Attributes:其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写
Notfound: 当在返回信息中找不到要找的内容时应该怎么处理
Notfound=error:当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。
Notfound=warning:当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。
LB( Left Boundary ):返回信息的左边界字串。该属性必须有,并且区分大小写。
RB( Right Boundary ):返回信息的右边界字串。该属性必须有,并且区分大小写。
RelFrameID:相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。
Search:返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。
ORD:说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。
SaveOffset:当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。
SaveLen:当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。
Convert:可取的值有以下两种:
HTML_TO_URL:将 HTML-encoded 资料转成 URL-encoded 资料格式
HTML_TO_TEXT:将 HTML-encoded 资料转成纯文字资料格式
ok,现在开始在录制脚本内使用这个函数:
//定义这个主表将要生成的ID,具体参数含义参考上文中的web_reg_save_param 参数说明,这里就不再解释了。
web_reg_save_param("Id","LB=Id\":\"", "RB=\"}","Notfound=warning","Search=Body", LAST); //http服务端保存脚本 web_custom_request("SaveOrder", "URL=http://192.168.0.1:8080/Order/SaveTmsOrder", "Method=POST", "Resource=0", "RecContentType=application/json", "Referer=http://192.168.0.1:8080/Order/TmsOrder", "Snapshot=t10.inf", "Mode=HTML", "Body=TnNo=&TnTypeCode=OUTBOUND&FeeTypeCode=AUTO+CALCULATION&ShipperName=%E5%8C%97%E4%BA%AC%E4%BB%93%E5%BA%93&ShipperCode=BJ&ShipperId=0569ccc3-6625-4ffb-b659-2e4fb3b10bc5&ShipperNameEn=BJ&ShipperTypeCode=&ShipperTypeName=&ShipperOfficeCode=BJ&ShipperOfficeName=%E5%8C%97%E4%BA%AC%E4%BB%93%E5%BA%93&ShipperAttribute=0&OriginCityCode=Beijing&OriginCityName=beijing" "ConsigneeName={ConsigneeName}&" "ConsigneeCode={ConsigneeCode}&" ........ //在loadrunner 的控制台输出 服务端返回的ID lr_output_message("%s",lr_eval_string("{Id}")); |
下面如果还有其他地方需要用到这个Id,请使用 "Value={Id}"。
小结:
文中只是提到了本人在实际压力测试中使用loadrunner过程中的一些心得,当然功能强大的Loadrunner 远不止这么一点功能可以来让我们挖掘。比如loadrunner事务的使用、对事务插入集合点等。强大的图标分析器等等
这些就留给读者自己去实践了。