aks5201314 发表于 2008-8-19 13:00:44

解决Winsocket脚本中随机变化端口一例

最近做了一个GIS系统的性能测试,由于系统涉及保密,系统的具内容我就不介绍了.系统采用C/S架构,用C#语言开发完成,后台的数据库是ORACLE9I.由于以前对C/S架构的系统测试的不多,在测试中遇到了随机端口这个难题.经过几天的研究,终于解决了这个问题.特写出来与大家共享一下,希望对做C/S测试的朋友们有所帮助.测试之前需要在客户端安装ORACLE9I客户端和GIS系统专用的客户端程序.
1.协议的选择
由于客户端和服务器端的通信均使用到ORACLE客户端和arcGIS客户端,所以我选择了ORACLE(2-TIER)和WINSOCKET协议.脚本录制能够顺利捕获到事件,但在脚本中出现了一些乱码,而且都是和ORACLE协议相关的代码.脚本回放失败.顺便说一下,客户端装ORACLE客户端,主要就是完成用户登陆的功能,这个GIS系统是区分用户权限的,所有用户存放在后台数据库中.由于本人对ORACLE数据库不熟悉,再加上脚本中有乱码,用户对地图的放大,缩小操作不涉及到ORACLE数据库.所以我又选择了WINSOCKET协议录制脚本.这次也顺利的录制到了脚本,但回放的时候,脚本依然报错.以下是录制的部分代码
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=172.31.12.4:1521", LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);


lrs_close_socket("socket0");

lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=172.31.12.4:2468", LrsLastArg);
回放脚本报错就在最后一行.我又重新录制了一遍用户登录操作.发现两个脚本中创建socket1时,服务器的端口号不一样.原来脚本出错的原因就在这里,问题虽然找到了,但2468又是从那里来的呢?本人初步判断应该是与服务器第一次SOCKET连接后返回的.所以去data.ws中找找,看能否找到.以下是data.ws中的部分数据
recvbuf1 63
        "\x00"
        "?"
        "\x00\x00\x05\x00\x00\x00\x00"
        "5(ADDRESS=(PROTOCOL=tcp)(HOST=172.31.12.4)(PORT=2468))"
果然在data.ws中找到了2468这个值,接下来处理这个问题的思路就明朗了,即运用关联来处理.
2.关联处理
我查了一下LR的帮助手册,决定用lrs_save_searched_string()来捕获buf1中的端口号,然后再替换创建SOCKET1时服务器端的端口号.以下是具体的处理代码:
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=172.31.12.4:1521", LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);

//在服务器返回的BUFFER中获取SOCKET1中连接的随机端口号并保存到一个变量中
lrs_save_searched_string ("socket0", NULL, "port", "LB=PORT=", NULL, 1, 0, 4);


//输出脚本运行时获取的随机端口号,验证是否捕获了服务器端返回的随机端口号
lr_output_message("Port number is %s",lr_eval_string("{port}"));

//将获取的的端口号替换参数NewParam1
lr_save_string(lr_eval_string("{port}"),"NewParam1");

lrs_close_socket("socket0");

lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=172.31.12.4:{NewParam1}", LrsLastArg);

关于lrs_save_searched_string()详细使用帮助大家可参考帮助手册,有什么地方不明白的大家一起讨论,自学帮助手册那可是学习LR的重中之重啊,希望大家不要忽略这一部分的学习.

经过调试,脚本回放通过.接下来的工作就比较轻松了,录制主要业务的脚本,在场景里运行脚本.顺利的完成了本次性能测试.由于数据库和arcGis服务端都装在同一台服务器上,再加上要求测试的用户量少(20个并发用户),数据库中的数据量也比较少,故本次测试只监控服务器系统的一些常用的记数器,没有监控ORACLE数据库.以上先写这么多,希望能对将来做C/S性能测试的朋友有所帮助,同时也欢迎广大的测试同行们多提意见,多多交流.

escape_2007 发表于 2008-8-19 13:08:56

回复 1# 的帖子

楼主好人啊,我也遇到过这样的问题,就是一直解决不了,现在要按照楼主的高见来试试了,再谢。

iori 发表于 2008-8-19 13:13:59

好贴,顶一个

L_Wming 发表于 2008-8-19 14:19:55

DD

顶:handshake

nataliedu 发表于 2008-8-19 16:05:47

好帖。。。

rzggz 发表于 2008-8-19 17:09:12

强烈的顶!!!!

★星の金币 发表于 2008-8-19 20:05:53

好帖!!!
受教了1

Zee 发表于 2008-8-25 18:16:48

这样的问题,只有关联处理解决了。呵呵。
还有土方法,也可以解决不过不推荐,也就不提了。
我原来写过的一个FTP关联,也是这种的方式,处理的细节上还要更多一些。

xiongflow 发表于 2008-12-30 01:03:23

hao tie

windfly1314 发表于 2009-6-4 10:13:55

ths!
页: [1]
查看完整版本: 解决Winsocket脚本中随机变化端口一例