(十九)关联(correlation)

注意:在录制脚本时,一定要在需要检查的位置设检查点,否则结果不会报错,一些问题反映不出来。
录制脚本:lr自带的tours系统,录制登录(选择administration 中复选框第3项)
第3项是模拟实际企业中会遇到的一些被测系统类型,是属于存在关联的一种脚本。并不是每个被测系统都有第3项的选择。这只是hp公司模拟出来的不同系统类型。
一、为什么需要关联
这里写图片描述
注意:这个ID是Client与Web之间建立的,与客户端请求什么网页无关。
在Web系统架构中,浏览器向Web服务器发送第一个请求后,在服务器的回应包中,就有一个”小票”,不过在这里不叫”小票”,而是叫做Session ID。以后浏览器再向服务器发送请求,都会在请求包中夹带这个Session ID,Web服务器接下来就会利用这个Session ID来辨识跟它要数据的是不是同一个浏览器。对于每个新的客户端,服务器就会产生新的Session ID给浏览器。如果Vugen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或者它根本不认识这个Session ID,当然就不会传送正确的网页给Vugen了。
二、关联

  • 把脚本中某些写死的数据,转换为服务器所发送、动态的、每次都不一样的数据
  • 何时需要关联?:正常录制,但是回放不成功,考虑是否关联(所以关联建立时间是录制结束出现错误时)
  • 解决方法:ID是服务器给的,所以每次从服务器获取ID后,就修改客户端的ID。

三、具体解决方法
在脚本中,记录的是客户端到服务器的请求信息,当然这里包含服务器给的Session ID。
分析:因为在Vugen中,记录了这个Session ID,若录制2次相同的脚本,因为是不同的客户端,所以服务器会给两个ID号,只要看这两个脚本哪里不一样,就可以知道哪个是Session ID了。
手动关联步骤:

  • 录制脚本,回放有错误。确定由于动态数据造成的。
  • 再录制一份流程相同的脚本
  • 使用Wdiff工具进行比较:在Tools—>Compare with script—>选择要对比的脚本【一般情况下,think time、检查点、坐标位置、大段的请求不同时,都不是服务器返回的动态ID,如果遇到大段的请求不同,建议重新录制。动态ID一般都是一串无规律(偶尔是规律的)的字符串】但是,这个数据是从客户端看到的,还不是源头服务器
  • 使用web_reg_save_param()函数,在源文件中找到需要关联的字符串(动态数据),存入一个参数中。
    从服务器端通过左右边界提取该动态ID
    1)从脚本中拷贝动态ID的适当长度(太长,可能遇到回车;太短,太多匹配),从Generation log【记录请求和应答包位置】中找到该动态ID所存在的服务器端的应答包。注意:从第一行开始找(点击第一行一下)Ctril+F是搜索快捷键
    2)拷贝当前找到的动态ID(包含其左右边界)
    3)向上翻,确认当前包是应答包即可
    如何找到相应请求?
    ①先记住上步所在应答包的id号
    ②先向下翻,找到和该应答包的ID号同号的请求(一般就在附近)
    ③如果没有找到,则回到原位,向上翻找,找到最近的一条有效请求(如请求照片就不是有效请求),此时可以不看ID号。该请求就是相应的请求
    ④找到相应请求后,到脚本中快速定位(窍门:看快照号,快照号相同则请求相同)
    ⑤将关联函数写在相应请求之前
//请求前写关联函数,这些参数因为是LR函数,所以不用提前定义
//name=userSession value=124202.045038477zDiiztcpzQVzzzzHDiDDVpifzVf>
    web_reg_save_param("uid",
                       "LB=name=userSession value=",
                       "RB=>",
                       LAST);
  • 把录制时的数据替换成该参数(动态数据)
    "Name=userSession", "Value=124202.328068044zDiizfHpcfDiDDVpQtDf", ENDITEM, 
    ---->替换成↓。因为uid是参数,所以要用"{}"
    "Name=userSession", "Value={uid}", ENDITEM, 

简洁的操作步骤:

  • 从服务器返回的数据中选取需要进行关联的数据
  • 将此数据存入脚本的一个参数中
  • 将脚本中需要使用该数据的地方用该参数来代替。

找相应请求的另一种方法?—业务逻辑

重要结论:
①相应请求是不是包含动态ID的请求本身?(相应请求就是引起服务器端发送动态ID的那条请求)
不是。因为引起服务器端发送动态ID的那条请求还没有动态ID。
②相应请求一定是在包含动态ID的那条请求之前
所以,对于简单的脚本,通过脚本推断,也可以找出

关联练习二:买票(此时将第三项取消)
出发城市和到达城市不同,航班不同,航班信息是从服务器端来的,适合做关联。(再次理解:把脚本写死的数据,转变为服务器所发送的、动态的、每次都不一样的数据)
这里写图片描述

四、脚本两种录制模式
1、基于HTML方式录制的脚本比较简洁,篇幅较短;
基于HTML方式录制的脚本代码较多,原因及特性如下:

  • lr的厂商建议用户使用基于HTML方式,由于比较简洁,而且能够实现同样的功能,甚至能够避免关联。
  • 基于HTML方式的原理:当打开脚本进行录制时,lr会将当前页面的信息保存到lr的缓存中,如登录首页面打开时,缓存中会记录用户名(为空)、密码(为空)、以及usersession(唯一值)。当用户继续录制时,提交登录信息,点击确定时,lr会按照用户提交的信息和当前页面中缓存的信息进行比较,有区别的记录到脚本中,则有区别的是:用户名(原来为空,现在是jojo)、密码、点击坐标x,y值等,而usersession没有变化,不记录。所以形成的脚本,内容少。
  • 基于URL方式,则默认缓存为空,则lr会将页面中所有信息全部记录下来,脚本自然比较复杂。而且将原来基于HTML中一个页面一个请求形式,分散成多个请求,即将页面中每个元素(如页面中图片、视频、音频、动画等都称为页面元素)都形成一个web_URL。
  • 总结:遇到一个被测系统,先用基于HTML方式录制,如果不成功,则选用URL方式,即可成功。如果看到HTTPS的系统,则直接使用URL方式https://blog.csdn.net/

2.有时使用基于html方式+单协议如果录制脚本有问题,则建议使用其他方式录制,如基于URL方式+多协议,往往能够录制成功。
3.用到关联名称的可能不止一处,若找不全,就会出现错误。

web_reg_save_param()用法
这里写图片描述
1)若ORD=all时,则参数变成一个数组(比如fid则为一个数组)

Action.c(28): Notify: Saving Parameter "zi_1 = 240;108;08/04/2018 checked ".
Action.c(28): Notify: Saving Parameter "zi_2 = 241;97;08/04/2018".
Action.c(28): Notify: Saving Parameter "zi_3 = 242;102;08/04/2018".
Action.c(28): Notify: Saving Parameter "zi_4 = 243;89;08/04/2018".

2)若ORD为一个数字时,则参数不是数组(因为执行了次数)
就是具体的哪个字符串
比如在单选按钮中有多个选择,


//选按钮组中第一项
web_reg_save_param("zi",//注意底下有两处
                       "LB=name=outboundFlight value=",
                       "RB= checked",
                       LAST);          

有两种方式取单选按钮中任意元素

//法一
//获取所有的元素,在用时使用_
web_reg_save_param("zi",
                       "LB=name=outboundFlight value=",
                       "RB=>",
                       "ORD"=all
                       LAST);     
在用这个数组中某个项时,可以用zi_1 、zi_2、zi_count 
"Name=outboundFlight", "Value={zi_3}", ENDITEM,  
//法二:ORD指定是要取第几个
web_reg_save_param("zi",//注意底下有两处
                       "LB=name=outboundFlight value=",
                       "RB=>",
                      "ORD=3",
                       LAST);
  "Name=outboundFlight", "Value={zi}", ENDITEM,                   

边界中含”引号”

在C语言中,如果”“之内遇到”,则需要进行转义。形如:\”,表示该引号是个普通的字符串

//在Generation Log中找到要关联的字段及左右边界
outFlight value="Blue Skies Airlines$190$706$5:03 pm$">
变化的是Blue Skies Airlines$190$706$5:03 pm$,并不包含引号,所以引号要作为边界出现,所以要转义↓
outFlight value=/"Blue Skies Airlines$190$706$5:03 pm$/">
//在脚本中添加关联,则
web_reg_save_param("zi",
                       "LB=outFlight value=/"",
                       "RB= /">",
                       LAST);

猜你喜欢

转载自blog.csdn.net/jiangshangchunjiezi/article/details/81386041
今日推荐