LR的socket协议

上一篇 / 下一篇  2013-05-29 14:37:09 / 个人分类:winsocket

LRsocket协议51Testing软件测试网 w6]X YcXsE1_!T

[翻译]LoadRunnerWinsock协议(一)
/v+N6UaA|l0
[3j5f:j'i:dNy(X0
 在开始讨论winsocket解决方案之前,我们先讨论一下各种协议是如何工作.从前面的简介可以了解到很多的高级协议,例如FTP,HTTP协议等.以及所有基于window的应用(例如IE,WS-FTP)底层都是在Winsocket层上通信,因此任何高级协议的底层都是用Winsocket通 信。什么时候在LR中选择Winsocket协议呢?你要先了解LR是怎么样工作的:LR捕捉API请求然后再把它们回放。所以当你在创建LR WEB脚本的时候,VUGEN捕捉从IE出去的所有的HTTP请求。除此之外lr还支持其他很多协议,例如OracleODBC等。在选择不同协议录制 脚本的时候,LR是依靠hooks捕捉正确的API请求。所以既然大部分网络协议都是架构在winsocket协议之上的,那对于lr不支持的协议,我们 都可以在winsocket层上录制脚本。所以当找不到合适协议的时候,可以选择winsocket来录制。录制WinSock协议脚本!Lr录制新的虚 拟用户脚本,选择winsock协议在web虚拟用户脚本中录制的是URL信息,所以VUGEN启动流览器并运行就可以了,但选择Winsocket录制 的时候,可能会是各种形式的应用,并不简简单单就是浏览器,所以在开始的时候我们不需要指定应用的地址。下面的例子我们选择winsock来录制web应 用,正如上面说的我们开始要指定ie的地址。因为本来lr是支持http协议的,所以这个例子并无具体的意义,只是为了使例子简单。51Testing软件测试网Z"k\!IRm&s P p n

[翻译]LoadRunnerWinsock协议(二)
H?`4D?#w%I Q0
FW(Y a{!Hl6}J'm0
 winsock脚本典型代码?51Testing软件测试网f2[7V @)a y

lrs_create_socket(”socket0″, “UDP”, “LocalHost=0″, “RemoteHost=doors:2084″, LrsLastArg);51Testing软件测试网2S:r7YAZC9Z's8H9z0ms

lrs_create_socket(”socket1″, “TCP”, “LocalHost=0″, “RemoteHost=www2.yahoo.com:80″, LrsLastArg);51Testing软件测试网y oY&d:tc4b6e}I

lrs_send(”socket0″, “buf0″, LrsLastArg);

B*{0v:Pt0

lrs_receive(”socket0″, “buf1″, LrsLastArg);

Z5Z6xsEP"]0

lrs_send(”socket1″, “buf2″, LrsLastArg);51Testing软件测试网9A2f"Pw*n-c ~0J p

lrs_send(”socket0″, “buf3″, LrsLastArg);51Testing软件测试网7X7jpyUA q

lrs_receive(”socket0″, “buf4″, LrsLastArg);

U/m+r+`r{k0

这是访问雅虎的一个应用,正如我们看到的,winsock先打开一个winsocket连接,然后收发包。我们发现录制的脚本中比web脚本(三个文件)多一个文件。

]4Hm5X[^g0

第四个文件是data.ws,它里面记载了在action里面收发所有包的内容下面是一个data.ws的例子。51Testing软件测试网 Z2w#Yd ]c1i(c

send buf051Testing软件测试网 A gK#hw$BP0r.H\ A#S

“!”

*SWq(G#Ac ^%GQ0

recv buf1 1

-SG0p;H a"n$ByB+~0

“!”

1S-g/ND!d lO0

send buf2

uMNc9l4^X h{0

“GET / HTTP/1.1\r\n”

7kpk5MT#[/~ K9g0

“Accept: */*\r\n”51Testing软件测试网u `Xhk3fa:lY

“Accept-Language: en-us\r\n”

tbB4]lp0{h0

“Accept-Encoding: gzip, deflate\r\n”51Testing软件测试网r+D*e i1^@(E A

“User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n”51Testing软件测试网gj7ho` U1]c_

“Host: www.yahoo.com\r\n”51Testing软件测试网c;@*i_&y YZWPW

“Connection: Keep-Alive\r\n”51Testing软件测试网l@)i&@ v$?p

“Cookie: B=5oj83bst12l6m&b=2; Y=v=1&n=8lln5lmi3f8g1&l=6ef8c0d34b0/o&p=m2a2s”

NB"t1rKv.C(p |0

“qa4110004&r=3f&lg=us&intl=us; T=z=4TVE6A4ZqE6A9dIIpt30.NQNTYGNDE3NTYwM081&”51Testing软件测试网v!ZHG-dt

“a=AAE&sk=DAAEwinHlDtEm/&d=c2wBTWpFQk16WXdNakUzTkRneQFhAUFBRQF6egE0VFZFNkFn”

M/X8A[|4k0

“V0E-; I=i1=010g1q1u24252e2i2k2p2r494a4g4m4q55565b5g6g6t6u7172737678797a7f7″

7n s\&Xh(^8Yd0

“g7k7n7o888f8k8p8q989c9f9i9k9l9n9qacanapb0b3bdbfbhblbqbrbuc0c1c4cgcmcscteie”

,r {V7lH;L8G uvq3[0

“jgr&ir=73\r\n”51Testing软件测试网H7E)T2Ua{

“\r\n”

r%OY-_1S&A)i0

send buf3

*]m ~1D%tXJ4T _0

“!”

ngU,E7aF0

recv buf4 1

,j"lk3jO.I0

“!”

]#l-t~j}u`0

recv buf5 204851Testing软件测试网 iL3rv)W0e

“HTTP/1.0 200 OK\r\n”

` D }8j/Qq'a,[ly4a0

“Content-Length: 16030\r\n”51Testing软件测试网qS4G!T:E!_

“Content-Type: text/html\r\n”

hM dbE7N0

“\r\n”51Testing软件测试网f;z3A#B5K6x8oH-g

51Testing软件测试网B"f8D;l S1rq)E

buf2包含了发给www.yahoo.com的包,buf5包含了从server收到的回应。正如看到的winsock录制的脚本并不像web脚本那样具有可读 性,因为winsock是我们最后的选择。在buf序列号的后面是buf的字节数。例如5buffer后面的2048就是表示收到了2048个帧。

b8oA'A5fg P`0

注 意:在很多buffer里面你会发现仅仅包含了一个,这是一个网络常识,这个帧对于应用来说没有任何的作用,完全可以把这些桢清除掉,在data.ws清除这个帧是效果的,需要到action里把这些桢注释掉。譬如例子中收到和发出的buffer可以用//注释掉。这样可以使脚本运行得更 快。下边的例子:buffers 0, 1, 34可以注释掉:

h6L M%R U8d4W0

lrs_create_socket(”socket0″, “UDP”, “LocalHost=0″, “RemoteHost=doors:2084″, LrsLastArg);

^'mc&] Z3}-~1T0

lrs_create_socket(”socket1″, “TCP”, “LocalHost=0″, “RemoteHost=www2.yahoo.com:80″, LrsLastArg);51Testing软件测试网)SGB7e)B ih5CpuiY

// lrs_send(”socket0″, “buf0″, LrsLastArg);

2b1t#n0kN?*[_@0

// lrs_receive(”socket0″, “buf1″, LrsLastArg);

0TK8e;pIZ1V0

lrs_send(”socket1″, “buf2″, LrsLastArg);51Testing软件测试网;] S#xs w(X

// lrs_send(”socket0″, “buf3″, LrsLastArg);51Testing软件测试网S ]5D5zV Y0q

// lrs_receive(”socket0″, “buf4″, LrsLastArg);

%x(H k/L Ch0

lrs_receive(”socket1″, “buf5″, LrsLastArg);

`VP#i+~v'Lp0

lrs_send(”socket0″, “buf6″, LrsLastArg);51Testing软件测试网*B.j.}{x

[翻译]LoadRunnerWinsock协议(三)51Testing软件测试网X9cLn{%SqR

F v\"c YW7Lkk0
 创建脚本步骤:51Testing软件测试网?2dY0Ij*B9U)iYo

1. VuGen录制脚本51Testing软件测试网T2X,v+?2}yCG

2.增强脚本51Testing软件测试网%K"^P6eV)eC e

3.参数化51Testing软件测试网 Aaa|2I)F-jK

4.关联脚本

rK6]z @I&sj9n$X0

5.设置运行参数51Testing软件测试网 f!E!l3vGI#Z4fw

6.运行脚本

3k$R [Q7rhV%|*x0

1. VuGen录制脚本51Testing软件测试网 c&A!nC-W;MO/k,U

按照之前章节说的步骤创建脚本,录下来的就是基本脚本,可以先把buffer注释掉。

5Jq`Q!ZK!i],t0

练习:51Testing软件测试网'S5Cde}OmvA

创 建一个简单的winsock脚本,可以选择MI公司的网站,把录下来的脚本命名为winsocket_1,再用Http协议方式创建一个Web脚本,把脚 本保存为WebWinsock_1.请不要更改session_id把两种脚本比较,当你登陆的时候,可以收到一个“welcomejojo….”的消 息。既然所有的消息都放在data.ws文件里,那么data.ws里面应该能找到这条消息。51Testing软件测试网4wfBM6X P{,?LG

1.1)在几号bufffer里面包含“welcomejojo”?怎样判断这是收到的帧而不是发出的帧?还有着个字符串正如显示的那样或者他是html的一个标签。

PFB~0z!_.Z0

仔 细查看脚本,在data.ws文件中寻找MSO=SIDxxxxxxxxxXXXXXX9位数的号码 ,他表示自从January 1 st,1970以来流逝的所有的秒时间,cookiesession_id都是根据时间来生成的,所以脚本里面的9位数也就直接和脚本运行时间挂钩,所 以我们要把这个数改成我们每次运行脚本的确切时间,首先把这个值更换成参数,在c里面有一个Time()的函数。他返回的就是自从January 1 st,1970以来流逝的所有的秒时间,在脚本的开始用这个函数获取时间值,然后把刚才创建的参数指向这个值。然后在data.ws里面替换所有的id, 这样每次脚本运行都能获得正确的id

h4c:a!L_'Bd!D ]0

1.2)把修改了参数的脚本运行一遍,在脚本的运行日志里面寻找”incorrectly”。会找到”You’ve reached this page incorrectly”这条消息,运行web脚本也会发现类似的消息。其中发生了什么呢?51Testing软件测试网II)MR+a#l x&@e+O&f

注 意:在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函数来设定超时时间。

QY#J+}h5i;N\`0

那么反面一种情况是,你不想接受所有的数据包,只是想收到包的前100bytes,可以通过函数ltr_receive_ex来任意设定想要收到的字节。51Testing软件测试网6W)U7F {0wiH

2.增强脚本51Testing软件测试网_5j7|[5FrT;~4w

在脚本中添加事务,集合点和控制语句等增强脚本,和web脚本不同的是winsock脚本可读性很差,所以要在录制脚本时添加注释,事务和集合点等。如果在脚本中有逻辑需求,那么插入逻辑语句(通用声明不适应Winsock_1脚本).

o q/VB{ C@ r0

3.脚本参数化51Testing软件测试网B.p Id(M8{!U*E

把脚本中变化的值参数化,只要用参数把这些值替换掉就可以,使用不同参数重复业务流程,例如在上面的例子里面jojo/bean就可以参数化成为userIDs/passwords51Testing软件测试网7Hl @S.Q

4.关联脚本51Testing软件测试网DK\&|8w Q(n

关 联目的是为了让你在一个并发中用到一个商业流程的结果,在web脚本中有这样的过程,从web脚本中sessionid关系到后面的流程能不能运 行,winsock脚本有同样的问题。所以需要捕获到session id然后把它关联起来,举个例子从下面的脚本中获取PIDlr函数的例子):

TflG c9C8`Wp1l0

“\r”

~I(i?tv0

“\x0 blah blah blah “

,G'ypl0tkE9x8q0

“\r\n blah blah blah “

]J ]d-]]:d7_ s0

“PID TT STAT TIME COMMAND\r\n PID 28469 q2″51Testing软件测试网2gw!};P8s

” S 0:01 -tcsh (tcsh)\r\n”51Testing软件测试网!{7A`,Ty h)j

在一个典型的web脚本中,你用web_create_html_param函数,用“PID““q2”定义边界扑获数据。51Testing软件测试网{d1f t'{*e whW

Winsock脚本中,用lrs_save_param函数从静态数据或收到的数据包中截获数据,看下面的例子:51Testing软件测试网.J$hB]~ q*C){

lrs_receive(”socket2″, “buf47″, LrsLastArg);

m m8Crw(k)D0

lrs_save_param(”socket2″, NULL, “param1″, 67, 5);

?`y-|_-XZ9T7oJ0

web_create_html_param函数不同的是lrs_save_param在请求之后进行,这个例子中,第一行代码是接收到47号包。lrs_save_param函数的参数意义如下:

,@7v)@'{$GO0

socket2:socket2中扑获数据51Testing软件测试网&w5P"o8`B"La

NULL: null参数意思是从最后一个buffer里截取,在这儿就是指buf47,如果你从其它的buf里面来获取数据,则你必须要指明buf的号码了

1Y xgB^0

param1:命名的参数值51Testing软件测试网@/A uV6XhH0ySRF

67:位移(下面截解释)51Testing软件测试网z~~2jGPf'y:U

5:捕获的长度51Testing软件测试网m\}.f P&w\

位移:从buffer的开始多少位去捕获参数的值,在下面的例子里面,PID是从buf47开始往后67bytes来截取的,我们怎么确定这个值?

J'~S6o1t*f E'm:{0

data.ws中选取需要截取参数的地方然后按F7键,这样会弹出一个窗体。如下图:51Testing软件测试网0W-z Sv2_X(T5|

在左边的列,你将看到符合这部分数据的偏移量,中间四行是用EBCDIC加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含PID的真实的数据,,很容易就可以根据64+3得出位偏移为6751Testing软件测试网d_&]3C]6N

(现在我们解释一下问什么添加这些多余的东西到数据包中,让它适合我的例子呢?)

*wj:J.}{O F&U0

注意:在socket脚本中没有提供web_find函数。只有通过编程来找到你要截取的脚本。

N y-?%s9y7b!`dHgAO0

5run-time的设置

Kh,O CE'A3j0

配置Run-Time可以控制脚本运行过程中的虚拟用户行为,包括looplogTime信息等设置51Testing软件测试网S.r-F0IgvV

6VuGen运行脚本.

oR2n s u`ZVUy5a$X0

保存并用VuGen运行脚本验证脚本是否正确

sc"[&A+b;s,|/g0

搞定WinSock!51Testing软件测试网Xk6g'c+}]j

 

Q*X)@0t+DB%P0

TAG: socket Socket Winsocket winsocket

ontheroad的个人空间 引用 删除 ontheroad   /   2016-06-28 10:46:44
5
 

评分:0

我来说两句

luoriver

luoriver

北漂一族,80后,计算机专业,从事SIP相关软件测试3年,热爱生活,崇尚运动。 爱看WWE、公开课。爱钻“牛角尖”,这就是我:luorivr!!!!!

日历

« 2024-05-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 346106
  • 日志数: 96
  • 图片数: 1
  • 建立时间: 2012-12-27
  • 更新时间: 2014-05-03

RSS订阅

Open Toolbar