LoadRunner-关联详解

关联是LoadRunner的精髓,可以说不会关联就不会性能测试,在网上有很多关于关联的文章和博客,但是发现很多文章把做关联时如何确定两份脚本中不同的值是否需要关联,以及关联函数插入的位置的确定都介绍的很模糊,我感觉这里是重点,因为这个过程有两次查询日志的操作,且这两次的目的并不一样,而且两次复制的查找内容也是不同的,初学者很容易搞晕。这里网上很多教程介绍两次都复制脚本中的动态值去日志中查找,真心不明白。Replay log是回放日志,脚本经过回放后服务器返回的唯一辨识码已经改变,再次复制录制时的脚本中的辨识码去查找怎能找到?反正本人当初是被很多文章给误解了。下面进入正题,我们用LoadRunner自带的订票系统做演示。

 

在做关联之前我们先了解一下LoadRunner的工作原理,这样更便于理解为什么会做关联。

当执行脚本时,VuGen伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。
所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。

所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
举一个常见的例子,服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为Session ID。对于每个新的交易,服务器都会产生新的Session ID给浏览器。这也就是为什么执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或是它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。

如上图,当录制脚本时,浏览器送出网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个ID=123的数据,当浏览器再送出网页B的情求时,这时就要用ID=123的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。
在执行脚本时会发生什么状况?浏览器再送出网页B的请求时,用的还是当初录制的ID=123的数据,而不是用服务器新给的ID=456,整个脚本的执行就会失败。请仔细去理解此图内容,这里真正明白下面内容就好理解了。

 

手动关联的过程大致如下:

第一步:录制测试脚本,录制二遍

第二步:使用BeyondComparePortable工具找出两次脚本的不同,判断是否需要进行关联

第三步:确定插入关联的位置
第四步:在VIEW TREE中使用web_reg_save_param函数手动建立关联 
第五步:将脚本中有用到关联的数据,用参数代替

第六步:验证关联的正确性

 

下面详细介绍:

第一步:

录制测试脚本,录制二遍

这一步就不用多说了,相同的操作,录制两份,分别保存

第二步:

使用BeyondComparePortable工具协助找出需要关联的数据 
1. 在第二份脚本中,点选VuGen的【Tools】>【Compare with Vuser…】,并选择第一份脚本。 
2. 接着BeyondComparePortable会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options】>【View】>【Show Inline Differences】)。

查看二份脚本中差异的部份,每一个差异都可能是需要做关联的地方。

注意:lr_thik_time部分的差异可以忽略

找到不同的部分,然后在输出窗口的【Generation Log】中按Ctrl+F,在查找窗口中粘贴差异部分的内容,点击查找找到后,查看该部分的信息,确认是客户端的请求信息还是服务器回应的信息。

如果出现在****** Request Header For Transaction With Id 3 ******等类似的部分中,那证明是客户端发出的请求,这里是不需要做关联;一般做的关联都是出现在****** Response Body For Transaction With Id 13 ******等类似的Response部分的内容,找到这个信息,记录如下内容:

如果出现在$$$$$$ Request Header For Transaction With Id 3 Ended $$$$$$这个部分,那证明是客户端发出的请求,这里是不需要做关联的

一般做的关联都是出现在****** Response Header For Transaction With Id 7 ******和****** Response Body For Transaction With Id 7 ******中的部分。

在找到这个信息后,需要记录如下信息:

A、记录这个不同数据之前的内容和之后的内容,如这里的不同数据是带红色部分(<input type=hidden name=userSession value=106846.044795464ftQfiQDptcQVzzzHDcQHfpDzAfHf>)那么它的左边界就是"<input type=hidden name=userSession value=",而右边界就是">"(边界内容越详细越好)。

B、记录这个不同数据出现的位置,是Header还是Body。

4、确认插入关联的位置:

需要重新运行一次脚本,运行前先点击【Vuser(U)】->【Run-time Settings】->[Log],将【Log】中的【Enable logging】勾选上,选择【Extended log】,将【Extended log】中的选项全部勾选上。

重新运行完脚本后,点击输出窗口的【Replay Log】,按CTRL+F,粘帖上<input type=hidden name=userSession value=然后找到两次录制脚本不同点的位置,即如下这一行数据,双击此处,在脚本中的位置之前就是需要插入关联函数的地方。

Action.c(4): <input type=hidden name=userSession value=106853.155690563ftQzcfQpVQfiDDDDDcQHHpfffVHf>\n

5、插入关联函数:

右击上一步骤中,搜索到的脚本位置,在其上方的空白处右击,【插入】->【新建步骤】,弹出添加步骤输入框,输入“web_reg_save_param”,点击确定,弹出将数据保存到参数中输入框,在参数名中输入“UserSession”,左边界“<input type=hidden name=userSession value=”,右边界“>”,勾选搜索范围,选择“正文”,然后点击确定。
成功插入后应看到如下的正确函数:

web_reg_save_param("UserSession",
"LB=input type=hidden name=userSession value=",
"RB=>",
"Search=Body",
LAST);
6、将脚本中有用到关联的数据,用参数代替:

如发出请求的参数如下,那么将原来服务器返回的动态值使用{ UserSession } 来替换:

7、最后验证关联的正确性:
  回放脚本,验证关联的正确性。

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2017-08-16 10:05  小明变幻每当的预想  阅读(323)  评论(0编辑  收藏  举报