1、翻译LoadRunner 与 Winsock 协议上一篇 / 下一篇 2006-12-07 13:16:06 / 个人分类: LoadRunner查看( 661 ) / 评论( 0 ) / 评分( 0 / 0 )翻译LoadRunner 与 Winsock 协议(一)在开始讨论 winsocket 解决方案之前, 我们先讨论一下各种协议是如何工作.从前面的简介可以了解到很多的高级协议,例如 FTP,HTTP 协议等.以及所有基于 window 的应用(例如 IE,WS-FTP)底层都是在 Winsocket 层上通信,因此任何高级协议的底层都是用 Winsocket 通信。什么时候在 LR 中
2、选择 Winsocket 协议呢?你要先了解 LR 是怎么样工作的:LR捕捉 API 请求然后再把它们回放。所以当你在创建 LR WEB 脚本的时候,VUGEN 捕捉从 IE 出去的所有的 HTTP 请求。除此之外 lr 还支持其他很多协议,例如 Oracle,ODBC 等。在选择不同协议录制脚本的时候,LR 是依靠 hooks捕捉正确的 API 请求。所以既然大部分网络协议都是架构在 winsocket 协议之上的,那对于 lr 不支持的协议,我们都可以在 winsocket 层上录制脚本。所以当找不到合适协议的时候,可以选择 winsocket 来录制。录制 WinSock 协议脚本!Lr
3、 录制新的虚拟用户脚本 ,选择 winsock 协议在 web 虚拟用户脚本中录制的是 URL 信息,所以 VUGEN 启动流览器并运行就可以了,但选择 Winsocket录制的时候,可能会是各种形式的应用,并不简简单单就是浏览器,所以在开始的时候我们不需要指定应用的地址。下面的例子我们选择 winsock 来录制web 应用,正如上面说的我们开始要指定 ie 的地址。因为本来 lr 是支持 http 协议的,所以这个例子并无具体的意义,只是为了使例子简单。翻译LoadRunner 与 Winsock 协议(二)winsock 脚本典型代码?lrs_create_socket(”socket0
4、, “UDP”, “LocalHost=0, “RemoteHost=doors:2084, LrsLastArg);lrs_create_socket(”socket1, “TCP”, “LocalHost=0, “RemoteHost=:80, LrsLastArg);lrs_send(”socket0, “buf0, LrsLastArg);lrs_receive(”socket0, “buf1, LrsLastArg);lrs_send(”socket1, “buf2, LrsLastArg);lrs_send(”socket0, “buf3, LrsLastArg);lrs_rece
5、ive(”socket0, “buf4, LrsLastArg);这是访问雅虎的一个应用,正如我们看到的,winsock 先打开一个 winsocket连接,然后收发包。我们发现录制的脚本中比 web 脚本(三个文件)多一个文件。第四个文件是 data.ws,它里面记载了在 action 里面收发所有包的内容下面是一个 data.ws 的例子。send buf0“!”recv buf1 1“!”send buf2“GET / HTTP/1.1rn”“Accept: */*rn”“Accept-Language: en-usrn”“Accept-Encoding: gzip, deflatern
6、”“User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)rn”“Host: rn”“Connection: Keep-Alivern”“Cookie: B=5oj83bst12l6m Y=v=1 T=z=4TVE6A4ZqE6A9dIIpt30.NQNTYGNDE3NTYwM081 I=i1=010g1q1u24252e2i2k2p2r494a4g4m4q55565b5g6g6t6u7172737678797a7f7“g7k7n7o888f8k8p8q989c9f9i9k9l9n9qacanapb0b3bdbfbhblb
7、qbrbuc0c1c4cgcmcscteie”“jgrlrs_create_socket(”socket1, “TCP”, “LocalHost=0, “RemoteHost=: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, Lrs
8、LastArg);lrs_receive(”socket1, “buf5, LrsLastArg);lrs_send(”socket0, “buf6, LrsLastArg);翻译LoadRunner 与 Winsock 协议(三)创建脚本步骤:1. VuGen 录制脚本2.增强脚本3.参数化4.关联脚本5.设置运行参数6.运行脚本1. VuGen 录制脚本按照之前章节说的步骤创建脚本,录下来的就是基本脚本,可以先把“!”的buffer 注释掉。练习:创建一个简单的 winsock 脚本,可以选择 MI 公司的网站,把录下来的脚本命名为 winsocket_1,再用 Http 协议方式创建一个
9、 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 以来
10、流逝的所有的秒时间,cookie和 session_id 都是根据时间来生成的,所以脚本里面的 9 位数也就直接和脚本运行时间挂钩,所以我们要把这个数改成我们每次运行脚本的确切时间,首先把这个值更换成参数,在 c 里面有一个 Time()的函数。他返回的就是自从January 1 st,1970 以来流逝的所有的秒时间,在脚本的开始用这个函数获取时间值,然后把刚才创建的参数指向这个值。然后在 data.ws 里面替换所有的id,这样每次脚本运行都能获得正确的 id。1.2)把修改了参数的脚本运行一遍,在脚本的运行日志里面寻找”incorrectly”。会找到”Youve reached thi
11、s page incorrectly”这条消息,运行 web 脚本也会发现类似的消息。其中发生了什么呢?注意:在 data.ws 文件中收到的 buffer 内容在每次运行时不会改变,录制脚本时 data.ws 文件被创建并且回放过程中也不会改变?所以 lr 录制的脚本种buffer 不是很重要,LR 用发送包的数据发出请求,然后对比发送请求的数据包和脚本里面包存的数据,这里 lr 只判断数据包大小,而不是具体内容。如果收到的数据包包括“rob”,而 server 响应是“bob”,lr 也会认为脚本运行成功。但如果 server 回复的是 robot”,这样 lr 就会因为收到包的大小不对而
12、认为脚本执行失败。另一种情况时 lr 期望收到 500bytes 大小的包,但是前 10 秒只收到了100bytes,这时 r 会认为超时判断脚本运行失败,可以通过lrs_set_recv_timeout 函数来设定超时时间。那么反面一种情况是,你不想接受所有的数据包,只是想收到包的前100bytes,可以通过函数 ltr_receive_ex 来任意设定想要收到的字节。2.增强脚本在脚本中添加事务,集合点和控制语句等增强脚本,和 web 脚本不同的是winsock 脚本可读性很差,所以要在录制脚本时添加注释,事务和集合点等。如果在脚本中有逻辑需求,那么插入逻辑语句 (通用声明不适应 Wins
13、ock_1 脚本).3脚本参数化把脚本中变化的值参数化,只要用参数把这些值替换掉就可以,使用不同参数重复业务流程,例如在上面的例子里面 jojo/bean 就可以参数化成为userIDs/passwords4关联脚本关联目的是为了让你在一个并发中用到一个商业流程的结果,在 web 脚本中有这样的过程,从 web 脚本中 sessionid 关系到后面的流程能不能运行, winsock脚本有同样的问题。所以需要捕获到 session id 然后把它关联起来,举个例子从下面的脚本中获取 PID(lr 函数的例子):“r”“x0 blah blah blah “rn blah blah blah “
14、PID TT STAT TIME COMMANDrn PID 28469 q2” S 0:01 -tcsh (tcsh)rn”在一个典型的 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 函数
15、不同的是 lrs_save_param 在请求之后进行,这个例子中,第一行代码是接收到 47 号包。lrs_save_param 函数的参数意义如下:socket2: 从 socket2 中扑获数据NULL: null 参数意思是从最后一个 buffer 里截取,在这儿就是指 buf47,如果你从其它的 buf 里面来获取数据,则你必须要指明 buf 的号码了param1:命名的参数值67:位移(下面截解释)5:捕获的长度位移:从 buffer 的开始多少位去捕获参数的值,在下面的例子里面,PID 是从buf47 开始往后 67bytes 来截取的,我们怎么确定这个值?在 data.ws 中选
16、取需要截取参数的地方然后按 F7 键,这样会弹出一个窗体。如下图:在左边的列,你将看到符合这部分数据的偏移量,中间四行是用 EBCDIC 加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含 PID 的真实的数据,很容易就可以根据 64+3 得出位偏移为 67。(现在我们解释一下问什么添加这些多余的东西到数据包中,让它适合我的例子呢?)注意:在 socket 脚本中没有提供 web_find 函数。只有通过编程来找到你要截取的脚本。5run-time 的设置配置 Run-Time 可以控制脚本运行过程中的虚拟用户行为,包括 loop,log 和Time 信息等设置6VuGen 运行脚本.保存并用 VuGen 运行脚本验证脚本是否正确搞定 WinSock!