一、什么是关联
关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。也是把脚本中某些写死的数据,转变成动态的数据。
什么内容需要关联:当脚本中的数据每次回放都发生变化时,并且这个动态数据在后面的请求中需要发送给服务器,那么这个内容需要通过关联来询问服务器,获得该数据的变化结果。例如:
1.登录字符串。带有会话 ID 或时间戳等动态数据的登录字符串。
2.日期/时间戳。使用日期或时间戳或者其他用户凭据的任意字符串。
3.常见前缀。后跟字符串的常见前缀,如 SessionID 或 CustomerID
关联分为:自动关联、边录边关联、手动关联
2.按ctrl+f8扫描脚本并建立关联,扫描完后,可以在脚本下方的【Correlation Results】中看到扫描的结果,可以选择【All Action 】、【Current acton】或者 【current Step Only】选项,点击【Correlate】按钮进行关联。
3.关联成功后切换到Script View视图,可以看到脚本多了关联函数web_reg_save_param_ex(),而关联出来的内容分别被保存到CorrelationParameter_1、 CorrelationParameter_2、 CorrelationParameter_3参数中去。如图: 4.web_reg_save_param_ex()函数可以代替web_reg_save_param()函数。此函数搜索 Web 步骤中左边界后为字符串和右边界的服务器响应,并将字符串保存到函数实参中指定的形参。
web_reg_save_param_ex("ParamName=CorrelationParameter_1",
"LB= value=\"",
"RB=\">\r\n<input type",
SEARCH_FILTERS,
"Scope=Body",
"RequestUrl=*/passport.baidu.com/*",
LAST);
IC 和 /BIN 在web_reg_save_param都是有的
/RE 是web_reg_save_param_ex才有,意思是左右边界值可以使用正则表达式。
"RB/RE=\" name=\"chkItem_......\"\r\n 中的......就表示任意字符了。
Scope 表示搜索的范围
RequestUrl 表示指定的请求(如点击一个按钮,可能有几个请求链接组成的,通过这个属性可以缩小范围)
三、边录边关联---Rules Correlation
Rules Correlation
启用系统默认提供的自动关联设置,在录制过程中VuGen会根据已经制定的规则,自动找出要关联的值。
内建关联(Bulit –in Correlation)
针对常用的一些应用系统,如oracle、peopleSoft、Siebel等,内建关联规则,这些应用系统可能会有一种以上的关联规则。在【Recording Options】>【Correlation】中启用关联规则,则当录制这些应用系统的脚本时,VuGen会在脚本中自动建立关联。如图:
四、用户自定义关联规则(User-defined Rules Correlation)
在【 Recording Options】>【Correlation】建立新的关联规则。点击【new Application】按钮建立关联,然后在这个应用下点击“New rule”按钮添加对应的关联规则。
以录制登录Webtours订票系统为例:
第一步,在Recording Options-Correlation中建立关联规则,单击New Application按钮,新建一个叫做lrwebtours的应用,然后在这个规则上单击New Rule 按钮新建一个规则,名叫usersessionid,为该规则填写左右规则,左边界为userSession Value=, 右边界为>,确定后保存。如下图:
2.开始录制webtours订票系统登录业务。
3.录制完订票系统登录业务脚本后,可以发现系统已经自动按照规则生成了关联函数,运行脚本直接通过。
手动关联是关联应用的最有效手段,通过函数web_reg_save_param()进行关联。web_reg_save_param()将想要的字符串保存到一个参数中。
web_reg_save_param函数主要根据需要做关联的动态数据前面和后面固定字符串来识别、提取动态数据,所以在关联时需要找出动态数据的左、右边界字符串。
Web_reg_save_param函数格式:
web_reg_save_param(const char*ParamName,<list of Attributes>,LAST
参数名 | 参数说明 |
ParamName | 存放动态数据的参数名称 |
List of Arrtributes | 其它属性,包含Notfound、LB、RB、RelFrameID 、Search、ORD、Saveoffset、Convert以及SaveLen |
NOTfound | 指定当找不到要找的动态数据时该怎么处置。notfound=error:当找不到动态数据时,发出一个错误信息,此为loadrunner的默认值。notfound=warning:当找到动态数据时,不发出错误信息,只发出警告,脚本也会继续执行下去不会中断。 |
LB | 动态数据的左边界字符串,该参数为必选参数,而且区分大小写。要忽略大小写,请在边界之后添加“/IC”。如果在边界之后指定“/BIN”,则指定为二进制数据 |
RB | 动态数据的右边界字符串,该参数为必选参数,而且区分大小写。要忽略大小写,请在边界之后添加“/IC”。如果在边界之后指定“/BIN”,则指定为二进制数据 |
ORD | 此可选参数表示匹配的序号或出现的次数,该参数为必选参数,默认值是1。如果指定“All”,是将所有找到的动态变量保存到数组中。 |
Search | 搜索的范围,可以是headers(只搜寻页眉)、body(只搜寻正文部分,不搜寻页眉)、Noresource(只搜寻正文部分,不搜寻页眉与resource部分)或是all (搜寻全部范围),该参数为可选参数 |
RelFrameID | 与请求的 URL 相关的 HTML 页的框架结构层次级别。可以为 ALL 或数字 |
Saveoffset | 设置关联的内容偏移量,从第几位开始进行关联操作。此属性值不可为负数,默认是0 |
Convert |
可能的值有两种。 HTML_TO_URL:将HTML-encoded数据转成URL-encoded数据格式。 |
Save length | 关联出来的内容所需要保存的长度。从offset开始算起,到指定长度内的字符串,才储存到参数中,该参数为可选参数,默认值是-1,表示储存到结尾整个字符串。 |
关联函数的注意事项:
1.关联函数是一个注册函数,必须写在请求前,否则就会提示无法获得关联结果的错误。
2.保存参数最大不能超过256字节,如果超过256字节请使用int web_set_max_html_param_len (const char *length )函数扩大参数保存范围。
例如:web_set_max_html_param_len (“1024”); //扩大参数最大保存范围为1024字节。
3.如果输入的内容里面有双引号,那么需要通过转义符来进行处理,转义符为\。Web_reg_save_param(“param”,“LB=\”左边界”,“RB=”,LAST);
4.关联函数的作用一种规则将服务器的返回保存到一个参数中,所以为查看参数的内容,应勾选参数取值的Extended log日志的三个选项。运行脚本查看Reply log日志,会看到蓝色参数值罗列出来”Notify:saving Parameter =“,后面都是被关联到的服务器返回关联值。
5. 动态数据需要关联的服务器返回信息一般都保存在HTML正文中。所以关联函数中设置将search in=Noresource,也就是只需要关联HTML、XML等资源。
6.修改关联函数:1.直接在代码上直接修改,2切换到tree模式,双击关联函数进行修改。
7.整个HTTP请求分为两段,一段是开头的HTTP头数据包,叫做header,另外一段就是HTML页面,叫做body。
8.关联函数转义符:
转义符号
说明
\b
Backspace 键
\f
换页
\n
换行
\r
回车
\t
水平制表符
\v
垂直制表符
\’
单引号标记
\’’
双引号标记
\\
反斜杠
\?
文本问号
关联操作步骤:
第一步:录制两份相同的业务流程的脚本,输入的数据要相同
第二步:用winDiff工具,找出两份脚本之间不同之处,确定需要关联的动态数据,在请求返回中找到动态数据的左右边界
第三步:用web_reg_save_param()函数手动建立 关联,将脚本中用到关联的数据参数化,将关联的值提供给后续请求页面使用。
以录制登录Web tours 系统为例:
1.录制两份相同的登录Web Tours网站脚本
2.用WinDiff工具,找出两份脚本之间的不同,也就是需要关联的数据。
(1)用 lr打开第二份脚 本,依次选择[tools]>[compare with vuser…]项,在弹出对话框中选择第一份脚本。
(2)用lr调用WinDiff工具,显示两份脚本, WinDiff工具会以一整行×××标示显示有差异的脚本代码行。可以看到有三处不一样,第一处是userSession,另外二外是点击按钮时的x,y坐标。 lr_think_time思考时间不同,可以忽略。如图:
(3)在Generation log中打开[find]对话框,粘贴userSession的值,查找在Generation log出现的位置。如果在Generation Log中找到了要找的数据,这时要确认是从服务器端传送过来的数据。如图:
如果出现在$$$$$$ Request Header For Transaction With Id 3 Ended $$$$$$这个部分,那证明是客户端发出的请求,这里是不需要做关联的
一般做的关联都是出现在****** Response Header For Transaction With Id 7 ******和****** Response Body For Transaction With Id 7 ******中的部分。
3.确认插入关联的位置
关联函数写到发出请求的函数之前,我们将关联函数插入在Web tours登录页面:
4.插入关联函数
(1)通过设置左右边界字符串,找出变化的数据(即需要做关联的数据)并将其储存在一个参数中,以供后续脚本使用。我们设置登录web tours脚本userSession的左边界为userSession value=,右边界为>,search=body,ord=3,如图:
(2)插入关联函数。
1.右键选择“Insert-New Step” 在弹出的“add step”对话框的“find function”中输入
在“Parameter name”中输入关联函数的名称 “usersessionid”
在“Left Boundary”中输入“userSession value=”
在“Right Boundary”中输入“>”
在“Search in ”中选择“body”
在“Instance”输入“3”
点击“ok”即可。如图:
5.将脚本中有用到关联的数据,用参数代替将原来服务器返回的userSession动态值使用{usersessionid} 来替换:
6.验证关联的正确性。
回放脚本,出现vuser_init.c(12): Registering web_reg_save_param was successful [MsgId: MMSG-26390]信息说明关联成功,也可以用打印函数lr_log_message把将得内容存入日志用于检查关联是否成功。如图:
lr_log_message(“getvalue : %s”,lr_eval_string (“{usersessionid}”));