一、什么是关联,为什么要进行关联?

loadrunner当执行脚本时,VuGen伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。

所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。

举一个常见的例子,服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为Session ID。对于每个新的交易,服务器都会产生新的Session ID给浏览器。这也就是为什么执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或是它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了

怎么设置关联

loadrunner设置关联通常有两种方式,分别为自动关联和手动关联。

a)自动关联

自动关联,需要在录制选项Recording Options里将Enable correlation during recording(启用录制时关联)给勾上。

 Loadrunner关联_IT

由于自动关联在实例使用时候往往出现各种问题,所以就不做过多介绍,知道即可。

b)手动关联

手动关联使用的函数有好几个,这里介绍一个常用的:web_reg_save_param_ex 

语法:
int web_reg_save_param_ex( const char *ParamName, [const char *LB, ][const char *RB,] <List of Attributes>, <SEARCH FILTERS>,LAST ); 
参数说明:
Loadrunner关联_IT_02
用法:
  将光标定位在脚本的产生都动态数据的请求之前(例如:登录请求的响应数据中有session值,则在登录请求前添加关联函数),右击>Insert>New step...,在弹出的窗口中展开选择“Web_reg_save_param_ex”,然后点击ok。
Loadrunner关联_IT_03

  在VGun里面选择insert->New Step->Services->web_reg_save_param_ex,然后会出现以下的界面,分别填写左右边界和参数名字等关键参数,就能够将关联做好而不需要手动写函数了。

 Loadrunner关联_IT_04

    //提取JSESSIONID
    web_reg_save_param_ex(
        "ParamName=JSESSIONID",
        "LB=Set-Cookie: JSESSIONID=",
        "RB=;",
        SEARCH_FILTERS,
        "Scope=HEADERS",
        LAST);

提取出来之后需要添加到cookie中即可,注意在loadrunner中一定要指定DOMAIN的值

    //输出提取出来的JSESSIONID ,也可以使用但是不明显 lr_output_message(lr_eval_string("{JSESSIONID}"));
    //lr_error_message(lr_eval_string("JSESSIONID={JSESSIONID}")); 

    //添加JSESSIONID到cookie中,注意一定要添加DOMAIN指定cookie作用域的范围,默认应该写服务器IP
    web_add_cookie("JSESSIONID={JSESSIONID}; DOMAIN=172.16.6.66");

完整脚本如下

Action()
{
    web_url("登录页面", 
        "URL=http://172.16.6.66:8080/WoniuBoss4.0/login/logout", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://172.16.6.66:8080/WoniuBoss4.0/employee", 
        "Snapshot=t30.inf", 
        "Mode=HTML", 
        EXTRARES, 
        "Url=checkCode?t=1605253738429", ENDITEM, 
        "Url=../static/img/xkbg.png", ENDITEM, 
        "Url=/favicon.ico", "Referer=", ENDITEM, 
        LAST);

    lr_think_time(15);

    //提取JSESSIONID
    web_reg_save_param_ex(
        "ParamName=JSESSIONID",
        "LB=Set-Cookie: JSESSIONID=",
        "RB=;",
        SEARCH_FILTERS,
        "Scope=HEADERS",
        LAST);    
    
    web_submit_data("用户登录", 
        "Action=http://172.16.6.66:8080/WoniuBoss4.0/login/userLogin", 
        "Method=POST", 
        "RecContentType=text/plain", 
        "Referer=http://172.16.6.66:8080/WoniuBoss4.0/login/logout", 
        "Snapshot=t31.inf", 
        "Mode=HTML", 
        ITEMDATA, 
        "Name=userName", "Value=WNCD000", ENDITEM, 
        "Name=userPass", "Value=woniu123", ENDITEM, 
        "Name=checkcode", "Value=0000", ENDITEM, 
        "Name=remember", "Value=Y", ENDITEM, 
        LAST);

    //输出提取出来的JSESSIONID ,也可以使用但是不明显 lr_output_message(lr_eval_string("{JSESSIONID}"));
    //lr_error_message(lr_eval_string("JSESSIONID={JSESSIONID}")); 

    //添加JSESSIONID到cookie中,注意一定要添加DOMAIN指定cookie作用域的范围,默认应该写服务器IP
    web_add_cookie("JSESSIONID={JSESSIONID}; DOMAIN=172.16.6.66");

    
    web_url("登录后首页", 
        "URL=http://172.16.6.66:8080/WoniuBoss4.0/main", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://172.16.6.66:8080/WoniuBoss4.0/login/logout", 
        "Snapshot=t4.inf", 
        "Mode=HTML", 
        LAST);

    return 0;
}