参数化—性能测试进阶指南 LoadRunner 11实战(第二版)

发表于:2015-1-13 11:23

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

 作者:陈霁、李锋、王臣钧    来源:51Testing软件测试网原创

(51Testing软件测试网获得作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。)
  接下来我们介绍一个十分常用的函数lr_eval_string()。该函数可以从参数中取得对应的值,并且转化成一个字符串,具体内容可以参考VuGen自带的帮助。
  该函数的格式如下:
  lr_eval_string("{参数名}");
  例如:
  lr_eval_string("{param}");
  由于取出来的就是字符串了,所以可以通过lr_output_message()函数输出到日志中。
  例如:
  lr_output_message(lr_eval_string("{param}"));
  我们可以使用这个函数对参数强行取值,从而查看参数化的取值内容。
  现在新建一个脚本实例,脚本内容如下所示:
  Action()
  {
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  参数{paramzhongwen}的内容为"甲乙丙丁戊",如图A.87所示。
  改变参数化取值的关键在于Select next row和Update value on这两个选项。
  Select next row包含以下选项。
  Sequential:顺序取值。
  Random:随机取值。
  Unique:唯一取值。
  Same line as:取某个参数的同行。
  Update value on包含以下选项。
  Each iteration:每次迭代更新。
  Each occurrence:每次取值更新。
  Once:只更新一次。
  下面我们来逐一分析它们的功能。
  A.6.3  VuGen中的参数
  1.Sequential取值
  1)Sequential+ Each iteration
  在默认的运行结果中可以看到脚本运行的结果是"paramzhongwen=甲"。在Sequential+Each iteration的组合下,第一次取值的内容是[甲]。
  在下面的结果中,使用|分隔迭代。
  设置Run Logic,将迭代的次数从1修改为2,再运行一次,这次运行的结果是[甲|乙]。
  顺序取值就是按照Parameter List中记录的先后顺序从上往下取值的过程,而Each iteration是基于Run Logic中的迭代次数完成记录变化操作的。继续设置迭代的次数为5,运行结果为[甲|乙|丙|丁|戊]。
  如果我们设置迭代的次数为6会怎么样?也就是迭代的次数超过了参数记录的数目,会取什么值呢?设置以后,再运行一次脚本,结果为[甲|乙|丙|丁|戊|甲]。可以看到顺序取值的记录是从上往下,当记录取完后,再重新从记录头开始取值。
  思考题:
  如果把脚本改为以下形式:
  Action()
  {
  int i;
  for(i=0;i<2;i++)
  {
  lr_eval_string("{paramzhongwen}");
  }
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  并且设置Run上的迭代次数为2,请问参数结果是什么?
  答案:
  [甲甲甲|乙乙乙]
  当使用Update value on+Each iteration时,只有出现了Starting iteration也就是迭代才会触发记录变化,否则取值内容均不会发生变化。
  练习题:
  现在Phpwind8.5论坛需要注册100个账户,使用VuGen脚本如何实现?
  通过录制脚本可以发现注册用户的核心内容如下所示:
web_submit_data("register.php_3",
"Action=http://localhost:8000/phpwind85/register.php?",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=http://localhost:8000/phpwind85/register.php",
"Snapshot=t17.inf",
"Mode=HTML",
ITEMDATA,
"Name=forward", "Value=", ENDITEM,
"Name=step", "Value=2", ENDITEM,
"Name=_hexie", "Value=4291dd3b", ENDITEM,
"Name=regname", "Value={username}", ENDITEM,
"Name=regpwd", "Value=cloudchen", ENDITEM,
"Name=regpwdrepeat", "Value=cloudchen", ENDITEM,
"Name=regemail", "Value={email}@gmail.com", ENDITEM,
"Name=apartment", "Value=110101", ENDITEM,
"Name=rgpermit", "Value=1", ENDITEM,
EXTRARES,
"Url=images/register/regstep.png", "Referer=http://localhost:8000/phpwind85/register.php?step=finish&verify=ab8bc0c6", ENDITEM,
"Url=images/register/regarrow.png", "Referer=http://localhost:8000/
phpwind85/register.php?step=finish&verify=ab8bc0c6", ENDITEM,
LAST);
  这个提交表单函数的作用就是进行注册用户操作,从中可以找到需要参数化的用户名和电子邮件地址,然后构建100条记录的参数表,设置迭代100次即可完成。
  当设置Update value on为Each iteration 时,即使参数没有被调用,记录仍然下移。
  大家可以试试设置Action()迭代的次数为3,将lr_eval_string ("{paramzhongwen}")放置在vuser_end()函数中,结果是什么?
  2)Sequential+ Each occurrence
  将paramzhongwen的Update value on选项从Each iteration修改为Each occurrence,再运行一次脚本。
  Action()
  {
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  结果为[甲]。设置Run Logic中的iteration次数为2,会发现结果和Each iteration并无区别,那么Each occurrence有什么特殊之处呢?将脚本修改为:
  Action()
  {
  lr_eval_string("{paramzhongwen}");
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  再次运行该脚本,结果为[甲乙|丙丁]。
  对比Each iteration会发现结果从[甲甲|乙乙]变成了[甲乙|丙丁],这就是each occurrence的作用,只要取一次参数值,那么记录就会发生变化。将Run设置迭代的次数为3,结果为[甲乙|丙丁|戊甲]。
  思考题:
  如果把脚本改为如下形式:
  Action()
  {
  Int I;
  For(i=0;i<2;i++)
  {
  lr_eval_string("{paramzhongwen}");
  }
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  并且设置Run上的迭代次数为2,请问参数结果是多少?
  由于Each occurrence是每次取值更新的,所以我们的结果为[甲乙丙|丁戊甲]。
  练习题:
  还是上一个练习的要求,但是不允许使用Run Logic中的迭代设置。
  这里可以通过设置for循环来解决Run Logic迭代的重复方式,不过有一点要注意,如果在前面脚本中用户名和电子邮件名使用相同的参数名时,该脚本会由于Each occurrence导致一次注册操作会使用两条参数记录,注册的用户数就会减少一半。
  3)Sequential+Once
  相对来说Once的取值比较简单,对于整个脚本来说参数值只取一次,再也不更新了。
  设置{paramzhongwen}参数Update value on为Once,再次运行脚本:
  Action()
  {
  lr_eval_string("{paramzhongwen}");
  return 0;
  }
  无论怎么设置迭代或者for循环,取到的{paramzhongwen}值都是"甲",因为第一次取到的值是"甲",以后再也不更新,所以{paramzhongwen}的值不变。
  下面来总结一下选择Select next row 下的Sequential选项时,参数化的取值情况,如表A.4所示。
  表A.4  顺序取值下的各种情况
  Each iteration只受迭代次数的影响,也就是说只要有迭代则Select next row触发,无论是否读取该参数值;Each occurrence恰恰相反,只有读取了参数才会触发Select next row的事件。
  2.Random取值
  顺序取值的各种方法搞明白后,Random取值(随机取值)就比较简单了。随机取值可以实现在参数列表中随机选择一条记录,将paramzhongwen这个参数的Select next row取值方法从Sequential改为Random。再次运行该脚本,会发现每次运行的内容都不尽相同,VuGen会从参数列表中随机取出一条记录,其取值的次数受到Update value on选项的限制。
  1)Random+ Each iteration
  每当一次新的Starting iteration开始,重新从参数列表中取一次随机值。
  2)Random+ Each occurrence
  每当取一次该参数值,从参数列表中重新取一次随机值。
  3)Random+ Once
  当第一次取到随机内容后,再不更新记录。
  思考题:
  如果需要随机且不重复的记录应该如何实现?
  这个问题可以通过参数数据源的随机来实现,通过Random取值的方式是无法实现这个需求的,但是如果把参数的值先随机再放入到参数文件中,那么使用顺序取值取到的内容就是相对的随机。
  大多数时候随机的这种方式其实并不像我们想得那么好用,因为顺序取值很多时候的效果和随机是一样的。对服务器来说某接口的调用数据使用顺序和随机其实都差不多。
  练习题:
  编写脚本,模拟用户随机选择账户并登录论坛的操作。
  通过录制脚本可以获得登录的函数,并将用户名和密码进行参数化(这里的密码必须都相同,如果不同需要参考A.6.5节中的同行取值来解决),参数值可以通过导入(参数值保存在.dat文件中,复制内容即可)前面已注册的用户记录来获取。
web_submit_data("login.php",
"Action=http://localhost:8000/phpwind85/login.php",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=http://localhost:8000/phpwind85/",
"Snapshot=t2.inf",
"Mode=HTML",
ITEMDATA,
"Name=jumpurl",
"Value=http://localhost:8000/phpwind85/index.php",ENDITEM,
"Name=step", "Value=2", ENDITEM,
"Name=pwuser", "Value={username}", ENDITEM,
"Name=pwpwd", "Value={password}", ENDITEM,
"Name=head_login", "Value=", ENDITEM,
"Name=lgt", "Value=0", ENDITEM,
LAST);
  设置username参数的取值方式为Random+Each iteration即可。
  下面总结一下选择Select next row下的Random选项时,参数化的取值情况,如表A.5所示。
  表A.5  随机取值下的各种情况
  Update value on 取值结果
  Each iteration 当设置了Run上的迭代次数后,每产生一次新的迭代,参数随机取一次值
  Each occurrence 每当参数被取值一次,参数随机选择一条记录
  Once 第一次随机取值后,一直沿用这条记录
本文选自《性能测试进阶指南—LoadRunner 11实战(第二版)》,本站经作者的授权。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号