1. 程式人生 > >淺析 LoadRunner的Socket指令碼關聯小技巧

淺析 LoadRunner的Socket指令碼關聯小技巧

我們在socket指令碼除錯的時候經常會遇到很多問題,比如:socket包中繁雜的二進位制編碼,socket資料如何進行擷取,如何對socket資料包進行引數化等等,以下幾點內容是近期我在除錯新加坡MTL專案中socket程式碼的一些經驗,希望對各位以後進行socket指令碼除錯時能有所幫助。

此次MTL專案中的SE評測場景,其實與愛吼網的評測場景比較接近,對於此類專案的效能測試,通過HTTP協議時無法完成的,我們只有通過Socket指令碼來實現。

在做效能測試的時候,“關聯”是必不可少的,在WEB系統中,我經常採用LR函式:web_reg_save_param()來完成,但web型別的函式在Socket協議中是無法使用的,那麼我們怎麼來進行Socket協議的關聯呢?

1. 查詢關聯資料

在Socket錄製協議的指令碼“action”中是看不到客戶端所傳送的資料的,所有客戶端與服務端互動的資料,都儲存在data.ws中:

wKioL1UjHwuwb7ZnAAETL7NR2do718.jpg

   那麼,我們必須要在data.ws中找到我們需要關聯的資料,根據系統設計,SE評測傳送音訊資料時,服務端會先返回給客戶端一個Evalinstance,這是一個表示評測例項的ID,後面在進行音訊資料傳輸的時候,需要帶上這個ID,那麼我們先搜尋一下這個ID:

wKiom1UjHdCgFvHpAAES3qa8ufg352.jpg

     在buf3中,我們發現了這個Evalinstance。(recv代表的接受的包,send代表的是傳送包)

我們需要儲存這個ID,以便後面傳送音訊資料使用。

2. 儲存關聯資料

在buf3中,我們找到了我們所需要的資料,如何儲存?

回到action中,找到lrs_receive("socket0", "buf3", LrsLastArg);語句,這條語句表示客戶端接受buf3資料包,而資料包的內容就是我們剛才在data.ws中看到的內容。在這條語句時候,我們需要新增函式進行資料儲存:

lrs_save_searched_string("socket0", NULL, "evalid", "LB=SimpleEngineTest/", "RB=\"", 1,0,-1);

這個函式的用法基本與web_reg_save_param()類似,一樣是通過左右邊界來進行資料查詢,函式的8個引數依次代表:“socket執行緒名”、“buf名稱”(這裡傳NULL表示從上面一個buf取值)、“引數名稱”(需要將資料儲存的引數名稱)、“左邊界”、“右邊界”、“第幾次出現”、“位移的數量”、“引數的長度”。執行緒名和buf名一定不可以傳錯,最後三個資料只要傳(1 , 0,-1)就可以了。

在socket協議中,關聯資料儲存也可以用函式lrs_save_param(),這裡不作說明,每個函式都其優點,適當的時候也可以採用。需要注意的是web_reg_save_param()需要放在請求之前,lrs_save_searched_string()是放在接受之後。

wKioL1UjHumRQoXDAACVtRX9cbY299.jpg

3. 引數替換

儲存引數之後,我們需要對data.ws中傳送的資料包,進行下全域性替換,將用到Evalinstance的地方全部替換成 “evalid”引數:

wKiom1UjHa-wWr3MAAJMLyu1GWA754.jpg

socket包中,引數需要用“<>”來表示。

最後,再介紹1個socket函式:lrs_set_receive_option()使用這個函式可以防止回放指令碼receive出現一些相關問題。

lrs_set_receive_option(EndMarker, EndMarker_None ) //讀取直到緩衝結束。

lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //讀取直到"\r\n"符號出現.你可以根據自己的接收資料的結束符修改。

lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00")讀取直到二進位制符號"\\X00"出現。

總之,Socket指令碼除錯問題比較多,也不是一兩句話說的完的,網上一些資料多是“去頭斷尾”,要麼是“藥不對症”。這裡僅是就socket的關聯給大家做個介紹,希望這篇文章對大家有所幫助,同時也希望各位將自己的一些經驗拿出來共享。