接下来我们介绍一个十分常用的函数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 第一次随机取值后,一直沿用这条记录
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。