在PDA向服务器发送信息时,如果数据在服务器端通过,则返回标记“1”,以及msg的UUID,否则返回“0”,以及“系统内部错误”的提示。打开LR的扩展日志中的“data returned by server”选项,既可在replay log中看到这些消息。如下图:
数据在服务器端通过后返回标记“1”的日志:
。。。 Action.c(38): Content-Length: 77\r\n Action.c(38): Content-Type: text/html\r\n Action.c(38): Connection: keep-alive\r\n Action.c(38): Keep-Alive: timeout=15, max=99\r\n Action.c(38): \r\n Action.c(38): t=3087ms: 77-byte response body for "http://192.168.1.15:888/upload.do" (RelFrameId=1) Action.c(38): FLAG:1(EB35042AA3B24D508B44598FA5CB3D8C;curDateTime|MjAwOS0wNi0xMiAxMDowOA==) Action.c(38): t=3098ms: 0-byte response body for "http://192.168.1.15:888/upload.do" (RelFrameId=1) Action.c(38): web_custom_request("upload.do") was successful, 77 body bytes, 253 header bytes [MsgId: MMSG-26386] Action.c(47): 1 Ending action Action. Ending iteration 1. Starting iteration 2. 。。。 |
“EB35042AA3B24D508B44598FA5CB3D8C”即是msg的UUID。
数据在服务器端不通过,返回标记“0”的日志:
。。。 Action.c(38): Content-Length: 35\r\n Action.c(38): Content-Type: text/html\r\n Action.c(38): Connection: keep-alive\r\n Action.c(38): Keep-Alive: timeout=15, max=99\r\n Action.c(38): \r\n Action.c(38): t=1688ms: 35-byte response body for "http://192.168.1.15:888/upload.do" (RelFrameId=1) Action.c(38): FLAG:0|MSG:57O757uf5YaF6YOo6ZSZ6K+v Action.c(38): t=1700ms: 0-byte response body for "http://192.168.1.15:888/upload.do" (RelFrameId=1) Action.c(38): web_custom_request("upload.do") was successful, 35 body bytes, 253 header bytes [MsgId: MMSG-26386] Action.c(47): 0 Abort was called from an action. Ending Vuser... Starting action vuser_end. Ending action vuser_end. Vuser Terminated. |
“57O757uf5YaF6YOo6ZSZ6K+v”经过base64解码后,就是“系统内部错误”
在脚本中,要根据返回标记“1”或“0”对脚本进行干预,以模拟PDA的实际操作。当PDA发送消息,服务器返回“1”后,PDA就会进行进行下一条消息的发送;如果服务器返回“0”,则PDA终止消息发送。
因此,在脚本中,要进行如下处理:
脚本模拟发送1条消息,然后获取服务器的返回标记,如果标记为“1”,则继续运行,如果标记为“0”,则终止运行。
思路如下:
l 在脚本中,通过手动关联,获取服务器的返回消息;(使用函数:web_reg_save_param)
l 在发送消息后,用if语句对返回值进行判断,如果标记是“0”在终止脚本。(使用函数:lr_abort())
3.1使用手动关联的注意事项
整个测试脚本不是录制产生的(没有界面可录),因此无法使用自动关联,只能手动关联。首先要对关联函数进行了解。
使用关联函数要注意:
l 关联函数必须放在产生返回值的脚本函数语句的前面。否则运行出现错误,如图:
Action.c(47): Registering web_reg_save_param was successful [MsgId: MMSG-26390] Action.c(55): 1 Ending action Action. Error -27257: Pending web_reg_save_param/reg_find/create_html_param[_ex] request(s) detected and reset at the end of iteration number 1 [MsgId: MERR-27257] Action was aborted. Ending Vuser... Starting action vuser_end. |
l 在if的条件语句中(或lr_message语句中),使用关联参数时,必须使用lr_eval_string函数,以获取参数返回值。
l 参数的值是字符型的,在if语句中要使用atoi语句,将字符转换为数字,以便于进行比较。
3.2使用手动关联的方法
使用手动关联,有两种方法:
l 在script视图手动写脚本语句。
l 在tree视图通过右键菜单创建脚本语句。
关联语句从服务器获取返回值,是如何获取的呢?
首先,LR可以获取服务器的返回信息,并可以将这些返回信息写入日志。服务器返回的消息是很多的。(关联语句是直接从服务器返回信息中的截取某个数据,而与LR是否将返回信息计入日志无关。)
关联语句既然要从返回信息中“截取”数据,必须对数据进行定位,如何进行定位,这就与关联语句的属性列表有关了。在属性列表中,通过属性设置,对数据进行定位。
虽然关联语句与LR是否将返回信息计入日志无关,但是一般情况下,在编写脚本时,还是要通过查看日志,才能确定关联语句的属性。因此,建议在编写脚本调试脚本的过程中,暂时打开LR的扩展日志,往后关闭既可。(日志开得太多,会烦死人。)
3.3对关联函数进行简单介绍
语法:
int web_reg_save_param (const char *ParamName, //参数名称,用户定义 <List of Attributes>, //属性列表 LAST); //属性列表的结束标志 |
说明:
参数名称
用户自定义,用双引号括起来。
属性列表
有若干属性。只对可能用到的属性进行说明:
LB:可选。关联函数所要截取的动态数据的左边界。不指定左边界的情况下,数据从最左边开始取。 RB:可选。关联函数所要截取的动态数据的右边界。不指定右边界的情况下,数据至最左边结束。 SaveOffset:可选。位移。通过左右边界界定了数据后,关联函数从指定位移开始截取数据。默认值为0 SaveLen:可选。数据长度。通过左右边界界定了数据后,关联函数从指定位移开始截取数据,且截取长度为指定的“数据长度”。默认值为通过左右边界界定了数据后,从指定位移开始的所有数据。 |
3.4在script视图中,手动关联的步骤
1. 初始的脚本只有一个发送消息的函数web_custom_request。
2. 运行脚本。发现replay日志中没有显示我所需要的返回信息。(不是服务器没有返回,而是没有显示在日志中。)
3. 打开扩展日志的“data returned by server”选项。
4. 运行脚本。在replay日志中找到了我需要的返回信息。
5. 做一条错误数据,以期获取失败日志。运行脚本。
6. 比较成功日志、失败日志,确定关联函数的属性值,并记忆下来。
7. 在脚本中添加web_reg_save_param函数脚本。并添加if语句脚本。
8. 调试运行。
3.5关联示例以及说明
web_reg_save_param("flag", //参数名称 "LB=FLAG:", //左边界。字符为“FLAG:” "RB=", //右边界。无 "SaveLen=1", //数据长度。值为1。表示数据长度为1。 "RelFrameId=1", LAST); |
为什么没有设置右边界呢?
根据成功、失败的日志,比较后发现,左边界是固定的,右边界不固定。既然右边界不固定,可以通过SaveLen属性指定数据长度来弥补。
3.6在tree视图中,手动关联的步骤
在树中的某个节点位置,点击右键,然后通过右键菜单添加新的步骤,如下图:
选择“web_reg_save_param”,点OK,出现设置窗口,如下图:
图中:
Parameter Name:参数名称。用户定义。示例中“flag”
Left Boundary:左边界。示例中为“FLAGS:”。“Match Case”表示大小写敏感。
Right Boundary:右边界。
Relative FrameID:相关的Frame的ID。便于缩小日志查找范围。从replaylog中可找到。示例中为1。
Save Lenth:数据长度。示例中为1。
在上图中设置完成有,点击OK,即完成手动关联。