性能测试-关联

标签:
it |
分类: 性能测试 |
一、为什么需要关联
二、常用关联函数
1、简要说明
语法:int web_reg_save_param(const
char *ParamName, , LAST);
2、参数说明:
ParamName: 存放得到的动态内容的参数名称
list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search,
ORD, SaveOffset, Convert, SaveLen。属性值不分大小写
Notfound: 当在返回信息中找不到要找的内容时应该怎么处理
Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。
Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。
LB( Left Boundary ) :
返回信息的左边界字串。该属性必须有,并且区分大小写。如果不想区分大小写,可以在LB后加/IC。
RB( Right Boundary ):
返回信息的右边界字串。该属性必须有,并且区分大小写。如果不想区分大小写,可以在LB后加/IC。
RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。
Search :
返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。
ORD :
说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。
SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。
SaveLen
:当找到匹配项后,找到的值的子字符串的长度(在指定的偏移量中),将保存到参数。缺省值是-1,表示一直到结尾的整个字串都存入参数。
Convert : 可取的值有以下两种:
- HTML_TO_URL : 将 HTML-encoded 资料转成 URL-encoded 资料格式
- HTML_TO_TEXT : 将 HTML-encoded 资料转成纯文字资料格式
3、函数的一些使用技巧:
三、实例讲解:
目的:取得页面中的商品状态,如果状态是正常态就改为注销态,否则改为正常态。
录制脚本使用的是URL based s cript
http://www.cydtest.com/wp-content/uploads/2013/03/web_reg_save_param1.jpeg
将返回的数据记录到日志
http://www.cydtest.com/wp-content/uploads/2013/03/web_reg_save_param2.jpeg
直接手工访问页面,检查URL
http://www.cydtest.com/wp-content/uploads/2013/03/web_reg_save_param3.jpeg
该页面上点击右键,选择属性
http://www.cydtest.com/wp-content/uploads/2013/03/web_reg_save_param4.jpeg
看到URL,对照录制下的脚本中有:
01
02
03
04
05
06
07
08
09
10
11
|
web_url( "modifyOfferingStatePage.do" , "URL={url}/web/businessAccept/order/modifyOfferingStatePage. do ?offeringId= 282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName= {clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态", "Resource=0" , "RecContentType=text/html" , "Referer={url}/web/businessAccept/order/orderMenu.do" , "Snapshot=t23.inf" , "Mode=HTTP" , LAST); |
于是在这段代码前添加注册函数:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
web_reg_save_param( "oldstate" , "LB/IC=原有商品状态:" , "RB/IC=" , "Search=body" , "Ord=1" , "RelFrameId=1" , "SaveOffset=57" , "SaveLen=4" , LAST); web_url( "modifyOfferingStatePage.do" , "URL={url}/web/businessAccept/order/modifyOfferingStatePage. do ?offeringId= 282172&offeringSpecId=1&offeringSpecName= 普通宽带(ADSL/LAN)&customerName={clientname}&nodeId= 260000&pos1=定购管理&pos2=修改商品状态", "Resource=0" , "RecContentType=text/html" , "Referer={url}/web/businessAccept/order/orderMenu.do" , "Snapshot=t23.inf" , "Mode=HTTP" , LAST); ............... //将得到的内容存入日志用于检查 lr_log_message( "getvalue :
%s" ,lr_eval_string
( "{oldstate}" )); if ( lr_eval_string
( "{oldstate}" ) ==
"正常" ){ web_submit_data( "modifyOfferingState.do" , "Action={url}/web/businessAccept/order/modifyOfferingState.do" , "Method=POST" , "RecContentType=text/html" , "Referer={url}/web/businessAccept/order/modifyOfferingStatePage. do ?offeringId= 282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName= {clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态", "Snapshot=t24.inf" , "Mode=HTTP" , ITEMDATA, "Name=offering.state" ,
"Value=1" , ENDITEM, "Name=offering.recentModifyReason" ,
"Value=修改原因" , ENDITEM, "Name=offering.customerId" ,
"Value=281218" , ENDITEM, "Name=offering.offeringId" ,
"Value=282172" , ENDITEM, "Name=offering.offeringSpecId" ,
"Value=1" , ENDITEM, "Name=offering.recentMender" ,
"Value=root" , ENDITEM, "Name=offering.recentModifyDatetime" ,
"Value=2005-01-16" , ENDITEM, "Name=nodeId" ,
"Value=260000" , ENDITEM, "Name=customerName" ,
"Value={clientname}" , ENDITEM, "Name=offeringSpecName" ,
"Value=普通宽带(ADSL/LAN)" , ENDITEM, "Name=submit.x" ,
"Value=33" , ENDITEM, "Name=submit.y" ,
"Value=13" , ENDITEM, LAST); } Else { web_submit_data( "modifyOfferingState.do" , "Action={url}/web/businessAccept/order/modifyOfferingState.do" , "Method=POST" , "RecContentType=text/html" , "Referer={url}/web/businessAccept/order/modifyOfferingStatePage. do ?offeringId= 282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName= {clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态", "Snapshot=t24.inf" , "Mode=HTTP" , ITEMDATA, "Name=offering.state" ,
"Value=0" , ENDITEM, "Name=offering.recentModifyReason" ,
"Value=修改原因" , ENDITEM, "Name=offering.customerId" ,
"Value=281218" , ENDITEM, "Name=offering.offeringId" ,
"Value=282172" , ENDITEM, "Name=offering.offeringSpecId" ,
"Value=1" , ENDITEM, "Name=offering.recentMender" ,
"Value=root" , ENDITEM, "Name=offering.recentModifyDatetime" ,
"Value=2005-01-16" , ENDITEM, "Name=nodeId" ,
"Value=260000" , ENDITEM, "Name=customerName" ,
"Value={clientname}" , ENDITEM, "Name=offeringSpecName" ,
"Value=普通宽带(ADSL/LAN)" , ENDITEM, "Name=submit.x" ,
"Value=33" , ENDITEM, "Name=submit.y" ,
"Value=13" , ENDITEM, LAST); } |
从日志中截取的真实的返回内容为:
vuser_init.c(689):
\r\n vuser_init.c(689):\r\n
vuser_init.c(689): 原有商品状态:
\r\n
vuser_init.c(689):
正常
\r\n
vuser_init.c(689):
\r\n
vuser_init.c(689):
\r\n vuser_init.c(689):\r\n
vuser_init.c(689): 修改后的状态:
\r\n
vuser_init.c(689):
\r\n
vuser_init.c(689): \r\n
vuser_init.c(689): \r\n
vuser_init.c(689): \r\n
vuser_init.c(689):
可以看到左边界是:原有商品状态:《/td》,
右边界是:《/td》,偏移量为:57(包括了空格),
长度为:4(因为一个汉字长度为2),最后存入变量的值是:正常
4.经验总结
1)为了便于脚本的调试,将返回的数据都写入日志是个好办法;
2)为了验证取得的数据是否是自己期望的,可以将取得的数据写入日志中进行验证,
例:lr_log_message(“getvalue : %s”,lr_eval_string
(“{oldstate}”));
3)因为它是一个注册函数,必须在返回信息前使用,所以注册的位置必须正确,否则很可能得到类似如下错误:
4)vuser_init.c(734): Error -27190: No match found for the requested
parameter “oldstate”.
Check whether the requested boundaries exist in the response data.
Also,
if the data you want to save exceeds 1024 bytes,
use web_set_max_html_param_len to increase the parameter size
[MsgId: MERR-27190]
5)vuser_init.c(734): Error -27187: The above “not found”
error(s) may be explained by header and body byte counts being 0
and 0,
respectively. [MsgId: MERR-27187]
6)vuser_init.c(734):
web_concurrent_end highest severity level was “ERROR” [MsgId:
MMSG-27181]
7)所以使用手工方法,右键页面确定在代码中哪个位置之前注册函数至关重要
8)如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。试试:
http://www.cydtest.com/wp-content/uploads/2013/03/web_reg_save_param5.jpeg
四、关联的二种方式:
自动关联和手动关联
- 自动关联
背景:有可能有些需要做关联的动态数据,自动关联的两种方式都无法侦测出来,这时您就需要自行做手动关联了。
过程:
1. 使用相同的业务流程与数据,录制二份脚本
2. 使用WinDiff工具协助找出需要关联的数据
3. 使用web_reg_save_param函数手动建立关联
4. 将脚本中有用到关联的数据,以参数取代
详细步骤:
1. 使用相同的业务流程与数据,录制二份脚本
2. 使用WinDiff工具协助找出需要关联的数据
在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。
注意:请忽略lr_thik_time的差异部份,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间。
您要找的标头格式如下:
*** [tid=b9 Action1 2] Receiving response from host
astra.merc-int.com:80 ( 25/11/2002 12:04:00 )
3. 使用web_reg_save_param函数手动建立关联
这个 “UserSession”
就是到时要使用的参数名称,建议给个有意义的名字。然后找出左边界和右边界,如:web_reg_save_param(“UserSession”,
“LB= input type=hidden name=userSession value=”, “RB=>”,
LAST);
4.将脚本中有用到关联的数据,以参数取代
当使用web_reg_save_param建立参数后,接下来就是用“UserSession”参数去取代脚本中写死的(hard-coded)资料。范例:
将 “Name=userSession”,
“Value=75893.0884568651DQADHfApHDHfcD
换成 “Name=userSession”, “Value={UserSession}”, ENDITEM,
到这里您已经完成了一个关联了,接下来就是执行脚本,是否能成功运行,假如还是有问题,就要检查看看是否还需要再做另一个关联。
五、关联的常见问题