如何做LR自动关联和手动关联?
一、什么时候需要关联
1.关联的含义
关联的含义A(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。
关联的含义B(correlation):就是把脚本中某些写死的代码(hard_coded)数据,转变成撷(xie)取自服务器所送的、动态的、每次都不一样的数据。
其实关联也属于一种特殊的参数化,只是与一般的参数化有些不同
一般的参数化的参数来源于一个文件、一个定义的table、通过sql写的一个结果集,但关联所获得的参数是服务器响应请求所返回的一个符合条件的、动态的值。
举一个常见的例子,刚刚提到有些比较聪明的服务器,这些服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为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,整个脚本的执行就会失败。
下面的图示说明了这样的情形:
要对付这种服务器,我们必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代掉脚本中有用到Session ID的部份,这样就可以成功骗过服务器,正确地完成整个交易了。
二、什么时候需要做关联
要想弄清这个问题,我们首先要知道客户端与服务器端的请求与响应的过程
过程说明:
客户端发出获得登录页面的请求,服务器端得到该请求后,返回登录页面,同时动态生成一个Session Id
当用户输入用户名密码,请求登录时,该Session Id同时被发送到服务器端;如果该Session Id在当前会话中有效,那么返回登录成功的页面,如果不正确则登录败。
在第一次录制过程中LR把这个值记录了下来,写到了脚本中,但再次回放时,客户端发出同样的请求,而服务器端再一次动态的生成了Session Id,此时客户端浏览器再次输入用户名和密码时,请求登录,还是用旧的Session Id
,发出的请求就是错误的,为了获得这个动态的session Id我们这里用到了关联。
所以我们得出结论:
当客户端的某个请求是随着服务器端的相应而动态变化的时候,我们就需要用到关联。(凡是脚本每次执行时都必须获得唯一标识的地方都需要关联。)
当然我们在录制脚本时应该对测试的项目进行适当的了解,知道哪些请求需要用到服务器响应的动态值,如果我们不明确那些值需要做关联的话,我们也可以将脚本录制两遍,通过对比脚本的方法来查找需要关联的部分,但并不是说两次录制的所有不同点都需要关联,这个要具体情况具体分析。
如何做关联?
关联会用到下列函数:
web_reg_save_param;
web_create_html_param;
web_create_parmam_ex;
其中,web_reg_save_param的语法为:
web_reg_save_param("parameter Name" , <list of Attributes>, LAST);
web_create_html_param和web_create_parmam_ex这两个函数主要是保留以兼容以前旧版本。建议使用web_reg_save_param.
- parameter Name:存放参数的名称
- LB:数据匹配,左边界
- RB:数据匹配,右边界
- Search:搜索范围(body,header,all,cookies)
- Ordinary:整数或是All(取出值的对应顺序,写all的话就匹配所有,写1的话只取出第一个值。)
- request URL:针对URL地址减少关联的范围
那么,如何找出要关联数据呢?简单地说,每一次执行时都会变动的值,就有可能需要做关联。VuGen提供两种方式帮助用户找出需要做关联的值:自动关联和手动关联。
三、关联有两种机制,自动关联和手动关联:
首先谈谈自动关联
VuGen内建自动关联引擎(Auto-correlation Eengine),提供Rules Correlation 和Correlation Studio 两种机制,可以自动找出需要关联的值,并且自动使用关联函数建立关联。
1、“Rules Correlation”:在录制过程中VuGen 会根据使用者事先制订的规则,实时自动找出要关联的值。规则的来源有内建(Built-in Correlation)和使用者自定义(User-defined Rules Correlation)关联规则两种。
内建(Built-in Correlation):VuGen已经针对常用的一些应用系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeropleSoft、Siebel、SilverJRunner等,内建了一些关联规则。这些应用系统可能会有一种以上的关联规则。
可以在单击“VuGen”启动>在菜单【Tool】>【Recording Options】>【HTTP Properties】>【Correlation】中启用关联规则,启动关联后,当录制这些应用系统脚本时,VuGen会在脚本中自动建立关联。也可以在【Recording Options】>【HTTP Properties】>【Correlation】检视每个关联规则的定义。
除了内建的关联则之外,使用者也可以自定关联规则。可以在【Recording Options】>【HTTP Properties】>【Correlation】建立新的关联规则。
请依照以下步骤使用“Rule Correlation”:
单击“VuGen”启动>在菜单【Tool】>【Recording Options】>【HTTP Properties】>【Correlation】,勾选“Enable correction during recording”,以启动自动关联。如下图所示:(建议不用,选择手动关联)
上面两个图片,都可以启动Recording Options,勾选“Enable correction during recording”,以启动自动关联。
假如录制的应用系统属于内建关联规则的系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeropleSoft、Siebel、SilverJRunner等,请勾选相应的应用系统。或者可针对录制的应用系统加入新的关联规则,此即为使用者自定的关联规则。
以下是自动关联的脚本,如下图所示:
Action()
{ //Correlation comment - Do not change!Original value='707897934' Name ='CorrelationParameter_1'
web_reg_save_param ("WCSParam_Diff1",//变量名
16 "LB=userSession value=",//左边界
17 "RB=>",//右边界
18 "Ord=1",//取值顺序
19 "RelFrameId=1.2.1",
20 "Search=Body",//搜索范围
21 LAST);
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST); lr_think_time(); web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={WCSParam_Diff1}", ENDITEM,//参数
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=JSFormSubmit", "Value=on", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
使用“Correlation Studio” 的步骤如下:
(1)录制脚本并执行。
(2)执行完毕后,VuGen会跳出“Scan Action for Correlation”窗口,询问用户是否要扫描脚本并建立关联,单击“yes”按钮,扫描脚本。
(3)扫描完后,可以在脚本下方的“Correlation Results”中看到扫描的结果。
(4)检查一下扫描的结果,选择要做关联的数据,然后单击“Correlation”按钮,逐次关联,或是单击“Correlate All” 让VuGen 一次就对所有的数据建立关联。
注意:由于Correlation studio会找出所有有变得的数据,但是并不是所有的数据都需要做关联,所以不是建议用户直接“Correlate All”。
重复步骤(1)~(4),直到所有需要做关联的数据都找出来为止。
注意:有时关联的地方有多处,前面的管理如果没有执行通过,执行将停止验证脚本的正确性,后面需要做关联的部分无法被扫描出来。
四、手动关联
手动关联的步骤如下:
第一步:录制测试脚本,录制两遍;
第二步:使用WinDiff工具找出两次脚本的不同,判断是否需要进行关联;
第三步:使用web_reg_save_param函数手动建立关联;
第四步:将脚本中有用到关联的数据,已参数代替;
第一步:录制测试脚本,录制两遍;
先录制一份脚本存档,取名为loginA,再依照相同的操作步骤与数据录制第二份脚本并保存,取名为loginB并关闭loginB;(两次录制的操作步骤及使用数据最好保持一模一样)
第二步:使用WinDiff工具找出两次脚本的不同,判断是否需要进行关联;
在脚本loginA中,单击VuGen的菜单tool→compare with vuser...,并选择loginB,如下图所示:
第三步:接着WinDiff会开启,同时显示两份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没有看到红色字体,请单击“Options>View>Show inline Differences”)如下图所示:
逐一检查两份脚本中差异的部分,每一处差异都有可能是需要做关联的地方,选取差异的脚本,然后复制。在复制时,有时并不需要整行脚本,可能只会选择脚本中的一部分。
注意:lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间,这一部分可以忽略。
接着打开Recording Log(单一协议)或是Generation Log(多重协议)中找到这个值。我个人推荐在Generation Log的第一行开头,按Ctrl+F组合键,开始“find”窗口,黏上刚刚复制的脚本,找出其在Generation Log第一次出现的位置。
例如:上图中一行和第二行的差异已经让系统自动做了关联,故不管;在第三行中两个脚本存在差异性。差异的地方在【LT-68750-afrD2frlzMHDQ1wwDsjlNugZgY0mxw】,此时复制这一差异点,在Generation Log中进行查找。查找的结果如下图所示:
找到数据后,看此差异在什么地方,检查数据的标头,例如上面查找的
【LT-68750-afrD2frlzMHDQ1wwDsjlNugZgY0mxw】在Body区域,如下图所示:
一般情况下关联函数写到发出请求的函数之前就可以了。如下图所示:
第四步:插入关联函数
在插入关联函数前,我们先介绍关联函数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(缺省)。该属性质可有可无。
怎么插入关联函数呢?
根据我的经验,当找到两个脚本的差异后,在对应区域插入关联函数,单击回车键,显示一行为空,在此行可以手动输入关联函数web_reg_save_param("参数名称","左边界","右边界","查询区域",LAST);或单击鼠标右键单击【insert】>【net step...】>在add step界面,step type中选择services>web_reg_save_param,单击【ok】键,弹出如下图所示:
对于引号需要使用【\】作转义,例如上面的左边界可以写成name\"lt\" value=\" ,右边界可以写成\" 。
回放脚本时,会在Replay Log日志中可以显示关联参数的相应值,此值是动态变化的,每一次执行后,显示的值都不一样。如下图所示:
参数说明:
int web_reg_save_param (const char *mpszParamName, <List of Attributes>, LAST);
ParamName:存放动态数据的参数名称。
list of Attributes:其他属性,包含 “Notfound”、“LB”、“RB”、“RelFrameID”、“Search”、“ORD”、“SaveOffset”、“Convert”以及“SaveLen”。
下面将详细说明每个属性值的意义:
1、Notfound:指定当找不到要找的动态数据时该怎么处理。
当指定Notfound=error时,表示着找不到动态数据时,就发出一个错误消息。此为该属性的默认值。
当指定Notfound=warning时,表示当找不到动态数据时,不发出错误消息,只发出警告,脚本也会继续执行下去不会中断。在对脚本出错时,可以如此设置。
2、LB:动态数据的左边界字符串。此属性是必须要有的,而且区分大小写。
3、RB:动态数据的右边界字符串。此属性是必须要有的,而且区分大小写。
4、RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性可以是All或是数字,而且可有可无。
5、Search:搜寻的范围,其值可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值),此属性可有可无。
6、ORD:指明从第几次出现的左边界开始才是要撷取的数据,默认值是1。假如该属性值为All,则所有找到符合的数据会存储在数组中。此属性可有可无。
7、SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始存储到参数中。此属性值不可为负数,其默认值为0。
8、Convert:转换数据格式。当指定该属性值为HTML_TO_URL时,意味着将HTML-encoded数据转成URL-encoded数据格式。如果是HTML_TO_TEXT,表示将HTML-encoded数据转成纯文字数据格式。
9、SaveLen:当找到匹配项后,偏移量之后的几个字元存储到参数中。此参数可有可无,默认值是-1,表示一直到结尾的整个字符串都存入参数中。
转义字符总结
在做手动关联时,取边界值的时候,会经常用到转义字符,现将转义字符整理如下:
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\\ 反斜杠
\? 问号字符
\' 单引号字符
\" 双引号字符
\0 空字符
如何做LR自动关联和手动关联?的更多相关文章
- LoadRunner脚本参数化之自动关联和手动关联
一.关联的意义 1.关联的含义 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的 ...
- Loadrunner脚本自动关联和手动关联
关于Loadrunner关联一.什么时候需要关联 1.关联的含义 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服 ...
- LoadRunner 自动关联、手动关联的帖子
https://www.guru99.com/correlation-in-loadrunner-ultimate-guide.html 这个网页里介绍了关联的概念,自动关联和手动关联的知识...
- 软件测试_Loadrunner_性能测试_脚本优化_关联_手动关联
在写文章之前写一下自己的心路历程,录制脚本主要是上传图片并返回查询结果的过程.录制完脚本后发现函数中URl地址中有图片ID后台随机生成的32位随机数,并且每次上传图片id都会变化.我就上网搜索了一些解 ...
- LoadRunner-关联(自动关联和手动关联)
使用LR录制脚本,新建课程:每次新建课程都会产生一个新的courseid和partid,直接使用录制的脚本执行是不行的.所以用到了关联. 注:关联分手动和自动关联,自动关联搜索出一些不必要关联的数据, ...
- Loadrunner--自动关联和手动关联
2017-06-09 15:32:45个人也属于刚刚开始学习,有什么不对的地方敬请指导:qq:389791447 一开始的时候,准备去学习怎么去关联.一时也毛不着头脑,就在网上找了一些视频看,有的人说 ...
- LR手动关联参数化问题总结
所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成截取自服务器所送的.动态的.每次都不一样的数据. 一般情况下,比较聪明的服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一 ...
- 使用loadrunner 12 手动关联
关联的含义: 如浏览器打发送一个网页A请求,服务器返回这个请求,并且在返回的内容中携带一个session id=key,当浏览器再送出网页B的请求时,这时就要用ID=key的数据,服务器才会认为这是合 ...
- LR手动关联新手总结
最近学习LoadRunner的时候深刻体会:新手入门真心不容易啊 今天一直在纠结LoadRunner的手动关联问题,之前刚开始看书的时候就看到了,不过当时想先放放,后面来细细研究, 今天看的时候在网上 ...
随机推荐
- 【Java】字符串转json
import org.json.JSONObject; JSONObject jo = new JSONObject(new String(需要转换的字符串));
- gym 101810 M. Greedy Pirate (LCA)
题目:https://codeforc.es/gym/101810/problem/M 题意:给 你一颗树,下面有m次查询,求u->v的最大值是多少,输入两点之间都会有两条边,正边有正权,反边有 ...
- mybatis批量生成
使用了mybatis-generator后,寻找只写一个table标签就可以全部生成的方法 下载mybatis-generator-core-1.3.2-bundle.zip 解压后打开docs 发现 ...
- php 封装原生数据导出的方法(csv文件格式)和csv文件中长数字自动变成科学计数法的处理
如何解决上图长数字自动转换处理? CSV文件中长数字自动变成科学计数法处理.用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学计数法的表现形式. ...
- Nuget-Swagger-Swashbuckle:Swashbuckle
ylbtech-Nuget-Swagger-Swashbuckle:Swashbuckle 1.返回顶部 1. Seamlessly adds a Swagger to WebApi projects ...
- laravel artisan工具的使用
Artisan是laravel中自带的命令行工具的名称(一个php文件,放在laravel框架的根目录,因此命令的使用都是在根目录下的). 它提供了一些对应用开发帮助的命令,可以使用list命令列出所 ...
- Maven初了解
这周开始,我正式上手了接口测试.我们接口测试使用的是Maven做项目管理,用Junit做测试框架.所以我稍微了解了一下Maven. 那么什么是Maven呢? Maven是基于项目对象模型(POM pr ...
- git使用记录六:对commit的message做处理
修改最新commit的message git commit --amend 修改老旧commit的message 查询最新的三个log soaeon@DESKTOP-FUJJTHR MINGW64 / ...
- FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...
- python面试题之有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
pycheck pylint 本文首发于python黑洞网,博客园同步更新