如何用LoadRunner模拟PDA向服务器发送数据(3)-如何对脚本进行干预

上一篇 / 下一篇  2009-06-12 12:43:53 / 个人分类:LoadRunner学习

PDA向服务器发送信息时,如果数据在服务器端通过,则返回标记“1”,以及msgUUID,否则返回“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”即是msgUUID

 

数据在服务器端不通过,返回标记“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.4script视图中,手动关联的步骤

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.6tree视图中,手动关联的步骤

在树中的某个节点位置,点击右键,然后通过右键菜单添加新的步骤,如下图:

选择“web_reg_save_param”,点OK,出现设置窗口,如下图:

图中:

Parameter Name:参数名称。用户定义。示例中“flag

Left Boundary:左边界。示例中为“FLAGS:”。“Match Case”表示大小写敏感。

Right Boundary:右边界。

Relative FrameID:相关的FrameID。便于缩小日志查找范围。从replaylog中可找到。示例中为1

Save Lenth:数据长度。示例中为1

 

在上图中设置完成有,点击OK,即完成手动关联。


TAG:

 

评分:0

我来说两句

Open Toolbar