LoadRunner與Winsock協議[翻譯]

LoadRunner與Winsock協議[翻譯]
 
文章出處:51testing博客 作者:charmer 發佈時間:2006-12-08
 

[翻譯]LoadRunner與Winsock協議(一)在開始討論winsocket解決方案之前,我們先討論一下各種協議是如何工作.從前面的簡介可以瞭解到很多的高級協議,例如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協議的,所以這個例子並無具體的意義,只是爲了使例子簡單。

[翻譯]LoadRunner與Winsock協議(二)
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”

“ 

    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);

[翻譯]LoadRunner與Winsock協議(三)
創建腳本步驟:

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!

原始鏈接:http://blog.51testing.com/?49159/action_viewspace_itemid_875.html

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章