5.3 脚本优化之关联
5.3.1 请出示通行证
注册的脚本总算是顺利完成了,下面我们尝试用5.2.2章节注册的用户录制一个名为“Login”的脚本。
为了方便大家理解关联,本次在录制选项窗口中,Configuration不勾选“关联扫描”的相关复选框,如图5-48所示。
图5-48 自动关联选项
设置完成后使用用户名“X001”、密码“001”进行Login脚本的录制,得到如下脚本。
Action() { // 打开Web Tours首页 web_url("index.htm", "URL=http://127.0.0.1:1080/WebTours/index.htm", "TargetFrame=", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTML", EXTRARES, //IE11向服务器发起的响应请求,从用户模拟的角度不建议删除 "Url=http://www.bing.com/favicon.ico", "Referer=", ENDITEM, LAST); lr_think_time(6); //输入用户名、密码登录 web_submit_data("login.pl", "Action=http://127.0.0.1:1080/cgi-bin/login.pl", "Method=POST", "TargetFrame=body", "RecContentType=text/html", "Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home", "Snapshot=t2.inf", "Mode=HTML", ITEMDATA, "Name=userSession","Value=119474.853786958zVtftiHpHQVzzzzHDziHcpQczHf", ENDITEM, "Name=username", "Value=X001", ENDITEM, "Name=password", "Value=001", ENDITEM, "Name=JSFormSubmit", "Value=off", ENDITEM, "Name=login.x", "Value=43", ENDITEM, "Name=login.y", "Value=13", ENDITEM, LAST); return 0; } |
【特别说明】:使用IE11录制脚本时会增加诸多脚本外的操作,例如www.bing.com的访问、sockets协议SSL等,在脚本录制过程中我们需要甄别并排除与本次录制无关的其他操作。建议在Recording Options中新增“New Entry”IP及端口,如图5-49所示。
图5-49 New Entry映射
并在映射服务器的“Options”中将“录制时自动SSL检测”以及“录制时自动套接字检测”关闭。如图5-50所示。
图5-50 关闭SSL检测
脚本录制还算顺利,Lucy尝试回放脚本,以检验录制成果,回放后很快发现脚本中web_submit_data函数报错,如图5-51所示。
图5-51 Login回放报错
通过提示信息,进一步分析会发现似乎和user session有关,但问题出在哪里呢?Lucy通过查找资料,终于找到了问题所在,下面是关于失败原因的分析。
当客户端向服务器发起登录的请求时,服务器会进行验证。验证通过后会返回一个固定的Session ID,该Session ID对本次会话期间的所有访问生效,后续客户端的请求只要带上这个Session ID就被认为是合法的请求。如图5-52所示。
图5-52 录制脚本的Session ID
一旦会话结束,客户端再次向服务器发起登录请求,服务器将重新判断是否是合法用户,如果是合法用户,则会分配一个新的Session ID给到当前客户端,这是HTTP协议特征(不保存状态的协议)决定的。
而使用VuGen录制的脚本,回放时依然使用录制时捕获的Session ID,服务器在收到这样的ID后自然会拒绝客户端的请求。如图5-53所示。
图5-53 回放脚本的Session ID
这就好比是某大型峰会,第一天的参会嘉宾统一发放黄色的通行证,第二天发放蓝色的通行证。而你在第二天还拿着黄色的通行证来参加会议,实在是太过醒目,被拒绝也就不足为奇了。所以出现此类情况就必须重新捕获一次服务器的Session ID,并发送最新的ID请求才能成功登录系统。
重新捕获动态数据的行为称之为关联。不难看出,需要被关联的字段一定是动态数据,且是服务器发出的。既然叫关联也说明后续客户端会用到该数据向服务器返回请求。
关联具有3个主要特征,对数据特征理解到位,找出脚本中需要关联的字段就会变得比较容易。
特征一:该数据一定是从服务器返回的值。
特征二:该数据一定是后面的请求中要被调用的。
特征三:该数据必须是动态变化的。
关联分为手动关联和自动关联,下面将介绍两种关联的基本操作办法。
(1)手动关联
手动关联是脚本优化中最为常用的技术之一,首先确定要捕获的数据,然后确定数据来源,添加web_reg_save_param组函数,最后回放脚本检验正确性。
【特别说明】:手动关联是我们最常用的关联方式,操作案例详见5.3.2节“关联操作 演练”。
(2)自动关联
在录制选项中选择Correlations→Configuration, 如图5-54所示。脚本录制期间会自动扫描需要关联的字段,并在脚本停止录制后弹出设计工作室对话框确认关联参数。
图5-54 Correlations->Configuration窗体
Scan for correlations applying扫描关联规则有如下4种。
(1)“Rules Scan”,规则扫描:表示从Correlations->Rules设定的规则中查找脚本有无可关联的对象,规则可以人为拟定。
(2)“Automatically correlate values found”,自动关联找到的值:通过录制和回放脚本的数据匹配,判断出需要关联的属性。
(3)“Record Scan”,录制扫描:通过web_reg_save_param组函数进行配置,可手动设置扫描级别。
(4)“Replay Scan”,回放扫描:通过web_reg_save_param组函数进行配置,可手动设置扫描方式(HTML comparison/Text comparison)。
学习笔记
笔记一:每次回放提示成功,不代表脚本真的成功,在5.1.3节中已详细介绍,关键是确定每个回放步骤是否正确无误。
笔记二:关联是录制脚本需要解决的主要难题,脚本录制如果无法回放成功,有可能是脚本没有录制完成就提前结束,也可能是服务器故障;如果都不是,那么就要考虑脚本中存在动态数据的情况。
笔记三:关联操作比较繁琐,操作时需细心谨慎,但不是所有的脚本都需要使用关联,脚本的调整还需依据实际情况,具体问题具体分析。
5.3.2 关联操作演练1
下面我们对Web Tours 的Login脚本进行手动关联。
步骤1:根据图5-51 Login回放报错的提示,我们初步猜测可能是user session value出了问题,在脚本中找到如下代码段,如图5-55所示。
图5-55 找到需要关联的值
【特别说明】:一般需要关联的字段并非是纯数字或有意义的字母组合,而是不太能理解的随机数,找关联字段的时候要特别注意。
找到该值后我们只是推测,还需要进一步确定,在Output→Code generation窗体下查找该值,并确保第一次出现的位置是在Response请求中。如图5-56所示。
图5-56 在Code generation中查找
找到该值第一次出现的位置后,往上检查出现的位置,如果在Response中出现,且继续查找有出现在Request中的情况,那么可以肯定这就是我们要关联的对象。
步骤2:确定关联对象后请记住在Code generation中第一次出现位置的左右边界,然后调用web_reg_save_param函数实现关联中变量的替换。
在web_url函数的前面单击鼠标右键Insert->New Step,在Steps Toolbox中输入web_reg_save_param,找到后双击弹出Save Data to a Parameter,如图5-57所示。
图5-57 插入web_reg_save_param函数
单击确定按钮后,生成如下脚本,在下次运行脚本的时候系统会自动取出左右边界的值赋予名为userSession的参数,脚本如下所示。
web_reg_save_param("userSession", "LB="userSession" value="", "RB="/>", LAST); |
【特别说明】:因左右边界的数据中出现了"(双引号),必须使用转义字符“\”才能生效,所以需要对上述脚本进行微调,最终结果如下。
web_reg_save_param("userSession", "LB=\"userSession\" value=\"", "RB=\"/>", LAST); |
步骤3:下面我们将原本的userSession value改成“{userSession}”的参数形态,这样系统每运行一次都会重新捕获数据给到userSession,变量值的替换也就实现了。
//"Name=userSession", "Value=119474.940704739zVtftQcpczcfDziHcpQfDfHf", ENDITEM,
"Name=userSession", "Value={userSession}", ENDITEM,
步骤4:再次运行脚本,在Snapshot -> Replay(Page View)中查看web_submit_data函数的测试结果为Welocme,X001…,如图5-58所示。
【特别说明】关联的脚本函数除了web_reg_save_param,还包括如下4个。
(1)web_reg_save_param_regexp 正则表达式关联。
(2)web_reg_save_param_ex扩展关联。
(3)web_reg_save_param_json JS关联。
(4)web_reg_save_param_xpath 路径关联。
图5-58 关联后回放脚本结果
最常用的主要是web_reg_save_param和web_reg_save_param_regexp,下面补充介绍一下正则表达式的用法。
web_reg_save_param_regexp函数一般针对取值边界长度是动态变化的情况,如果我们假设userSession value的边界长度是不固定的,那我们就可以使用该函数进行关联。脚本如图5-59所示。
图5-59 正则表达式关联
关联返回的内容在正则表达式中需要用圆括号标记,并将圆括号的内容保存到名为“userSession”的参数中,执行脚本,最终结果同web_reg_save_param函数。生成的脚本如下所示。
web_reg_save_param_regexp( "ParamName=userSession", "RegExp=name=\"userSession\" value=\"(.*?)\"/>", SEARCH_FILTERS, LAST); |
【补充说明】:如果脚本过于复杂实在无法确定需要关联的字段是哪一个,可以重新录制一次脚本,对两次录制的脚本进行对比,这样也能发现动态数据。操作办法如下,在解决方案资源管理器(Solution Explorer)中单击鼠标右键,选择要对比的文件(Compare to External File),如图5-60所示。
图5-60 关联后回放脚本结果
系统会自动对两个文件进行对比,并告知不同之处,这样找到需要关联的字段就非常容易了,如图5-61所示。
图5-61 脚本对比窗口
本文选自《性能测试学习笔记之 LoadRunner实战》第五章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。