51Testing软件测试论坛

标题: [翻译]loadrunner与Winsock协议 [打印本页]

作者: pcl2004_27    时间: 2005-5-23 15:09
标题: [翻译]loadrunner与Winsock协议
在讨论winsock解决方案之前,我们先讨论一下各种协议是如何工作.从前面的简介可以了解到很多的高级协议,例如FTP,HTTP协议等.以及所有基于window的应用(例如IE,WS-FTP)底层都是在Winsocket层上通信,因此任何高级协议的底层都是用Winsocket通信。
    什么时候在LR中选择Winsocket协议呢?你要先了解LR是怎么样工作的:LR捕捉API请求然后再把它们回放。所以当你在创建LR WEB脚本的时候,VUGEN捕捉从IE出去的所有的HTTP请求。除此之外lr还支持其他很多协议,例如Oracle,ODBC等。在选择不同协议录制脚本的时候,LR是依靠hooks捕捉正确的API请求。所以既然大部分网络协议都是架构在winsocket协议之上的,那对于lr不支持的协议,我们都可以在winsocket层上录制脚本。所以当找不到合适协议的时候,可以选择winsocket来录制。
      录制WinSock协议脚本!
      Lr录制新的虚拟用户脚本,选择winsock协议
      在web虚拟用户脚本中录制的是URL信息,所以VUGEN启动流览器并运行就可以了,但选择Winsocket录制的时候,可能会是各种形式的应用,并不简简单单就是浏览器,所以在开始的时候我们不需要指定应用的地址。
     下面的例子我们选择winsock来录制web应用,正如上面说的我们开始要指定ie的地址。因为本来lr是支持http协议的,所以这个例子并无具体的意义,只是为了使例子简单。
winsock脚本典型代码?
lrs_create_socket("socket0", "UDP", "LocalHost=0", "RemoteHost=doors:2084", LrsLastArg);
lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=www2.yahoo.com:80", LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lrs_send("socket1", "buf2", LrsLastArg);
lrs_send("socket0", "buf3", LrsLastArg);
lrs_receive("socket0", "buf4", LrsLastArg);
这是访问雅虎的一个应用,正如我们看到的,winsock先打开一个winsocket连接,然后收发包。我们发现录制的脚本中比web脚本(三个文件)多一个文件。

      第四个文件是data.ws,它里面记载了在action里面收发所有包的内容。
      下面是一个data.ws的例子。
send buf0
"!"
recv buf1 1
"!"
send buf2
"GET / HTTP/1.1\r\n"
"Accept: */*\r\n"
"Accept-Language: en-us\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n"
"Host: www.yahoo.com\r\n"
"Connection: Keep-Alive\r\n"
"Cookie: B=5oj83bst12l6m&b=2; Y=v=1&n=8lln5lmi3f8g1&l=6ef8c0d34b0/o&p=m2a2s"
"qa4110004&r=3f&lg=us&intl=us; T=z=4TVE6A4ZqE6A9dIIpt30.NQNTYGNDE3NTYwM081&"
"a=AAE&sk=DAAEwinHlDtEm/&d=c2wBTWpFQk16WXdNakUzTkRneQFhAUFBRQF6egE0VFZFNkFn"
"V0E-; I=i1=010g1q1u24252e2i2k2p2r494a4g4m4q55565b5g6g6t6u7172737678797a7f7"
"g7k7n7o888f8k8p8q989c9f9i9k9l9n9qacanapb0b3bdbfbhblbqbrbuc0c1c4cgcmcscteie"
"jgr&ir=73\r\n"
"\r\n"
send buf3
"!"
recv buf4 1
"!"
recv buf5 2048
"HTTP/1.0 200 OK\r\n"
"Content-Length: 16030\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html><head><titl

buf2包含了发给www.yahoo.com的包,buf5包含了从server收到的回应。正如看到的winsock录制的脚本并不像web脚本那样具有可读性,因为winsock是我们最后的选择。在buf序列号的后面是buf的字节数。例如5号buffer后面的2048就是表示收到了2048个帧。
   注意:在很多buffer里面你会发现仅仅包含了一个“!”,这是一个网络常识,这个帧对于应用来说没有任何的作用,完全可以把这些桢清除掉,在data.ws清除这个帧是效果的,需要到action里把这些桢注释掉。譬如例子中收到和发出的buffer可以用//注释掉。这样可以使脚本运行得更快。下边的例子: buffers 0, 1, 3 和 4 可以注释掉:
lrs_create_socket("socket0", "UDP", "LocalHost=0", "RemoteHost=doors:2084", LrsLastArg);
lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=www2.yahoo.com:80", LrsLastArg);
// lrs_send("socket0", "buf0", LrsLastArg);
// lrs_receive("socket0", "buf1", LrsLastArg);
lrs_send("socket1", "buf2", LrsLastArg);
// lrs_send("socket0", "buf3", LrsLastArg);
// lrs_receive("socket0", "buf4", LrsLastArg);
lrs_receive("socket1", "buf5", LrsLastArg);
lrs_send("socket0", "buf6", LrsLastArg);

创建脚本步骤:
1. VuGen录制脚本
2.增强脚本
3.参数化
4.关联脚本
5.设置运行参数
6.运行脚本
1. VuGen录制脚本
      按照之前章节说的步骤创建脚本,录下来的就是基本脚本,可以先把“!”的buffer注释掉。
练习:
      创建一个简单的winsock脚本,可以选择MI公司的网站,把录下来的脚本命名为winsocket_1,再用Http协议方式创建一个Web脚本,把脚本保存为WebWinsock_1.请不要更改session_id把两种脚本比较,当你登陆的时候,可以收到一个“welcome,jojo....”的消息。既然所有的消息都放在data.ws文件里,那么data.ws里面应该能找到这条消息。
1.1) 在几号bufffer里面包含“welcome,jojo”?怎样判断这是收到的帧而不是发出的帧?还有着个字符串正如显示的那样或者他是html的一个标签。

      仔细查看脚本,在data.ws文件中寻找MSO=SIDxxxxxxxxx,XXXXXX是9位数的号码 ,他表示自从January 1 st,1970以来流逝的所有的秒时间,cookie和session_id都是根据时间来生成的,所以脚本里面的9位数也就直接和脚本运行时间挂钩,所以我们要把这个数改成我们每次运行脚本的确切时间,首先把这个值更换成参数,在c里面有一个Time()的函数。他返回的就是自从January 1 st,1970以来流逝的所有的秒时间,在脚本的开始用这个函数获取时间值,然后把刚才创建的参数指向这个值。然后在data.ws里面替换所有的id,这样每次脚本运行都能获得正确的id。
1.2)把修改了参数的脚本运行一遍,在脚本的运行日志里面寻找”incorrectly”。会找到"You've reached this page incorrectly"这条消息,运行web脚本也会发现类似的消息。其中发生了什么呢?
      注意:在data.ws文件中收到的buffer内容在每次运行时不会改变,录制脚本时data.ws文件被创建并且回放过程中也不会改变?所以lr录制的脚本种buffer不是很重要,LR用发送包的数据发出请求,然后对比发送请求的数据包和脚本里面包存的数据,这里lr只判断数据包大小,而不是具体内容。如果收到的数据包包括“rob”,而server响应是“bob”,lr也会认为脚本运行成功。但如果server回复的是robot”,这样lr就会因为收到包的大小不对而认为脚本执行失败。另一种情况时lr期望收到500bytes大小的包,但是前10秒只收到了100bytes,这时r会认为超时判断脚本运行失败,可以通过lrs_set_recv_timeout 函数来设定超时时间。
    那么反面一种情况是,你不想接受所有的数据包,只是想收到包的前100bytes,可以通过函数ltr_receive_ex 来任意设定想要收到的字节。
2.增强脚本
    在脚本中添加事务,集合点和控制语句等增强脚本,和web脚本不同的是winsock脚本可读性很差,所以要在录制脚本时添加注释,事务和集合点等。如果在脚本中有逻辑需求,那么插入逻辑语句 (通用声明不适应Winsock_1脚本).
3.脚本参数化
      把脚本中变化的值参数化,只要用参数把这些值替换掉就可以,使用不同参数重复业务流程,例如在上面的例子里面jojo/bean就可以参数化成为userIDs/passwords
4.关联脚本
关联目的是为了让你在一个并发中用到一个商业流程的结果,在web脚本中有这样的过程,从web脚本中sessionid关系到后面的流程能不能运行,winsock脚本有同样的问题。所以需要捕获到session id然后把它关联起来,举个例子从下面的脚本中获取PID(lr函数的例子):
"\r"
"\x0 blah blah blah "
"\r\n blah blah blah "
"PID TT STAT TIME COMMAND\r\n PID 28469 q2"
" S 0:01 -tcsh (tcsh)\r\n"
在一个典型的web脚本中,你用web_create_html_param函数,用“PID“ 和“q2”定义边界扑获数据。
在Winsock脚本中,用lrs_save_param函数从静态数据或收到的数据包中截获数据,看下面的例子:
lrs_receive("socket2", "buf47", LrsLastArg);
lrs_save_param("socket2", NULL, "param1", 67, 5);
和web_create_html_param函数不同的是lrs_save_param在请求之后进行,这个例子中,第一行代码是接收到47号包。lrs_save_param函数的参数意义如下:
socket2: 从socket2中扑获数据
    NULL: null参数意思是从最后一个buffer里截取,在这儿就是指buf47,如果你从其它的buf里面来获取数据,则你必须要指明buf的号码了
param1:命名的参数值
67:位移(下面截解释)
5:捕获的长度
位移:从buffer的开始多少位去捕获参数的值,在下面的例子里面,PID是从buf47开始往后67bytes来截取的,我们怎么确定这个值?
在data.ws中选取需要截取参数的地方然后按F7键,这样会弹出一个窗体。如下图:
在左边的列,你将看到符合这部分数据的偏移量,中间四行是用EBCDIC加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含PID的真实的数据,,很容易就可以根据64+3得出位偏移为67。
(现在我们解释一下问什么添加这些多余的东西到数据包中,让它适合我的例子呢?)
注意:在socket脚本中没有提供web_find函数。只有通过编程来找到你要截取的脚本。
5.run-time的设置
配置Run-Time可以控制脚本运行过程中的虚拟用户行为,包括loop,log和Time信息等设置
6.VuGen运行脚本.
保存并用VuGen运行脚本验证脚本是否正确
搞定WinSock!
作者: pcl2004_27    时间: 2005-5-23 15:09
原版翻译Word文档整理后会贴出来!
作者: 小灰尘    时间: 2005-5-23 16:35
问下pcl 你这样录制后,如果出现了10053错误的话,如何解决呢?web下用winsocket,licence只能支持到100,可惜了。呵呵
作者: firefly200    时间: 2005-5-24 22:01
标题: 10053错误,好像是和后台服务的连接问题
to 小灰尘 10053错误,好像是后台服务的连接有问题,我在测试时,查看我后台有一个服务的端口号变了,就会出现这种问题。
作者: yuxingxin    时间: 2005-5-30 14:06
10053错误的引发原因有很多种,上面提到的是一种可能情况,即动态数据的问题,也可能是因为接收数据超时引起,也有可能是网络问题。
作者: zh_haim    时间: 2005-5-30 20:57
windows注册表里有个键值,可以试着修改此项设置,如下为time wait 为32秒
"TcpTimedWaitDelay"=dword:00000020
作者: 小屋_vivian    时间: 2005-6-20 12:25
请问斑竹,我在用loadrunner的winsocket测试移动游戏的时候,经常遇到如下的问题:
action.c(24):error:timeout expired while trying to accpet connection.error code :9077
acrion.c(27):error:socket-operation on non-socket.error code;10038
另外在recording log中,我看到:flag,protocol和optval都是0,请问这是什么原因,请能帮忙点拨一下吗?
我的msn:ghlhm@hotmail.com
作者: 小屋_vivian    时间: 2005-6-20 12:31
请问斑竹,我在用loadrunner的winsocket测试移动游戏的时候,经常遇到如下的问题:
action.c(24):error:timeout expired while trying to accpet connection.error code :9077
acrion.c(27):error:socket-operation on non-socket.error code;10038
另外在recording log中,我看到:flag,protocol和optval都是0,请问这是什么原因,请能帮忙点拨一下吗?
我的msn:ghlhm@hotmail.com
作者: damocau    时间: 2005-8-5 14:28
标题: 顶,再顶!
收获中。。。
感谢!
作者: haoyuan642    时间: 2005-8-16 15:45
郁闷,不会用啊,到底怎么用winsock吗?
我不会写那些函数!那些函数后面的参数,也不是明白,能否具体讲下!
作者: aaroncheng    时间: 2005-8-16 15:51
感谢楼主!
作者: aaroncheng    时间: 2005-8-16 15:53
感谢楼主!
作者: fish_ylf    时间: 2005-8-26 10:45
期待您的word文挡,谢谢!
作者: chenbaidu    时间: 2005-9-4 22:11
各位大虾,可否留下你们的联系方式呢?
作者: chenbaidu    时间: 2005-9-8 15:17
小弟实在是看不懂啊
作者: sendy    时间: 2005-9-15 17:30
Originally posted by haoyuan642 at 2005-8-16 15:45:
郁闷,不会用啊,到底怎么用winsock吗?
我不会写那些函数!那些函数后面的参数,也不是明白,能否具体讲下!


我也有此同感!请帮忙讲具体点吧!同时期待您的word文档!嘿嘿!;):p
作者: chenweihua    时间: 2005-12-31 11:22
辛苦了,LZ.
作者: liangjz    时间: 2006-1-4 11:20
loadrunner  lrs_receive 接收变长网络包,会默认等待10s,会导致响应时间计算有问题以及施加给服务器的压力偏小。

故如果不了解c/s双方收发过程 ,强烈建议不要选择winsock协议录制。

此时最好自己封装收包过程成dll。
作者: yangfengwait    时间: 2006-3-16 16:45
樓豬果然高人,深入淺出,說的妙
作者: rlyan    时间: 2006-3-27 12:08
18楼此言差矣,我是用如下方法解决的:


        lrs_set_recv_timeout(atoi(lr_eval_string(100)), 0);
        lrs_set_recv_timeout2(atoi(lr_eval_string(100)), 0);
        lrs_set_receive_option(EndMarker, StringTerminator, "endflag", LrsLastArg);


最后一个函数是以查找每个buffer的结束符作为判断此buffer是否终结的标志。
作者: 婧颦    时间: 2006-6-1 17:30
回家试试看!
作者: fewcloud    时间: 2006-6-12 14:06
好贴,顶啊,感谢楼主分享
作者: assdog    时间: 2006-6-22 11:40
我测试一个C/S的通讯工具,基于jabber协议的,我用winsocket协议录制,初期做的时候始终无法录制,每次到捕获第六个event的时候,loadrunner就会死掉,程序也会死掉,这个问题很郁闷,一直也没找到原因,后来我打开程序的debug窗口,察看了第六个包的内容,是接收用户信息列表,是个比较大的包,但是应该也不至于死机。后来我干脆直接从debug信息窗口中把buf信息拷贝到脚本中,手动的写的脚本。但是中间还是有丢失了一部分的信息。 两个问题,第一个,在发送与接收的buf中会使用tls加密的信息,这个在debug窗口里是看不到的,所以,脚本里的buf信息也不是加密的。第二个,debug窗口中会有些信息是改变联系人的窗台的,举例来说就是当更新联系人列表的时候,如果联系人在线,就会把联系人的icon变成活动的,这个在buf中如何实现不得而知,所以,现在的脚本中没有包含这些信息,所以,基于这两点,这个脚本不是最接近真实情况的,这个问题很困惑我啊,渴望大虾help阿
作者: yuyue2006    时间: 2006-6-22 20:51
标题: 求助!!!!!!
请教各位高手,用loadrunner测.net应用程序选择什么协议?
作者: xuelingyun2485    时间: 2006-6-23 09:12
标题: 如果不联网的应用程序还用loadrunner测试吗?
我现在正在loadrunner,我测试的是MP3的工具软件,不知道能不能用这个测,如果能用那要选什么协议呢?
email:xuelingyun2485@sina.com
作者: wanlili517    时间: 2006-9-4 11:59
标题: 请教问题
楼主,请教一个问题,我在winsocket协议下录制了一个脚本,但是很长,到了buffer5400多,但是这个是一个功能,不能分割的,所以运行这个脚本速度很慢,而且容易死机,请问有什么好的方法吗?谢谢了!(急!急!)
作者: wanlili517    时间: 2006-9-4 12:02
标题: loadrunner脚本问题
我在winsocket协议下录制了一个脚本,但是脚本很长,运行起来容易死机,这是一个功能的录制,又是不能分开的,请问有什么好的解决方法吗??十分感谢!(急!急!急!)
作者: xuying_test    时间: 2006-11-22 11:21
标题: 请教楼主
在“5、捕获的长度”中
“在左边的列,你将看到符合这部分数据的偏移量,中间四行是用EBCDIC加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含PID的真实的数据,,很容易就可以根据64+3得出位偏移为67。”
这个64+3=67我不明白是怎么得到的,麻烦楼主在讲的具体点
作者: hxxhhl    时间: 2006-12-11 16:01
mark,晚上回去试试
作者: senciya    时间: 2007-5-25 11:15
正在学习Winsock协议,谢谢楼主
作者: cuitzeno    时间: 2007-6-18 23:39
收获不好,谢谢了!
作者: zerozzj    时间: 2007-6-26 16:36
标题: 关于WINSOCK问题
现在有2个应用程序A和B是通过WINSOCK协议收发报文的。
现在我想知道如何通过LR测试出当多少个B程序运行时,A无法正常接收发报文。
而且模拟多个B的时候,必须还要考虑到每个B需要配置不同的端口。

刚学LR,也不知道LR能否实现上面的测试否
急需解答,谢谢sdlkfj9
作者: huco7    时间: 2007-9-5 10:00
谢谢楼主的讲解
作者: 大漠孤雁    时间: 2007-9-12 18:26
标题: 回复 #1 pcl2004_27 的帖子
多谢
作者: nataliedu    时间: 2007-9-20 17:36
[attach]33048[/attach]
原帖由 xuying_test 于 2006-11-22 11:21 发表
在“5、捕获的长度”中
“在左边的列,你将看到符合这部分数据的偏移量,中间四行是用EBCDIC加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含PID的真实的数据,,很容易就可以根据64+3得出 ...



研究了好久,终于搞清楚怎么计算偏移量了,以楼主的代码为例:

"\r"
"\x0 blah blah blah "
"\r\n blah blah blah "
"PID TT STAT TIME COMMAND\r\n PID 28469 q2"
" S 0:01 -tcsh (tcsh)\r\n"

1. 全选以上的代码,之后点击F7. 见附件图


2. 从图示可以很容易看出如何计算出偏移量
作者: jinhouzi    时间: 2007-12-18 15:26
找了太久了  眼泪哗哗的,继续的资料啊
作者: s154098121    时间: 2008-3-20 17:00
没怎么看得看懂
作者: vera023    时间: 2008-5-31 23:43
学习了
作者: baishuichen    时间: 2008-7-2 11:09
学习中,多谢各位分享!
作者: ljonathan    时间: 2009-4-7 23:23
精神可嘉,学习
作者: lisa2008    时间: 2009-8-8 17:36
终于看明白了,原来要全选 谢谢35楼的!
作者: cwh12340    时间: 2009-10-30 16:23
标题: 求教用WINDOWSSOKET协议录制的脚本回放时报错!!
Error (pp_init): Failed to load message table        [MsgId: MERR0]
警告: 扩展 wsrun32.dll 报告在调用函数 ExtPerProcessInitialize 时出现错误 -1        [MsgId: MWAR-10485]
错误: 线程上下文: 调用驱动程序的服务失败。原因 – 线程上下文未在此线程上初始化。        [MsgId: MERR-10176]

是什么问题呀,怎么解决呀?请教各位高手赐教!!
作者: m4ster    时间: 2010-8-19 16:35
好多,先谢谢
作者: caiw0418    时间: 2010-11-21 19:38
收藏起来
作者: zhang.yuandong    时间: 2011-8-16 16:35
原版翻译Word文档整理后会贴出来!
pcl2004_27 发表于 2005-5-23 15:09



    六年了,LZ你的WORD还没有整理好啊
作者: linhd030    时间: 2012-7-6 07:39
学习了,楼主有新东西拿出来一起探讨不?
作者: hvoco    时间: 2012-8-8 18:52
呵呵,好帖一定要顶,支持
作者: DreamsYCX    时间: 2012-8-27 16:41
好像对我目前的水平,用处不大
作者: 20924990    时间: 2012-8-30 15:10
记录下 ,谢谢楼主分享
作者: testMA    时间: 2012-11-23 17:36
此贴已阅!!!!




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2