LoadRunner-关联详解

原文链接:http://blog.csdn.net/u011446864/article/details/38395975

关联是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部分的差异可以忽略

找到不同的部分后,复制,然后打开Recording Log或是CodeGenerationLog.txt,按Ctrl+F,在查找窗口中粘贴差异部分的内容,点击查找找到后,查看该部分的信息,确认是客户端的请求信息还是服务器回应的信息

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

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

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

a.记录这个不同数据之前的内容和之后的内容

b.记录这个不同数据出现的位置,是Header还是Body

第三步:

确认插入关联的位置

我们在日志中找到了两次脚本的不同点的位置,根据这个位置,我们再确定是在哪个请求之后产生的,也就是说要定位发生不同点的response是由哪个request产生的,找到了这个请求的函数位置,我们就知道要往哪里做关联了

一般情况下关联函数写到发出请求的函数之前就可以了

第四步:

插入关联函数

在插入关联函数前,我们先介绍关联函数web_reg_save_param

一个web_reg_save_param函数的例子:

web_reg_save_param ("sessionid",

"LB=Session_id:",

"RB=;",

"Search=Body",

LAST);

在这里我们只介绍几个常用参数的含义

语法: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。属性值不分大小写

LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。

RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。

Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。

那么如何插入该关联函数呢?

1.将vugun切换到 view tree 模式下

2.在左边的列表中,找到在上一步发出请求的函数,点击“右键”

选择“insert before”

3.在弹出的“add step”对话框的“find function”中输入“web_reg_save_param”,点击“ok”

在“parameter name”中输入,关联函数的名称,这里最好有含义,“sessionid”

在“left boundary”中输入,刚才记录下的不同点字符串的左面的几个字符,定义左边界,Session_id:

在“right boundary”中输入,刚才记录下的不同点字符串的右面的几个字符,定义右边界,;

在“search in ”中,选择“body”

点击“ok”

4.回到脚本编辑模式下,查看该函数插入是否正确

在发出请求的函数前应该看到:

web_reg_save_param ("sessionid",

"LB=Session_id:",

"RB=;",

"Search=Body",

LAST);

第五步:

将脚本中有用到关联的数据,用参数代替

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

web_submit_form("login.php_2",

"Snapshot=t2.inf",

ITEMDATA,

"Name=login", "Value=wangjin", ENDITEM,

"Name=password", "Value=wangjin", ENDITEM,

"Name=Session_id","Value={ sessionid } ", ENDITEM,

"Name=Submit", "Value=Login", ENDITEM,

EXTRARES,

"URL=/media/images/border_bg_l.gif", ENDITEM,

"URL=/media/images/header_bg.gif", ENDITEM,

"URL=/media/images/th.gif", ENDITEM,

LAST);

第六步:

验证关联的正确性

回放脚本,验证关联的正确性

时间: 2024-08-06 19:30:02

LoadRunner-关联详解的相关文章

Loadrunner手动关联详解

Loadrunner手动关联详解 一.关联的含义: 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联. 二.关联的过程: 以登陆场景为例,客户端发出获得登录页面的请求,服务器端得到该请求后,返回登录页面,同时动态生成一个Session Id,当用户输入用户名密码,请求登录时,该Sessi

LoadRunner参数化详解(转)

距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作.这算是一个认知的过程吧! 在次安装打开loadrunner时,发现虽然自己的思想还在,但已经非常生疏了,好多设置都找不到了具体的位置.下面说参数化参数化是性能测试中时最常用的一种技巧吧!这里需要说明的是,不是只有loadrunner才可以设置参数化,我以前所使用的JMeter

Loadrunner安装详解

Loadrunner安装详解 一.下载篇. 我的下载地址是:http://www.jb51.net/softs/71240.html 程序4G多,很大. 二.           安装篇 1.运行“setup.exe” 2. 点击安装,其中会有提示缺少“Microsoft Visual C++ 2005 SP1运行组件”,下载这个组件.这里安装“vcredist_x86.exe”.安装完成后在一次运行“setup.exe”时,安装程序会自动检查所需组件是否都已安装,确定都安装后弹出如下页面. 3

[转]LoadRunner参数化详解

http://www.cnblogs.com/fnng/archive/2012/06/22/2558900.html 距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作.这算是一个认知的过程吧! 在次安装打开loadrunner时,发现虽然自己的思想还在,但已经非常生疏了,好多设置都找不到了具体的位置.下面说参数化参数化是性

LoadRunner参数化详解

距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作.这算是一个认知的过程吧! 在次安装打开loadrunner时,发现虽然自己的思想还在,但已经非常生疏了,好多设置都找不到了具体的位置.下面说参数化参数化是性能测试中时最常用的一种技巧吧!这里需要说明的是,不是只有loadrunner才可以设置参数化,我以前所使用的JMeter

Eclipse的SVN插件与本地svn客户端关联详解

在我们的工作项目的开发中,我们经常使用svn, 之前我们没有使用eclipse软件的时候,我们都是在编辑器修改好代码之后,去在本地svn的那条流来提交代码的,但是我们的eclipse非常强大,我们在eclipse编辑修改好代码之后,可以直接在eclipse来点击按钮就可以提交了(需要在eclipse里面安装svn插件). 1.问题 我们在eclipse里面使用svn插件一般有两种方法: 方法一: 当我们用本地SVN客户端(TortoiseSVN)把代码更新到本地,并导入到eclipse之后,却发

LoadRunner函数详解之web_reg_find

https://blog.csdn.net/jiang1986829/article/details/47616399 定义:在HTML页面查询指定的文本字符串函数形式:web_reg_find( const char *attribute_list, LAST );这里写图片描述 示例1:查询字符串“Welcome”,如果该字符串未被查找到,则函数检查失败,脚本停止执行 web_url("MercuryWebTours",         "URL=http://local

loadrunner11.0 安装破解详解使用教程

loadrunner11.0 安装破解详解使用教程 来源:互联网 作者:佚名 时间:01-21 10:25:34 [大 中 小] 很多朋友下载了loadrunner11但不是很会使用,这里简单介绍下安装教程,需要的朋友可以参考下 Loadrunner安装详解 一 .下载篇. 我的下载地址是:http://www.jb51.net/softs/71240.html 程序4G多,很大. 二.           安装篇 1.运行“setup.exe” 2. 点击安装,其中会有提示缺少“Microso

转:LoadRunner中参数化技术详解

LoadRunner中参数化技术详解 LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提交不同的数据,或者使用多个不同的值进行循环输入.这时,在LoadRunner中就可以进行参数化设置,以使用多个不同的值提交应用请求. [参数化]使用指定数据源中的值来替换脚本录制生成的语句中的参数. [好处] l  减少脚本的大小 l  提供使用不同的值执行脚本的能力,更加真实的模拟现实应用. [参

【Hibernate步步为营】--双向关联一对一映射详解(二)

很不好意思,有两天时间没有更新博客文章了,不写文章的日子还真是感觉很空洞啊,养成了写文章的恶习想改也改不掉啊.说点题外话,前两天收到一位朋友的私信,邀请笔者写一篇有关OWS的文章,用来研究图标工具的一种技术,很荣幸收到这位朋友的邀请,但是因为这几天开发的项目着急上线所以暂时没有时间去研究,只能等这周末了,利用周末的时间来研究然后更新类似的技术文章. 回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-o