loadrunner关联详解


 

前言

因为loadruner脚本只是忠实记录了所有客户端发送服务器端的数据,并在脚本回放时按照录制的顺序将录制下来的数据重新发送出去,这种方式属于静态的脚本。在一些情况下,脚本需要动态的,如一些系统会采用sessionID/SeqID等方式来标识不同的任务(如:需要从服务器端获得一些数据,当作一个参数来构造下一次的请求),这就要求脚本上需要做相应的处理,来满足实际业务运行情况,这就是loadruner的关联技术。

虽然loadrunner提供的自动关联,但是往往给你关联错了,会出现参数个数少或者错的情况,没有办法,手动呗。

 

 关联基本步骤

步骤主要有:

 

1,从服务端返回的数据中选取需要进行关联的数据。

2,将该数据存入脚本的一个参数中。

3,验证关联正确性(通过回放方式)。

简单一句话:关联就是一种特殊的参数化

 

//参见帮助

  1. Determine the value to capture
  2. Find the right and left text boundaries of the value to capture
  3. Find which occurrence of the text boundaries should be used
  4. Add a web_reg_save_param function to the script, above the step which requests the page with the value to capture
  5. Add the parameter name, left boundary, right boundary, an occurrence to the function
  6. Parameterize the dynamic value in the script every time it occurs
  7. Verify correct execution

 

演示实例

这里采用oracle10G管理控制台的SessionID来进行关联操作,每次登陆oracle管理控制台时,都会产生一个sessionID来标识用户登录身份,所以这里需要采用关联操作。

 

 

步骤1:录制脚本,找关联的值

这是不多说了,这里以html模式为例,录入完后结果如下所示。

vuser_init()部分

{

       web_url("em",

              "URL=http://192.9.100.182:1158/em/",

              "Resource=0",

              "RecContentType=text/html",

              "Referer=",

              "Snapshot=t1.inf",

              "Mode=HTML",

              LAST);

              }

 

Action()部分

{

       lr_start_transaction("登录");

       web_submit_data("logon",

              "Action=http://192.9.100.182:1158/em/console/logon/logon",

              "Method=POST",

              "RecContentType=text/html",

              "Referer=http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b6486f8e3dd57e5474e78a8d48925ba0ed5d1",

              "Snapshot=t2.inf",

              "Mode=HTML",

              ITEMDATA,

              "Name=userName", "Value=sys", ENDITEM,

              "Name=userPassword", "Value=sys", ENDITEM,

              "Name=userRole", "Value=sysdba", ENDITEM,

              "Name=svgVersion", "Value=UNKNOWN", ENDITEM,

              "Name=browserTimezoneOffset", "Value=-480", ENDITEM,

              EXTRARES,

              "URL=/em/cabo/images/cache/c-ghsc.gif", "Referer=http://192.9.100.182:1158/em/console/license", ENDITEM,

              "URL=/em/cabo/images/cache/c-ghc.gif", "Referer=http://192.9.100.182:1158/em/console/license", ENDITEM,

              LAST);

……

 

这里是很清楚是sessionID需要做关联,如果下一个系统是SeqiD或者是serviceID呢,如何捕获要关联的值?

找取关联的值是比较难的地方,尤其是对初学者来说,需要对http协议有一定的了解,最傻瓜的方式当然还是有的,可以录制2份同样操作的脚本,然后对比这二份脚本的不同,如果发现2个脚本中都有不同的并且很长的值,这就要想到采用关联了。

      

步骤2:在脚本中找到关联值(sessionID)之前的http请求位置

因为sessionID不是一开始就出来的,必须发生服务器请求和服务器建立会话后才能返回SessionID,这就必须在服务器生成sessionID之前,对其进行关联,让loadruner知道在运行到sessionID这段脚本时需要动态生成出sessionID,否则一旦生成了sessionID后,再关联就没有意义了。问题就来了,怎么找出生成sessionID之前的请求呢,不要忘记我们的录制脚本日志。录制日志文件的位置一般位于:$:/Program Files/Mercury/LoadRunner/scripts/oracle_html/data/ RecordingLog.txt,打开之后,可以通过录制日志可以查询到sessionID的位置:

[Network Analyzer ( b58: c70)] ------------------------------------------------------------------------------------------

[Network Analyzer ( b58: fa0)] Address lookup for admin0a4334fg = 192.9.100.173

[Network Analyzer ( b58: c70)] Address lookup for admin0a4334fg = 192.9.100.173

[Network Analyzer ( b58: c70)] Request Connection: Remote Server @ 192.9.100.182:1158   (Service=)  (Sid=  1)  PROXIED!

[Web Request      ( b58: fa0)] "GET /em/"  

[Network Analyzer ( b58: fa0)]   (Sid:  1) Client -> Server : 229 bytes (Service=HTTP)

[Network Analyzer ( b58: fa0)]   (Sid:  1) Server -> Client : 401 bytes  (Service=HTTP)

[Network Analyzer ( b58: b54)] Establish Listener @ 0.0.0.0:1128

[Web Request      ( b58: fa0)] "GET /em/console/database/home"  

[Network Analyzer ( b58: fa0)]   (Sid:  1) Client -> Server : 411 bytes (Service=HTTP)

[Network Analyzer ( b58: fa0)]   (Sid:  1) Server -> Client : 266 bytes  (Service=HTTP)

[Network Analyzer ( b58: fa0)]   (Sid:  1) Server -> Client : 692 bytes  (Service=HTTP)

[Web Request      ( b58: fa0)] "GET /em/console/logon/logon;jsessionid=c00964b6486f8e3dd57e5474e78a8d48925ba0ed5d1"  

[Network Analyzer ( b58: fa0)]   (Sid:  1) Client -> Server : 528 bytes (Service=HTTP)

 

从日志中可以发现,这个sessionID在第一个http请求后就生成了,这就要求在最开始的请求前面执行关联,也就是在脚本vuser_int中就需要关联。

 

步骤3:设置关联函数

 

在脚本中录入关联函数,如下所示:

//设定关联函数 

       web_reg_save_param("sessionID",

              "LB=http://192.9.100.182:1158/em/console/logon/logon;jsessionid=",

              "RB=""",

              LAST);

这里需要对关联函数参数进行讲解一下,web_reg_save_param(关联参数名称,左边界,右边界,结束标签),

关联参数名称:可以任意定义,字符型,最好定义有意义些;

左边界:就是在脚本中执行关联值左边的脚本内容,从脚本中可以看到,下面红色的部分为左边界,

"Referer=http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b6486f8e3dd57e5474e78a8d48925ba0ed5d1"

右边界:从上面的脚本可以看到,就是一个引号

设定左右边界的目的,是让loadruner在回放到这段脚本的时候,就知道在这个位置要执行关联了;

 

步骤4:设定参数化脚本检查点

在执行完关联之后,可以在脚本将关联后的sessionID打印出来,设定检查点:

 

//用红字在回放日志中打印出sessionID

       lr_error_message("验证是否关联成功,打印出sessionID %s",lr_eval_string("{sessionID}")) ;

 

当然,打印验证需要发生在http请求之后,否则打印的结果肯定是空白的;

完整的vuser_init()部分脚本如下所示:

vuser_init()

{

  //设定关联函数 

       web_reg_save_param("sessionID",

              "LB=http://192.9.100.182:1158/em/console/logon/logon;jsessionid=",

              "RB=""",

              LAST);

 

       web_url("em",

              "URL=http://192.9.100.182:1158/em/",

              "Resource=0",

              "RecContentType=text/html",

              "Referer=",

              "Snapshot=t1.inf",

              "Mode=HTML",

              LAST);

 

//用红字打印出sessionID,这里用的是错误日志函数lr_error_message,更醒目些。

       lr_error_message("验证是否关联成功,打印出sessionID %s",lr_eval_string("{sessionID}")) ;

       return 0;

                     }

 

 

步骤5:脚本回放,看是否脚本编译通过,关联正确。

Virtual User Script started

Starting action vuser_init.

Web Turbo Replay of LoadRunner 9.0.0 for WINXP; WebReplay82 build 5727         [MsgId: MMSG-27143]

Run-Time Settings file: "C:/Program Files/Mercury/LoadRunner/scripts/oracle_html//default.cfg"         [MsgId: MMSG-27141]

vuser_init.c(14): Registering web_reg_save_param was successful    [MsgId: MMSG-26390]

vuser_init.c(20): Detected non-resource "http://192.9.100.182:1158/em/console/database/home" in "http://192.9.100.182:1158/em/"     [MsgId: MMSG-26574]

vuser_init.c(20): Redirecting "http://192.9.100.182:1158/em/console/database/home" (redirection depth is 0)  [MsgId: MMSG-26694]

vuser_init.c(20): To location "http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b64865d5e1c40d1b34ff3b27ccbc1ceb12e73       [MsgId: MMSG-26693]

vuser_init.c(20): Found resource "http://192.9.100.182:1158/em/cabo/styles/cache/blaf-A0-zh_CN-ie-6-windows.css" in HTML "http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b64865d5e1c40d1b34ff3b27ccbc1ceb12e73"         [MsgId: MMSG-26659]

vuser_init.c(20): Found resource "http://192.9.100.182:1158/em/cabo/jsLibs/MarlinCoreA4.js" in HTML "http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b64865d5e1c40d1b34ff3b27ccbc1ceb12e73"         [MsgId: MMSG-26659]

Found resource "http://192.9.100.182:1158/em/cabo/images/cache/c-skir.gif" in HTML "http://192.9.100.182:1158/em/console/logon/logon;jsessionid=c00964b64865d5e1c40d1b34ff3b27ccbc1ceb12e73"         [MsgId: MMSG-26659]

vuser_init.c(20): HTML parsing not performed for Content-Type "image/gif" ("ParseHtmlContentType" Run-Time Setting is "TEXT"). URL="http://192.9.100.182:1158/em/cabo/images/t.gif"    [MsgId: MMSG-26548]

vuser_init.c(20): web_url("em") was successful, 54612 body bytes, 5614 header bytes, 20 chunking overhead bytes         [MsgId: MMSG-26385]

vuser_init.c(31): Error: 验证是否关联成功,打印出sessionID c00964b64865d5e1c40d1b34ff3b27ccbc1ceb12e73</A></BODY></HTML>HTTP/1.1 200 OK

Date: Thu, 11 Feb 2010 02:07:32 GMT

Server: Oracle Application Server Containers for J2EE 10g (9.0.4.1.0)

 

从回放的结果来看,关联是成功的,这就保证的性能测试脚本的真实性,没有用一个固定的会话ID对服务器进行加压。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值