51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 12981|回复: 29
打印 上一主题 下一主题

[原创] LR中点鼠标做关联(winsock协议)-Zee

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-6-25 21:26:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写一下winsock的关联操作。
以前看过一个文档。在英文版的讲winsock的,其中讲到关联。大致操作是:
1,录制。
2,回放。这里是失败。
3,到data.ws里找需要关联的数据。
4,按F7,打开EBCDIC translation对话框。
5,查找数据的位置及偏移量。
6,到脚本中写函数用:lrs_save_param, lrs_save_param_ex, lrs_save_searched_string,这三个函数。

Notes:winsock的关联函数要写到需要关联的代码行的下面。

说明一下这几个函数:
Lrs_save_param:
int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);
这个函数保存buffer中的数据到一个参数里。这个函数是用来在脚本中做关联的。
前两个参数是为了指定特定的参数。
在指定活动的socket和buffer之后,需要指定一个参数来保存数据。指定偏移量来显示buffer中数据的偏移量和数据的长度。
保存了参数之后,可以在脚本和数据文件使用它,代替所有需要替代的值。替换时要用选项中的定义的符号来引用。
注意:要从buffer中保存一个编码过的数据到参数中,要用lrs_save_param_ex函数。


lrs_save_param_ex
int lrs_save_param_ex ( char *s_desc, char *type, char *buff, int offset, int length, char *encoding, char *param );
这个函数保存一个buffer或者一个buffer的某一部分到参数中。这个变量指定buffer中某种类型的数据被保存:用户buffer,录制的buffer,或者上一个接收到的buffer.推荐使用在用户数据中。

[这里还没写完。还有另一个函数解释。]




下面说不用这么麻烦的操作的,直接点几下就可以了。

1         录制脚本
这个没什么说的吧。选择协议winsock,这要是也不懂,我建议你去看十遍手册。
我这里录制到的脚本如下:
       lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);
       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);


相应的data.ws如下:
;WSRData 2 1

send buf0 50
       "OPERTYPE(LOGIN)ACCOUNTNAME(admin)PASSWORD(admin)"

recv buf1 155
       "DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS"
       "\xcf\xb5\xcd\xb3"
       "WEB"
       "\xb2\xe9\xd1\xaf\xd5\xca\xbb\xa7"
       "}}USERDESCRIBE{{"
       "\xba\xfe\xd6\xdd\xb5\xe7\xc1\xa6\xbe\xd6"
       "\\DMS"
       "\xcf\xb5\xcd\xb3"
       "WEB"
       "\xb2\xe9\xd1\xaf\xd5\xca\xbb\xa7"
       "}}DEPARTNAME{{"
       "\xce\xb4\xd6\xaa"
       "}}ADMIN{{0}}CLIENTSESSIONID{{2}}"

send buf2 53
       "CLIENTSESSIONID(2)OPERTYPE(INITDEPARTLIST)"

recv buf3 683
       "DATALEN{{683}}000000XMLDATA{{<?xml version=\"1.0\" encoding=\"GB2312\"?>\n"
       "<!DOCTYPE DepartList>\n"
       "<DepartList>\n"
       ………………………………………………………………………………………………
这里就省略了些数据。反正也看着也晕乎乎的。


这里说明一下,我这里是用GIS系统,需要sessionID关联的。我这上面的代码很简单,在buf1中有一个sessionID,在buf2中send时就用到了它。
2         回放一下
在不关联时回放是一定会有问题的。我回放的结果是:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(11): lrs_create_socket(socket1, TCP, ...)
Action.c(13): lrs_send(socket1, buf2)
Action.c(15): lrs_receive(socket1, buf3)
Action.c(15): Mismatch (expected 683 bytes, 42 bytes actually received)
Action.c(17): lrs_create_socket(socket2, TCP, ...)
Action.c(19): lrs_send(socket2, buf4)
Action.c(21): lrs_receive(socket2, buf5)
Action.c(21): Mismatch (expected 34143 bytes, 42 bytes actually received)
Action.c(23): lrs_create_socket(socket3, TCP, ...)
Action.c(25): lrs_send(socket3, buf6)
Action.c(27): lrs_receive(socket3, buf7)
Action.c(27): Mismatch (expected 100 bytes, 42 bytes actually received)
Action.c(29): lrs_create_socket(socket4, TCP, ...)
Action.c(31): lrs_send(socket4, buf8)
Action.c(33): lrs_receive(socket4, buf9)
Action.c(33): Mismatch (expected 134 bytes, 42 bytes actually received)
Action.c(35): lrs_send(socket4, buf10)
Action.c(38): lrs_receive(socket4, buf11)
Action.c(38): Mismatch (expected 17520 bytes, 42 bytes actually received)
Action.c(41): lrs_create_socket(socket5, TCP, ...)
Action.c(43): lrs_send(socket5, buf12)
Action.c(45): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.


主要来看一下蓝色的部分,因为没有关联,服务器是返回了42字节的数据,但是和录制时的数据是不同的。所以会mismatch。这里可以在LOG把Mismatch的值打印出来,不过太长了,我就不打印了。^@^。
3         转到树视图做关联
选择buf1看到数据:
DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS\xcf\xb5\xcd\xb3WEB\xb2\xe9\xd1\xaf\xd5\xca\xbb\xa7}}USERDESCRIBE{{\xba\xfe\xd6\xdd\xb5\xe7\xc1\xa6\xbe\xd6\\DMS\xcf\xb5\xcd\xb3WEB\xb2\xe9\xd1\xaf\xd5\xca\xbb\xa7}}DEPARTNAME{{\xce\xb4\xd6\xaa}}ADMIN{{0}}CLIENTSESSIONID{{2}}


选择CLIENTSESSIONID{{2}}中的2.右击后选择:create parameter。在弹出窗口中。看到默认的是用lrs_save_param,这个函数只能关联固定长度的数据。如果是固定的话,到这里点击一下OK,就关联成功了。LR会自动生成语句并且提示检查其他的需要关联的地方。弹出一个窗口提示。
而我这里的sessionID是动态的值。所以需要选择:extract parameter data using boundaries复选框。这时生成的语句是这样的:
lrs_save_searched_string( "socket0", LRS_LAST_RECEIVED, "Parameter3", NULL, NULL, -1, 152, 1 );


左右边界是NULL空的,这里点击left的浏览,弹出选择左边界的窗口,用鼠标选择:SESSIONID{{,点击Done。
再点击right的浏览,选择}}。
就确定了左右边界了。
这里的语句如下:
lrs_save_searched_string("socket0",LRS_LAST_RECEIVED,"Parameter4","LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);


一路小跑点OK。
弹出提示是否替换所有符合左右边界的值。
点击yes。LR会自动搜索所有需要关联的地方并替换。
再转到脚本视图,看到脚本如下:
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);   
   lrs_save_searched_string("socket0", LRS_LAST_RECEIVED, "Parameter1", "LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);
lr_output_message("小样还抓不到你!你不就是: %s嘛!",lr_eval_string("{Parameter1}"));   
  
lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);


看蓝色部分。后面一句输出是我加上去的。
这样就关联成功了。
4         再次回放
看到LOG如下:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(10): lrs_save_searched_string(socket0, get_last_received_buffer, Parameter1, LB/BIN=SESSIONID{{, RB/BIN=}}, 1, 0, -1)
Action.c(12): 小样还抓不到你!你不就是: 8嘛!
Action.c(14): lrs_create_socket(socket1, TCP, ...)
Action.c(16): lrs_send(socket1, buf2)
Action.c(18): lrs_receive(socket1, buf3)
Action.c(20): lrs_create_socket(socket2, TCP, ...)
Action.c(22): lrs_send(socket2, buf4)
Action.c(24): lrs_receive(socket2, buf5)
Action.c(26): lrs_create_socket(socket3, TCP, ...)
Action.c(28): lrs_send(socket3, buf6)
Action.c(30): lrs_receive(socket3, buf7)
Action.c(32): lrs_create_socket(socket4, TCP, ...)
Action.c(34): lrs_send(socket4, buf8)
Action.c(36): lrs_receive(socket4, buf9)
Action.c(38): lrs_send(socket4, buf10)
Action.c(41): lrs_receive(socket4, buf11)
Action.c(44): lrs_create_socket(socket5, TCP, ...)
Action.c(46): lrs_send(socket5, buf12)
Action.c(48): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.


看,输出了:
Action.c(12): 小样还抓不到你!你不就是: 8嘛!



完。

[ 本帖最后由 Zee 于 2007-6-29 20:26 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-6-25 22:09:59 | 只看该作者
沙发一个~
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-6-25 23:23:22 | 只看该作者
板凳一个~
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-6-26 09:38:15 | 只看该作者
沙发板凳都被你们占了,我只能作地板了。


顶,我等你这篇文章几个月了,:)
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-6-26 10:00:13 | 只看该作者
高手~~
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-6-26 10:45:04 | 只看该作者
厉害,佩服!:)
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2007-6-26 11:10:18 | 只看该作者
sdlkfj2牛
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-6-26 11:40:42 | 只看该作者
谢谢Zee版主的无私奉献,希望在以后的工作中能用到。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2007-6-26 12:02:15 | 只看该作者
支持个
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-6-26 16:12:58 | 只看该作者
原帖由 Zee 于 2007-6-25 21:26 发表
今天写一下winsock的关联操作。
以前看过一个文档。在英文版的讲winsock的,其中讲到关联。大致操作是:
1,录制。
2,回放。这里是失败。
3,到data.ws里找需要关联的数据。
4,按F7,打开EBCDIC translation对 ...


关于Winsock协议,到目前为止的工作中还没有遇到过,所以暂时 收藏 起来
回复 支持 反对

使用道具 举报

该用户从未签到

11#
 楼主| 发表于 2007-6-29 18:00:48 | 只看该作者
呵呵,这几天没上线,谢谢各位鼓励。sdlkfj6 sdlkfj6
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2007-7-26 16:04:50 | 只看该作者
看得出胡里胡涂的,不过还是要说谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-8-10 12:20:01 | 只看该作者
我连WEB都没搞懂,哭死~~~
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2007-10-10 18:16:11 | 只看该作者
winsocket,我还没接触过,了解一下!
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2008-7-18 10:46:19 | 只看该作者
受益匪浅阿 谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2008-9-2 17:05:49 | 只看该作者
谢谢Zee,受教了~
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2008-9-3 10:17:18 | 只看该作者
zee
我这里有个问题,就是第三步那里转到树视图做关联

为什么我的data.ws转换不到树视图,只能是scipt模式?
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2008-11-12 13:59:28 | 只看该作者
万分感谢!这一个问题琢磨好久了!
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2008-11-12 14:48:04 | 只看该作者
看不懂,希望以后在工作中能够遇到类似的问题,到时候交流一下,thanks
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2008-11-12 15:20:27 | 只看该作者
按照楼主说得关联成功,第一次回放成功,
连续进行第二次回放时提示错误,
说是保存参数到变量错误,是什么原因呢?
难道是我哪里做得不对?
有人能赐教吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-15 19:45 , Processed in 0.090998 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表