51Testing软件测试论坛

标题: loadrunner测试socket协议程序知识汇总 [打印本页]

作者: cafard-haibin    时间: 2011-6-10 09:15
标题: loadrunner测试socket协议程序知识汇总
本帖最后由 cafard-haibin 于 2011-6-10 09:17 编辑

||简述||
       我会长期对使用loadrunner进行socket通过协议的程序性能测试相关知识进行汇总并讲述。希望有过经验的人能进行讨论,没有实际项目经验的进行学习。但切忌一知半解的人发表一些错误的观点。

第1节课:为什么选用socket通过方式?

      好多人在本论坛上或者其他技术网站来喜欢问:我想测试C/S架构的软件,请问怎么录制?我的程序是C\C++开发的,请问怎么录制脚本?回答的人也很轻浮的答道:socket。

      关于socket协议的概念就不多讲。自己上网查。不理解的贴出来讨论。我这边只说为什么c/s架构的软件要选用socket协议来进行测试。因为loadrunner的原理就是录制网络上传输的网络数据包,所以我们选择与程序相对应的协议,才能更好的去定位在loadrunner中使用什么协议,请问:所有的C/S架构软件都用socket协议吗?当然不是。所以要根据自己的具体产品去看,自己不懂,就找开发去问问。loadrunner11虽然增加了一个功能,用于测试你的程序使用什么样的协议录制比较合理。但很明显这是鸡肋。在工作中我们是如何更好的去把工作做好。高技术说白了也是为了更好的工作,但有了技术我们还要利用方法、思路去做工作。
作者: cafard-haibin    时间: 2011-6-10 09:19
第2节课:socket脚本的基本结构:
  1. #include "lrs.h"


  2. vuser_init()
  3. {
  4.     lrs_startup(257);       

  5.     return 0;
  6. }
复制代码


  1. #include "lrs.h"


  2. Action()
  3. {
  4.         int handler;

  5.         lrs_create_socket("socket0","TCP","RemoteHost=10.1.106.6:20000",LrsLastArg);

  6.         handler=lrs_get_socket_handler("socket0");

  7.         if (handler!=0)

  8.                 {
  9.                 lr_output_message("the new socket handler is: %d",handler);
  10.                 }

  11.         else
  12.                 {
  13.                 lr_output_message("the new socket is not create");
  14.                 }
  15.        
  16.     return 0;
  17. }
复制代码


  1. #include "lrs.h"


  2. vuser_end()
  3. {
  4.     lrs_cleanup();

  5.     return 0;
  6. }
复制代码

作者: cafard-haibin    时间: 2011-6-10 09:33
对第2节课中的内容进行讲解:
代码目的:在进行socket协议性能测试之前,我们首先需要对测试环境的tcp/ip连接数情况进行测试,确保你的测试机、被测试机上不存在tcp/ip连接数限制,或者其他问题。这样才能保证测试的结果的准确性。举个例子:假设您的测试程序放在一台xp机器上。xp机器默认的tcp/ip连接数为10个。那么您并发100个压力测试就失去了意义。所以我们在工作之前需要先通过一个简单的只创建socket连接的程序测试下测试环境。比如我最近发现windows 2003 sp2 企业版创建的socket连接数在7000-8000之间。linux下就比较高。

通过代码学习到的知识点:
lrs_startup(257);  启动winsocket.dll。知道就可以。

lrs_create_socket:创建socket函数。参数分别是:socket名称、协议类型(TCP或UDP)、链接类型(远程链接:RemoteHost、本地:LocalHost、或者本地监听)、LrsLastArg 参数结束标记。在实际工作中对此函数认识还是从浅到深吧。不要一开始就去查函数,看帮助的文档,如果你不是高手,就不要这样。还是先录制一个脚本,在录制的脚本去理解,去体会,知道这个就是创建了一个socket连接就好了。当你要测试客户端、当你要测试服务器。有具体问题了,再去查函数。深入理解。

lrs_get_socket_handler:用来或者你所创建的socket的句柄。就一个参数:要获取句柄的socket名称。
作者: cafard-haibin    时间: 2011-6-10 09:47
第3节课:一个登陆过程的完整脚本。
  1. #include "lrs.h"


  2. vuser_init()
  3. {

  4.     lrs_startup(257);

  5.         lrs_create_socket("socket0", "TCP", "RemoteHost=10.1.1.28:3656",  LrsLastArg);

  6.     return 0;
  7. }
复制代码



备注:按照编程习惯,我们一般把初始话winsocket和创建socket连接程序放到脚本初始化部分。不是必须,只是一种完美的表现。当然迭代的时候是有具体的说道。

  1. /*********************************************************************
  2. * 【创 建 者】 cafard@版权所有

  3. * 【脚本说明】 V4.0-客户端-用户登录

  4. * 【创建日期】 2011-05-20

  5. * 【脚本版本】 LoginV1.0
  6. *********************************************************************/
  7. #include "lrs.h"

  8. Action()
  9. {

  10. //是否需要设置集合点

  11.         //lr_rendezvous("模拟登录");

  12. //开始登录事务
  13.         lr_start_transaction("模拟登录");
  14. //发送登录请求数据包
  15.         lrs_send("socket0", "buf0", LrsLastArg);
  16. //接收服务器返回的数据包
  17.         lrs_receive("socket0", "buf1", LrsLastArg);
  18.         return 0;
  19. }
复制代码


说明:数据收发过程。需要知道lrs_send是发送数据包函数。lrs_receive是接受数据包函数就好。
  1. #include "lrs.h"


  2. vuser_end()
  3. {

  4.         lrs_close_socket("socket0");

  5.         lrs_cleanup();

  6.     return 0;
  7. }
复制代码


说明:lrs_close_socket是关闭连接,lrs_cleanup是停止对winsocet的使用,回收相关资源。

  1. ;WSRData 2 1
  2. send  buf0 35
  3.         "\x00\x00"
  4.         "N"
  5.         "\xc0\xff\xff\xff\xff"
  6.         "\xf4\x01"
  7.         "\x00\x00"
  8.         "L"
  9.         "\x14\x00"
  10.         "1050378754|cywtzc|0|"


  11. recv  buf1 29
  12.         "\x00\x00"
  13.         "A"
  14.         "\xc0\xff\xff\xff\xff\xd1"
  15.         "\a"
  16.         "\x00\x00"
  17.         "L"
  18.         "\x02\x00"
  19.         "0"
  20.         "\x00"
  21. -1
复制代码


说明:收发的数据部分。这个部分我会利用一节课单独讲述。
作者: woddebbmm    时间: 2011-6-10 14:51
看完了  没懂……对不起啊。。。人比较笨
作者: yxd2006    时间: 2011-6-11 20:44
学习了,
谢谢楼主分享
作者: cafard-haibin    时间: 2011-6-16 10:25
第4节课:数据包结构分析。[attach]73581[/attach]备注:上图中是我前面讲到的数据包。也是我们程序自身定义的包结构。所以希望大家不要断章取义,以为所有包结构都是这样的。我也不会讲标志的tcp/ip包结构。这方面资料也很多。要学的人可以去百度文库找:Wireshark tcp/ip 包分析。

回到正题:

在我们包结构中:前2位 00 00代表加密方式;4E代表包类型,比如是请求包还是接受包;C0代表包状态;接下来的4位:FF FF FF FF 代表一个目的地址,和一个源地址;接着4位:D1 61 00 00代表一个功能点的标示;接着4C代表包的操作类型;接着2位:14 00代表包体长度。

所以可以看出我们的例子中的包头长度是15.包体长度是0x14。也就是20.所有包的总长度就是20+15=35。

没人顶不写了。~~~~~~~都是来下资料的或者转资料的。
作者: testtoone    时间: 2011-6-16 11:52
继续写列。。。
有兴趣研究这个
作者: 高保真    时间: 2011-6-16 13:22
楼主讲述的很详细啊,希望能够继续,现在在忙项目,等忙完手头的活,来跟楼主学习winsocket。
作者: wangyong3552128    时间: 2011-6-28 10:40
我看着你呢。写..
作者: rolex_sky    时间: 2011-6-28 11:12
楼主,继续啊,我很感兴趣。顶你的。
作者: 南勃万    时间: 2011-6-28 11:34
继续嘛lz
作者: vince0106    时间: 2011-6-28 12:00
很好的学习资料~希望LZ继续啊~~~
作者: jiaraoaini    时间: 2011-7-1 09:10
楼主一定要继续啊。。。
作者: zhang.yuandong    时间: 2011-7-1 10:28
貌似懂了 又没懂!LZ继续
作者: sanlo    时间: 2011-7-1 17:26
lz继续,学习中。
感谢分享
作者: kratexi    时间: 2011-7-3 14:55
看了
必须要登录顶下
作者: shy2005828    时间: 2011-7-6 17:53
顶下,很有价值的
作者: candyzc    时间: 2011-7-7 14:24
写的很详细,很强大,支持
作者: ziyun200    时间: 2011-7-8 13:45
希望楼主能留个QQ或是啥联系方式,想请教啊
作者: shx711    时间: 2011-7-8 15:20
回复 7# cafard-haibin
楼主,继续,相信还是有很多童鞋有兴趣的。
这个跟tuxedo协议的有些类似,你写的"所以可以看出我们的例子中的包头长度是15.包体长度是0x14。也就是20."这个是怎么推算出来的?另,这对后面的工作有何指导意义?
还望楼主能坚持写下去。顶起!
作者: BBnight    时间: 2011-7-21 12:34
回复 7# cafard-haibin

很有兴趣啊,最近也在用 socket~~~,测试socket服务端、客户端之类的。
希望楼主能多多分析实践中的心得体会,共同探讨一起提高
作者: 放任无奈    时间: 2011-7-24 18:09
顶 希望楼主写下去
挺通俗易懂的
作者: 放任无奈    时间: 2011-7-24 18:20
回复 21# shx711


    包头范围是第一个字节到第一行倒数第二个字节 15个
    包体范围是第一行倒数第一个起 和后面所有的 共20个...

    注意,这是LZ程序中定义的结构,不要问为什么包头是15个,包体是20个了
作者: 郝天雨    时间: 2011-8-2 10:38
很不错啊,感谢楼主分享,最近也准备做socket类的性能测试。
作者: gwrocky    时间: 2011-8-2 14:38
楼主啊,期待你继续呢,有啥好的数据包分析的文章,我现在用工具录制了但是分析数据包感觉很困难啊,
作者: gwrocky    时间: 2011-8-2 15:02
回复 7# cafard-haibin


    我问开发的我们的TCP/IP的数据包结构,回答我,我都不知道,彻底郁闷了。
作者: anna03    时间: 2011-8-3 09:07
看的正起劲,没了,lz继续啊,很多童鞋都有兴趣啊
作者: naonao    时间: 2011-8-3 16:09
经典绝对顶!LZ继续啊!瞧瞧这满脸的期待。。。
作者: yu2000    时间: 2011-8-3 16:52
顶一下。。。
作者: candyzc    时间: 2011-8-4 14:35
写的确实很好呀,还有没有了
作者: cafard-haibin    时间: 2011-8-17 11:12
第5节课:关于winsocket中关联:

其中loadrunner中的关联概念大家先搞明白,知道什么时候需要关联。比如有一个登陆过程,登陆成功后返回:用户代码xx登陆成功  。我想把那个用户代码xx取出来。留在后面其他地方使用,这时候就用到了winsocket中一些关联相关的函数。整篇内容请参加我的博客。http://blog.csdn.net/cafardhaibin/article/details/6607827

前段时间几乎脱离了网络的忙碌。所有关于这块知识总结就到此为止。希望给大家能有个抛砖引玉的作用就够了。
作者: lijian88_vip    时间: 2011-8-18 11:09
很基础的东西,写的很细,LZ继续啊
作者: yujingzhen    时间: 2011-8-18 13:59
楼主,不给力啊。。看的正起劲。。没了。
作者: daisy02    时间: 2011-8-23 18:06
帮顶,写的很好啊
作者: wower1985    时间: 2011-8-23 18:52
回复  cafard-haibin
楼主,继续,相信还是有很多童鞋有兴趣的。
这个跟tuxedo协议的有些类似,你写的"所 ...
shx711 发表于 2011-7-8 15:20



这种讲法是不对的,对于某些层次的软件,他的通讯是有明确的通讯报文规则的,叫做“通讯规约”通讯规约定义了软件是如何通讯的,也就是定义定义了报文那个字节代表什么、那几个字节代表什么,一个数据包有多少个字节、校验码等等。准确的说就定义好的通讯规约,你就完全能知道数据包里每个字节代表的意义。所以对于此类自定义通讯规约的软件,我们可以根本不用录制数据包,自己编写、修改数据包都可行。
作者: yayabug    时间: 2011-9-22 10:03
顶一下
作者: zhangxuekun    时间: 2011-9-23 13:09
关于socket协议的测试,请教个问题。

场景是Client和服务端通过socket建立一条连接,然后客户端反复不断的向服务端提交消息。

Client提交消息到服务端,服务端进行响应(应该是TCP层)。在服务端没有进行响应的情况下Client无法

提交第二条消息。而对于LR本身,并不关心是否收到网络层响应。这就会导致其他迭代的消息发送失败。

这个问题应该如何处理?

谢谢
作者: 675711880    时间: 2011-10-27 10:57
回复 4# cafard-haibin

请问这节在哪可以看到?
作者: dream2030    时间: 2011-10-27 14:38
楼主写的很好很详细,正好也在用这部分,偶正看的起劲呢,怎么能没了呢。。楼主你太伟大了,继续写下去吧。。
作者: fj323611    时间: 2011-11-1 15:50
学习了,楼主牛的
作者: chronojly    时间: 2011-11-9 16:13
看的懵懵懂懂的时候,戛然而止了,靠自己去推敲了
作者: zhaoqiong51test    时间: 2011-11-11 11:16
学习了,讲的很详细,初学者也看的懂。不过后面的包结构计算不会。希望楼主继续,关注中~~~~~~~
作者: dvsam    时间: 2011-11-11 11:42
Mark
作者: liuxn_sz    时间: 2011-11-17 14:30
楼主讲的很好,希望继续下去!
关注中....
作者: Katero    时间: 2011-11-17 15:48
呵呵看到楼主说不写了,很可爱呢,恩,继续写吧,我们可以学习,你也可以稳固下知识
作者: feifei_h    时间: 2011-12-1 16:11
有点点懂 了,楼主 ,继续阿
作者: lyhgq321    时间: 2011-12-2 00:10
嘿,最近也是用到这个协议,参数化都不成功,望楼主能写出一篇详细完整的文章来。
作者: bob123654    时间: 2011-12-6 15:47
楼主好淫
作者: wsjianxian    时间: 2011-12-8 13:07
ding------------
作者: naroon    时间: 2012-3-8 12:23
最近有涉及到socket的,正在学习。谢谢楼主共享~
作者: bluetearxie    时间: 2012-3-8 14:45
最近正在用这个 很多不是很清楚 谢谢楼主分享
作者: 蓝色水滴    时间: 2012-3-14 16:23
问题是我们**的在controller里无法跑。。。。。有点小杯具
作者: hbthzhy    时间: 2012-3-19 14:05
刚刚接触socket的测试。前4节讲的都很清楚的。后边还没明白就没有了。。
作者: zbjie    时间: 2012-3-19 14:42
写呗,刚开始学,学得不错,不过没了。
作者: jj_ljw    时间: 2012-4-10 09:31
顶下,lz继续啊
作者: 4149071    时间: 2012-4-10 15:10
顶起
作者: 火镜传说    时间: 2013-5-24 13:36
前面的是基础。包分析与处理是难点
作者: zhengaiqi    时间: 2013-5-28 10:46
一直在学习中。。。。
作者: fuwu527751246    时间: 2013-10-31 11:32
回复 32# cafard-haibin


    咋就完了呢
作者: dqhzh    时间: 2014-1-15 16:12
太少了,遗憾,不过很受用
作者: TEA_茶    时间: 2014-3-6 21:07
回复 7# cafard-haibin
你好,你写的socket协议的学习很详细啊。我这边正好想请教一个问题不知道方便不。就是我现在使用socket协议时存在接收返回报文,返回报文不是定长的,所以能不能分2次接受。一次接受报文头,然后在根据报文头长度判断接受的报文长度呢?
作者: 谷子fang    时间: 2014-3-12 11:55
楼主写啊  这么好的东西
作者: dashuai969    时间: 2014-3-21 12:03
支持一下
作者: linda22    时间: 2014-3-25 17:07
不想每次连接都断开,lrs_close_socket();把这句给注销了,但是运行时仍然是每次都断开连接,不明白为什么了。
作者: xiaoxiaoimg    时间: 2014-4-24 09:11
相当精彩,楼主继续!
作者: cara_zhang1    时间: 2016-3-11 15:56
有没有这方面的教程推荐啊




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