最近项目用到的loadrunner终于告一段落,现在趁还记得LR的使用方法,写下自己在项目中遇到的困难和解决方法,方便有需要的同志。我不是专门研究LR的人,只是作为职场新人服从上级安排,临时研究,若有不合理的地方请多多包涵。
简单的说下用到的LR,socket协议~需要IP欺骗,监控服务器的性能,模拟用户与平台进行交互。
用户是IP认证的~一个IP唯一一用户。
遇到的难点主要有以下几个方面:
(1) IP认证
因为需要模拟大量的IP,所以需要借鉴LR的IP欺骗,具体的实现方法可以google一下。说的很详细。
难点在于为什么设置了IP欺骗的操作后,还是无法实现IP欺骗?
首先确认测试机是否是XP系统,我曾经在win7系统上实验,绞尽脑汁无法实现,平台的日志看到是同一的IP不同的端口建立的socket链接。但是在XP系统上,可以完美的实现IP欺骗。
其次要确认选择的是LR的scenario是否开启了”enable IP Spoofer“
(2)关于socket的buf内容(也就是data.ws),在测试的时候我们可能需要变量化参数,因为我这边的IP地址是和用户名是一一对应的。所以我在录制脚本完后,再需要变量化的地方右键,选择file,然后可以用其他工具批量生成用户名,再参数那边设置如下
(3)关于socket的response的判定。
LR不会自动给你判断response是否正确,这样需要我们加代码去判断,但是对于变长的buf内容我们如何去判断呢?如果采取固定写死的方法,写的太笨拙,不利于脚本的二次利用,再万能的google后,可以用
lrs_save_searched_string()方法进行判断。具体的含义英文好的看官网文档,英文不好的可以看各种博客~下面贴上我的代码,写的不太好见笑了~
lrs_send("socket1", "buf0", LrsLastArg); lrs_receive("socket1", "buf1", LrsLastArg); lrs_save_searched_string("socket1", LRS_LAST_RECEIVED, "result", "LB/BIN=result", "RB/BIN=\\\"", 1, 2, -1);
这样会把上一个receive的buf内容里面第一个含有result的字符开始从你设置的"LB/BIN” 与“RB/BIN”之间部分截取下来,so我要比对result后面是什么~我关心的只是result是否是OK的,所以
re=lr_eval_string(""); result = stricmp(re, tmp); if(result==0){ lr_output_message("result is OK"); }else{ lr_output_message(" result is NOT OK"); return -1; }
return -1 是直接退出,貌似有点太粗鲁了。。。
(4)关于接收的buff与录制脚本的buff长度不一致,mismatch的解决办法
有时候因为这个那个原因,我们实际的buf可能与录制脚本的buff不太一样,所以导致系统提示XXX mismatch
这时候我的处理办法很简单,加入lrs_set_receive_option(EndMarker, StringTerminator , "XXX");
其中XXX是你消息的结尾表示。譬如,
lrs_send("socket1", "buf0", LrsLastArg); lrs_set_receive_option(EndMarker, StringTerminator , ""); lrs_receive("socket1", "buf1", LrsLastArg);
这样buf在读取的时候,读到/xml 就停止了,不会提示mismatch什么的,具体还是查查官方文档关于lrs_set_receive_option的用法~但是有一点一定要注意,lrs_set_receive_option好像是只起一次作用,所以在每个receive前面我都加了这个lrs_set_receive_option
(5)虚拟机与另外一台局域网下的物理机之间的设置
再记录win7的server之前,我想告诫一下自己多学习一下网络的基础知识。
win7物理机serverIP是 192.168.1.2 255.255.255.0 192.168.1.1
XP虚拟机设置的IP是 192.168.1.4 255.255.255.0 192.168.1.1
win7 ping不通XP虚拟机。。。
XP虚拟机可以ping通 win7 sever,可以访问win7 server
但是XP虚拟机IP改为192.168.2.4 ,双方都ping不通了~
后来查了半天原因,忙上忙下解决不了,被逼无奈只能求助于高手,高手问了问我的需求后说,把子网掩码改大一点点就可以了。。。于是乎我改为以下设置
win7 server 是 192.168.1.2 255.255.0.0
XP虚拟机 是 192.168.1.4 255.255.0.0
不设置网关也不设置DNS,因为我的机器只需要虚拟机与server交互即可,其他的不在乎~
(6)XP虚拟机如何远程监控win7的server
其实很简单,
首先WIN7开启服务Remote Procedure call、Remote Procedure Call (RPC) Locator、Remote Registry
其次右击“我的电脑”——“管理”——“共享文件夹”——选择“共享”,查看是否存在C$,如若不存在就要新建一个。
然后在测试机,也就是XP虚拟机下,在地址栏输入\\win7的IP地址\C$ 回车,再弹出的对话框输入win7系统的用户名和密码,如果能登陆成功,就可以了
最后再测试机XP虚拟机的LR的scscenario的下按照如图设置
选择add measurements 然后点击add 输入win7的IP 然后选择vista 然后确定,就可以了
(7)关于LR的transaction的理解
起初我总是录制完脚本,然后一同乱改,没有加入transaction的概念,最后总是觉得很怪异,后来加入transaction,才发现原来如此美妙。
起因是我们需要对响应时间进行分析,优化工程代码,开始我决定用timer,也就是LR自带的定时器,发现这样只能算出用时多少,不能算avgtime,后来再某一LR_send与LR_receive之间加入transaction的定义,才发现,原来如此简单,不多说,贴上我的例子,大家参考
lr_start_transaction("demo transaction"); lrs_send("socket1", "buf0", LrsLastArg); lrs_set_receive_option(EndMarker, StringTerminator , ""); lrs_receive("socket1", "buf1", LrsLastArg); lr_end_transaction("demo transaction",LR_AUTO);
这样在脚本的log中会出现Notify: Transaction "demon transaction" ended with "Pass" status (Duration: 0.2552).
再scenario中会出现