带着问题看本文
一、关联的含义
在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。
换句话说,关联就是把脚本中某些静态值,用服务端返回的、动态的、每次都不同的数据来代替。
关联属于一种特殊的参数化。
为什么要做关联呢?这就需要理解服务端处理客户端请求时用到的一种技术:session和cookie。
每当有请求发送到服务端时,服务器首先检查这个请求里是否已包含了一个sessionID(可以看做是一个具有唯一标识的辨识码),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用,如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的sessionID,这个session id将被在本次响应中返回给客户端保存。这就是回放录制的脚本会失败的原因。
下面的图可以更形象的解释:
当录制脚本时,浏览器送出网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个sessionID=123的数据,当浏览器再送出网页B的请求时,这时就要用到sessionID=123的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。
在回放脚本时会发生什么状况?浏览器再送出网页B的请求时,用的还是当初录制的sessionID=123的数据,而不是用服务器新给的sessionID=456,所以执行到对session校验的地方时就会失败。
如果这个解释还不够清晰,我们以LR自带的订票系统来解释。
打开网址http://127.0.0.1:1080/WebTours/,此时客户端发出获得登录页面的请求,服务器端得到该请求后,动态生成一个Session Id,并将其连同登录网页的信息一同返回给客户端。如图所示。
当用户输入用户名密码,请求登录时,该Session Id同时被发送到服务器端;
如果该Session Id在当前会话中有效,那么返回登录成功的页面,如果不正确则登录失败。
在第一次录制过程中LR把这个值记录了下来,写到了脚本里,但再次回放时,客户端发出同样的请求,而服务器端再一次动态的生成了Session Id,此时客户端浏览器再次输入用户名和密码请求登录时,还是用旧的Session Id,发出的请求就是错误的,为了获得这个动态的session Id我们就需要用到关联。
若需要对session和cookie加深理解,可以参考本文《session与cookie的区别详解》。
二、什么时候需要做关联
换句话说,如何找出要关联数据呢?
原则上,当客户端的某个请求是随着服务端的响应而动态变化的时候,我们就需要用到关联。(即脚本每次执行时都需要获得唯一标识的地方就需要关联。简单地说,每一次执行时都会变动的值,就有可能需要做关联。)
在录制脚本前,我们可以对测试的项目进行适当的了解,弄清楚哪些请求需要用到服务器响应的动态值,如果我们不明确哪些值需要做关联的话,我们也可以将脚本录制两遍,通过对比脚本的方法来查找需要关联的部分。
三、如何做关联
关联相关的函数:
web_reg_save_param;
web_create_html_param;
web_create_parmam_ex;
其中,web_create_html_param和web_create_parmam_ex这两个函数保留下来主要是为了兼容以前旧版本。目前主要使用web_reg_save_param。
关联有两种机制:自动关联和手动关联。
3.1 自动关联
VuGen内建自动关联引擎(Auto-correlation Eengine),提供Rules Correlation 和Correlation Studio 两种机制,可以自动找出需要关联的值,并自动建立关联。
Rules Correlation
在录制过程中VuGen会根据使用者事先制定的规则,实时自动找出要关联的值。规则的来源有内建(Built-in Correlation)和使用者自定义(User-defined Rules Correlation)关联规则两种。
内建(Built-in Correlation):VuGen已经针对常用的一些应用系统(如AribaBuyer、BlueMartini等),内建了一些关联规则。可以在【Recording Options】>【HTTP Properties】>【Correlation】中启用关联规则,启动关联后,当录制这些应用系统脚本时,VuGen会在脚本中自动建立关联。
除了内建的关联则之外,使用者也可以自定关联规则。可以在【Recording Options】>【HTTP Properties】>【Correlation】建立新的关联规则。
Correlation Studio
有别于“Rules Correlation”,“Correlation Studio”是在执行脚本后才会建立关联,也就是说当录制脚本后,脚本至少需被执行过一次时“Correlation Studio”才会起作用。“correlation studio”会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。
当录制的应用系统不属于VuGen预设支持的应用系统时,“Rules correlation”可能无法发挥作用,这时可以利用“Correlation Studio”来进行关联。
使用“Correlation Studio” 的步骤如下:
注意:
3.2 手动关联
手动关联的步骤如下(1、2步可选):
第一步:录制测试脚本,录制两遍;
第二步:使用文本比较(如Bcompare)工具找出两次脚本的不同,判断是否需要进行关联;
第三步:使用web_reg_save_param函数手动建立关联;
第四步:验证关联函数是否正确。
具体执行如下:
第一步:录制测试脚本,录制两遍;
先录制一份脚本存档,取名为loginA,再依照相同的操作步骤与数据录制第二份脚本并保存,取名为loginB并关闭loginB;(两次录制的操作步骤及使用的数据最好保持一致)
第二步:使用文本比较(如Bcompare)工具找出两次脚本的不同,判断是否需要进行关联;
用LR自带的工具WinDiff举例。在脚本loginA中,单击VuGen的菜单tool→compare with vuser...,并选择loginB,如下图所示:
接着WinDiff会开启,同时显示两份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。
假如没有看到红色字体,请单击“Options>View>Show inline Differences”,如下图所示:
逐一检查两份脚本中差异的部分,每一处差异都有可能是需要做关联的地方。
第三步:使用web_reg_save_param函数手动建立关联
在插入关联函数前,我们先介绍关联函数web_reg_save_param
语法:int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
用法举例:
web_reg_save_param ("sessionid","LB=Session_id:","RB=;","Search=Body",LAST);
参数说明:
ParamName: 存放得到的动态内容的参数名称;
list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写;
怎么插入关联函数呢?
在Function Reference 中搜索web_reg_save_param,找到C语言下的实例进行复制,然后粘贴到脚本对应区域,然后对对应的值进行替换。
一般情况下关联函数写到发出请求的函数之前就可以了。如下图所示:
还有一种添加的方法,鼠标右键选择【insert】>【net step...】>在add step界面,step type中选择services>web_reg_save_param,单击【ok】键,弹出如下图所示:
单击【OK】键,显示如下信息:
web_reg_save_param("11",
"LB=2",
"RB=2",
"Search=Body",
LAST);
最后,对脚本中需要参数化进行替代。
对于确定参数的左右边界,可以在Replay Log中通过ctrl+F查找,如下图所示:
对于引号需要使用【\】作转义,例如上面的左边界可以写成name\"lt\" value=\" ,右边界可以写成\" 。
转义字符总结
在做手动关联时,取边界值的时候,会经常用到转义字符,现将转义字符整理如下:
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\\ 反斜杠
\? 问号字符
\' 单引号字符
\" 双引号字符
\0 空字符
第四步:验证关联函数是否正确。
首先设置一下输出日志,在VuGen的工具栏运行时设置【Run-time Settings】>log>勾选Enable logging>Always send messages>Extended log>勾选Parameter substitution。如下图所示:
回放脚本时,会在Replay Log日志中可以显示关联参数的相应值,此值是动态变化的,每一次执行后,显示的值都不一样。如下图所示:
本文来源 | 在网络文章基础上进行了深度加工
本期编辑 | Mack