脚本优化之参数化——性能测试学习笔记之 LoadRunner实战(4)

发表于:2018-1-25 14:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:杨婷 编著    来源:51Testing软件测试网原创

  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软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • y_hai_n
    2020-7-20 09:01:01

    有回复吗

  • y_hai_n
    2020-7-13 14:16:03

    重复执行了好几次,都只是第一个用户**成功,其他的不行,不知哪里出错了

  • y_hai_n
    2020-7-13 14:14:21

    我按上述操作后,不能完成批量**,什么原因

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号