如何用LoadRunner使用winsock协议测试性能

如何用LoadRunner使用winsock协议测试性能,第1张

首先、我们需要获得传送的数据包的内容,可以通过抓包工具来获取(如sniffer)。也可以直接向开发人员索取。要理解数据包中每位数据的含义,如哪些是启始位,哪些是正文,哪些是校验,哪些是结束等。并统计数据包大小。

第二步、我们开始编写脚本

1、我们初始化Windows Sockets DLL:lrs_startup(version)。

2、然后建立socket连接:lrs_create_socket。

3、然后再把数据放在一个buffer中传送到目标服务器:lrs_send,数据包内容放在data.ws中。这样,一个发送就完成了。

4、然后我们再来接受服务器端给我们的返回数据:lrs_receive。

5、别忘记来个lrs_close_socket来关闭socket,做事有始有终嘛。

简单吧,复杂的流程就是相互组合。最后不要忘记在一些关键点前后加上transaction,以方便得到关键点的性能。

第三步、我们开始执行,与其他协议一样,把得到的结果进行分析。

下面这段是zee写得关于手写winsock脚本。转载过来学习下

对winsock脚本来说,手写脚本不是首选。为了理解如何建立脚本和Buffers,你需要知道服务器发送出来的协议

的细节。

为了自动产生脚本,需要录制一个客户端的应用。

如果你对服务器使用的协议非常的了解,那么也许你可以建立一个Data.ws文件和连贯的actions。但是这个过程

一定是单调而乏味的。你要有一些winsock脚本方面的经验。

为了看一个winsock脚本的例子,先试着录制一个简单的WEB应用(比如一个访问某站点首页的动作)。它会生成一

个简单的winsock脚本和buffer内容的格式。

为了建立LoadRunner的winsock脚本,录制一个客户端应用更可取。这样可以让LoadRunner从windows socket通

信中看到客户端和服务器的底层通信。LoadRunner使用wsock32.dll库录制socket通信,这个库包括windows

socket的API。

为了手写LoadRunner的winsock脚本,需要非常熟悉使用的协议。录制一个简单的浏览器的操作可以看到低于HTT

P协议通信的脚本。

下面是一个简单的例子:

[Action section]

lrs_startup(257)

lrs_create_socket("socket3", "TCP", "RemoteHost=slashdot.org:80", LrsLastArg)

lrs_send("socket3", "buf4", LrsLastArg)

lrs_receive("socket3", "buf5", LrsLastArg)

[data.ws section]

send buf4

"GET / HTTP/1.1\r\n"

"Host: slashdot.org\r\n"

"User-Agent: Mozilla/5.0 (WindowsUWindows NT 5.0en-USrv:0.9.4) Geck"

"o/20011128 Netscape6/6.2.1\r\n"

"Accept: text/xml, application/xml, application/xhtml+xml, text/htmlq=0.9,"

" image/png, image/jpeg, image/gifq=0.2, text/plainq=0.8, text/css, */*q"

"=0.1\r\n"

"Accept-Language: en-us\r\n"

"Accept-Encoding: gzip, deflate, compressq=0.9\r\n"

"Accept-Charset: ISO-8859-1, utf-8q=0.66, *q=0.66\r\n"

"Keep-Alive: 300\r\n"

"Connection: keep-alive\r\n"

"Cache-Control: max-age=0\r\n"

"\r\n"

recv buf5 16716

"HTTP/1.1 200 OK\r\n"

"Date: Thu, 17 Jan 2002 15:27:13 GMT\r\n"

"Server: Apache/1.3.20 (Unix) mod_perl/1.25 mod_gzip/1.3.19.1a\r\n"

"SLASH_LOG_DATA: shtml\r\n"

"X-Powered-By: Slash 2.003000\r\n"

"X-Bender: The laws of science be a harsh mistress.\r\n"

"Connection: close\r\n"

"Transfer-Encoding: chunked\r\n"

"Content-Type: text/html\r\n"

为了建立这样的脚本,你要知道客户端和服务端通信的时候发送的buffer的格式。这种格式最好适用于指定协议

lr_save_string("aaa","param"):将字符串“aaa”或者一个字符串变量,转变成LR的参数{param}

lr_save_int(123,”param”)将数字123,转变为LR的参数param

lr_eval_string("{param}"):取出参数{param}中的值,可嵌套在其他函数里使用

strcmp:字符串比较函数,若两个值相等,则返回0

strcpy:字符串拷贝函数,可以把一个字符串拷贝到一个字符数组中

strcat:字符串拼接函数,可以把一个字符串拼接到一个字符数组中

lr_convert_string_encoding(lr_eval_string("{msg}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"afterEncodeMsg")

将LR中的参数{msg},从utf-8编码转换为system_local编码(LR本地编码),最后保存到LR的参数{afterEncodeMsg}中

lr_paramarr_random("param_arry"):从参数数组param_arry中随机取一个值,注意param_arry不需要加{}

int size

size = lr_paramarr_len("param_arry"):获取参数数组param_arry的长度,并保存到C语言的变量size里

int value

value = lr_paramarr_idx("param_arry",1):获取参数数组param_arry中第1个值,并保存到C语言的变量value里

6、web_url():get接口,一般通过录制生成

7、web_custom_request():post接口,可以测试http接口或者webservice接口

8、web_submit_data():post接口,可以测试文件上传类型接口

9、atoi(lr_eval_string("{param}")):将LR参数{param}转换为数字

10、web_reg_save_param:关联函数,一定要写在请求之前

11、web_reg_find:文本检查点函数,一定要写在请求之前

13、 web_save_timestamp_param:将当前的时间戳保存成一个参数

14、web_add_cookie函数:新增cookie

15、web_add_header函数,新增header信息

web_custom_request函数,需要新增header(Content-type:text/xml)

1、lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:8888", LrsLastArg),创建socket连接

2、lrs_send("socket0", "buf0", LrsLastArg),发送buf中的数据

3、lrs_receive("socket0", "buf1", LrsLastArg),接收服务器返回的数据,并保存到一个buf1中

4、lrs_save_param("socket0",NULL,"RecivedData",0,-1),获取服务器返回的数据,并保存到一个参数中RecivedData,最后两个参数,偏移量和length

5、lrs_save_searched_string("socket0",NULL,"RecivedData","LB/BIN=|","RB/BIN=|",1,0,-1),获取服务器返回的数据,并指定了左右边界

过滤出想要的数据,保存到一个参数中,最后三个参数分别为,取值序号、偏移量、保存长度

6、lrs_close_socket("socket0"),关闭链接

7、lrs_set_recv_timeout2:设置结束数据超时时间

一般C/S架构的系统使用SOCKET协议

RemoteHost 服务端地址和端口号

连接是否成功?rc=0 表示建立连接成功

由socket0 通道发送buf0里的数据

将socket通道返回的数据存放到buf1中

关闭socket0通道

第一个参数socket0是指已经建立的socket连接的名称

第二个参数buf0是需要发送的buf(在data.ws中维护)

向流套接字发送指定长度的缓冲区数据

int lrs_length_send(char socket_descriptor , char buffer , int location_option ,

[char locators ], [char additional_params ],LrsLastArg )

socket_descriptor 套接字标识符

buffer 缓冲区标识符

location_option(定位模式) 使用哪种方法进行定位

locator (定位器,跟上一个参数对应) 对应上面的参数,对应的locator参数如下:

LrsLastArg 参数结尾标识

成功返回0,否则返回错误码

在这个例子中,buf0通过socket0发送,数据使用了参数化,NameParameter是一个参数,从一系列的数据中取值。 4是长度数据,但是,随着参数NameParameter变化,长度也在随着变化,比如:David长度应该改为5,Michael长度应该改为7。

int lrs_length_receive(char socket_descriptor , char buffer , int location_option ,

[char locators ], [char additional_params ],LrsLastArg )

lrs_length_send ("socket0", "buf0", LeftRightBoundaries, "LB=LBoundary","RB=:RBoundary", "Offset=10", LrsLastArg)

socket_descriptor 套接字标识符

buffer 缓冲区标识符

location_option (定位模式) 使用哪种方法进行定位:

locator(定位器,跟上一个参数对应) 对应上面的参数,对应的locator参数有三种组合如下:

additional_params(额外参数) 主要包括缓冲区长度格式和长度计算相关的其它问题

LrsLastArg 参数结尾标识

在静态或接收到的缓冲区中搜索出现的字符串,将出现字符串的缓冲区部分保存到参数中

lrs_save_searched_string (char *s_desc, char *buf_desc, char *param_name, char *left_boundary, char *right_boundary, int ordinal, int offset, int param_len)

原始数据为:"0|普通指令下达成功|10000031|"。

lrs_save_searched_string ("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",2,0,-1)

输出结果: "wtbh =10000013" 。在以左边界和右边界第2次出现的地方,获取左右边界里面的所有的值.

原始数据为:"0|普通指令下达成功|10000031|"。

lrs_save_searched_string("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",1,0,-1)

输出结果:"wtbh = 普通指令下达成功",在以左边界和右边界第1次出现的地方,获取左右边界里面的所有的值

原始数据为:"0|普通指令下达成功|10000031|"

lrs_save_searched_string("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",1,4,-1)

• 输出结果:"wtbh = 指令下达成功",在以左边界和右边界第1次出现的地方,获取左边界为起点的第4个字符后面的数据。

将静态或接收到的缓冲区保存到参数中

lrs_save_param (char *s_desc, char *buf_desc, char *param_name, int offset, int param_len)

参数:

从数据包中第34个字符开始连续取8个字符。

将用户、静态或接收到的缓冲区保存到参数中

lrs_save_param_ex (char *s_desc, char *type, char *buff, int offset, int length, char *encoding, char *param)

参数:


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/306425.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存