文章目录
-
-
- 为什么要进行关联?
- 什么时候应该做关联?
- 怎么去做关联呢?
-
- 1.手工关联
-
- 1.1 使用LR自带的WinDiff工具协助找出需要关联的数据:
- 1.2 确认插入关联的位置
- 1.3 web_reg_save_param 函数的书写方式
- 1.4 将web_reg_save_param 函数插入
- 1.5 将脚本中有用到关联的数据,用参数代替
- 1.6 验证是否关联成功啦?
- 2.自动关联
-
- 2.1 回放脚本
- 2.2 找到关联值
-
- 2.3 进行关联
-
为什么要进行关联?
在录制生成的脚本中,录制到了一些服务器分配的数据,但是再回访的过程中,服务器又重新分配了新的数据,导致这些录制时生成的数据已经无法使用,需要使用服务器分配的最新数据。
关联可以在脚本中捕获到服务器分配的数据,存储到参数中,需要使用时从参数中取出,从而保证使用的是服务器最新分配的数据。
其实关联也属于一同特殊的参数化,只是与一般的参数化有些不同。一般的参数化的参数来源于一个文件、一个定义的table、通过sql写的一个结果集等,但关联所获得的参数是服务器响应请求所返回的一个符合条件的、动态的值。
什么时候应该做关联?
这里我用一个登录来举一个例子:
客户端向服务器发送一个登录的请求,然后服务器接受了并且给这个请求分配一个唯一的Session ID。
当用户输入用户名密码,请求登录时,该Session ID同时被发送到服务器端,但是这个ID只在当前会话中有效,当我刷新界面或者是换个账号登录,这个ID就失效啦,服务器就会给我发个新的Session ID。
但是我们录制脚本的时候录制的是第一个Session ID,那么我回放脚本的时候使用的录制时ID就不能用了,就会登录失败。。。
为了解决这个很重要的问题,我们就要使用关联功能!
怎么去做关联呢?
1.手工关联
使用手工关联我们需要找出有哪些数据是动态变化的,有时候一个脚本看不出来,我们可以录制两边找出其不同处,看这些数据是否需要关联。
1.1 使用LR自带的WinDiff工具协助找出需要关联的数据:
- 在第二份脚本中,点选VuGen的【Tools】>【Compare with Vuser…】,并选择第一份录制的脚本。
- 接着WinDiff会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options】>【View】>【Show Inline Differences】)。
找到不同的部分后,复制,然后打开Recording Log或是Generation Log,按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
1.2 确认插入关联的位置
我们在日志中找到了两次脚本的不同点的位置,根据这个位置,我们再确定是在哪个请求之后产生的,也就是说要定位发生不同点的response是由哪个request产生的,找到了这个请求的函数位置,我们就知道要往哪里做关联了。
一般情况下关联函数写到发出请求的函数之前就可以了。
1.3 web_reg_save_param 函数的书写方式
语法:
int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
详情请参考LR帮助文档。在这个函数中,*ParamName
是用来存放得到的动态内容的参数名称。
<list of Attributes>
:其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen
。属性值不分大小写。这其中比较常见的是:
LB
( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。RB
( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。Search
: 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。SaveOffSet
:偏移量,指从左侧偏移几个位置后开始存储该数据。SaveLen
:存储长度,指从左侧开始,存储长度为多少的数据。ORD
:假如通过LB,RB取到了多个数据,通过此参数可以定位到底是要哪一个数据,默认为第一个。
这里举个LR自带的飞机订票网站中SessionID web_reg_save_param 函数的例子:
首先我们右键检查看订票网站的源代码,找到SessionID数据所在位置:
知道了SessionID的上下文环境之后就能够在web_reg_save_param函数中加入其他属性啦,函数如下:
web_reg_save_param("paramSessionID","LB=userSession value=","RB=>",LAST);
这句话的意思就是:我要把代码“userSession value=”
和“>”
之间的代码,就是“124335.386634265zDQffAVptfDiDHDpAAiH
”这一段保存在变量“paramSessionID
”中,以后每一次调用次变量就相当于调用这之间的动态SessionID了。
也可以使用使用web_reg_save_param进行关联:
Insert .> New Step…,找到web_reg_save_param函数
填写参数名左右边界等信息
点击“OK”生成函数,如下图:
1.4 将web_reg_save_param 函数插入
该函数的作用是是捕获服务器所返回的一个数据并且存储到变量中,但是web_reg韩束比较特殊,必须要在请求前就定义该函数,然后才能使用。所以在之前的飞机订票例子中,我们就应该将该函数放在最前面。因为进入网站后我们就已经开始请求一个Session ID了,所以该函数要在请求前即进入网站时就定义。
1.5 将脚本中有用到关联的数据,用参数代替
我们定义了这个函数,和变量,但是还没有使用的,所以我们要在脚本中有用到此关联的数据的地方用参数代替。
1.6 验证是否关联成功啦?
我们回放一下脚本,在下面的Replay Log中查看是否有这样的语句:
这就说明已经关联成功了!
2.自动关联
2.1 回放脚本
回放脚本:回放之前要打开Tools->recording Options 窗口,点击correlation标签页,确保Enable correlation during recording 选项处于勾选状态,如下图
回放日志如下,出现了异常:Requested image not found
2.2 找到关联值
这时候我们可以通过扫描脚本查找关联值,如下图点击“Scan script for Correlations”,也可以用快捷键ctrl+F8
这里标黄的部分就是sessionid了,然后我们对这个sessionId做关联。
2.3 进行关联
选中这一大串sessionID,然后右键点击“Create Correlation”
然后回到脚本中可以看到已经生成了一块函数web_reg_save_param_ex,被保存的参数名为“CorrelationParameter_1”
最后,打开登录函数块,我们就可以看到sessionid就已经参数化了,如下图。
如果本篇博客对你来说有用的话,请点个赞吧ヾ(?°?°?)??
最后总结一下:
如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:593462778,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
作者:暗潮汹涌
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。