loadrunner关联技术的一个示例
前言
因为loadruner脚本只是忠实记录了所有客户端发送服务器端的数据,并在脚本回放时按照录制的顺序将录制下来的数据重新发送出去,这种方式属于静态的脚本。在一些情况下,脚本需要动态的,如一些系统会采用sessionID/SeqID等方式来标识不同的任务(如:需要从服务器端获得一些数据,当作一个参数来构造下一次的请求),这就要求脚本上需要做相应的处理,来满足实际业务运行情况,这就是loadruner的关联技术。
虽然loadrunner提供的自动关联,但是往往给你关联错了,会出现参数个数少或者错的情况,没有办法,手动呗。
关联基本步骤
步骤主要有:
1,从服务端返回的数据中选取需要进行关联的数据。
2,将该数据存入脚本的一个参数中。
3,验证关联正确性(通过回放方式)。
简单一句话:关联就是一种特殊的参数化
//参见帮助
- Determine the value to capture
- Find the right and left text boundaries of the value to capture
- Find which occurrence of the text boundaries should be used
- Add a web_reg_save_param function to the script, above the step which requests the page with the value to capture
- Add the parameter name, left boundary, right boundary, an occurrence to the function
- Parameterize the dynamic value in the script every time it occurs
- 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对服务器进行加压。