利用LoadRunner編寫socket性能測試腳本

1、概述
   Loadrunner擁有極爲豐富的工具箱,供予咱們製造出各類奇妙魔法的能力。其中就有這次要討論的socket套接字操做。
   2、socket概述
  socket是 操做系統中I/O系統的網絡延伸部分,它擴展了操做系統的基本I/O到網絡通訊,使進程和機器之間的通訊成爲可能。若是想徹底地理解socket在Loadrunner中如何 工做的,熟悉一些關於它的歷史會頗有幫助。
 當前經常使用的socket,最先起源於BSD UNIX類的操做系統。在UNIX系統上,好比BSD,把對網絡的支持加入操做系統,以一種擴展示有文件描述符(後注)結構的方法來實現的。Socket 能夠被當作一個標準的文件描述符。在 UNIX 類的平臺上,其中包括open()、read()、write()和close()。不少時間,程序並不須要知道它正在把數據寫進一個文件、終端、或是一 個TCP鏈接。
  系統調用被加入並和socket一塊兒工做,而不少現有的系統調用一樣能和socket一塊兒工做。所以,一個socket容許您使用標準的操做系統和其餘的計算機,以及您本身機器上的不一樣進程來通訊。
 然而,socket的確存在一些不一樣工做方式。最明顯地就是創建socket的方法。不少文件是經過調用open()函數來打開的,但socket是通 過調用socket()函數來創建的,而且還須要另外的調用來鏈接和激活他們。recv()和send()這兩個系統調用和read()和write() 極爲類似。
  Socket是一套創建在TCP/IP協議上的接口不是一個協議,只要底層實現TCP IP協議,均可以用socket進行通訊。
  應用層:  HTTP  FTP  SMTP  Web
  傳輸層:  在兩個應用程序之間提供了邏輯而不是物理的通訊基於流的TCP和基於數據包的UDP
  文件描述符通常是指一個文件或某個相似文件的實體。內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也須要使用文件描述符來指定待讀寫的文件。
 文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核爲每個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者建立一 個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫每每會圍繞着文件描述符展開。可是文件描述符這一律念每每只適用於 UNIX、 Linux這樣的操做系統。
   3、SOCKET鏈接過程
  根據鏈接啓動的方式以及本地套接字要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。
  服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態。
  客戶端請求:是指由客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求。
 鏈接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求,它就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描述發 給客戶端,一旦客戶端確認了此描述,鏈接就創建好了。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。
  4、開發原理
  服務器:使用ServerSocket監聽指定的端口,端口能夠隨意指定(因爲1024如下的端口一般屬於保留端口,在一些操做系統中不能夠隨意使用,因此建議使用大於1024的端口),等待客戶鏈接請求,客戶鏈接後,會話產生;在完成會話後,關閉鏈接。
  客戶端:使用Socket對網絡上某一個服務器的某一個端口發出鏈接請求,一旦鏈接成功,打開會話;會話完成後,關閉Socket。客戶端不須要指定打開的端口,一般臨時的、動態的分配一個1024以上的端口。
 Socket接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程序員能夠用它們來開發TCP/IP網絡上的應用程序。要學 Internet上的TCP/IP網絡編程,必須理解Socket接口。Socket接口設計者最早是將接口放在Unix操做系統裏面的。若是瞭解 Unix系統的輸入和輸出的話,就很容易瞭解Socket了。網絡的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。 Socket也具備一個相似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的鏈接創建、數據傳輸等操做都是經過該 Socket實現的。
   5、Loadrunner中socket相關函數淺析
  Loadrunner對於腳本函數有一份幫助文檔。利用好此文檔,其實對於 性能測試所需腳本就已足以。
 當咱們打開Create/Edit Scripts,並打開腳本錄製頁面時,摁下F1即可打開《HP LoadRunner Online Function Reference》。在這幫助文檔中找到「鍵入關鍵字進行查找」輸入框。利用它查找咱們所需的socket函數了。
  幾乎全部關於socket的函數,都是以lrs開頭的。
基本操做函數:
lrs_startup 初始化 WinSock DLL
lrs_create_socket 初始化套接字
lrs_send 在數據報上(UDP)或者向流套接字(TCP)發送數據
lrs_receive 接收來自數據報或流套接字的數據
lrs_disable_socket 禁用套接字操做
lrs_close_socket 關閉打開的套接字
lrs_cleanup 終止 WinSock DLL 的使用,回收相關資源。VuGen 在 Windows 上使用 Windows 套接字協議支持應用程序的錄製和回放;而在UNIX 平臺上僅支持回放
lrs_accept_connection 接受偵聽套接字鏈接
lrs_close_socket 關閉打開的套接字
lrs_create_socket 初始化套接字
lrs_disable_socket 禁用套接字操做
lrs_exclude_socket 重播期間排除套接字
lrs_get_socket_attrib 獲取套接字屬性
lrs_get_socket_handler 獲取指定套接字的套接字處理程序
lrs_length_receive 接收來自指定長度的緩衝區的數據
lrs_receive 接收來自套接字的數據
lrs_receive_ex 接收來自數據報或流套接字的數據(具備特定長度)
lrs_send 將數據發送到數據報上或流套接字中
lrs_set_receive_option 設置套接字接收選項
lrs_set_socket_handler 設置特定套接字的套接字處理程序
lrs_set_socket_options 設置套接字選項
   緩衝區函數:
lrs_free_buffer 釋放分配給緩衝區的內存
lrs_get_buffer_by_name 從數據文件中獲取緩衝區及其大小
lrs_get_last_received_buffer 獲取套接字上接收到的最後的緩衝區及其大小
lrs_get_last_received_buffer_size 獲取套接字上接收到的最後一個緩衝區的大小
lrs_get_received_buffer 獲取最後接收到的緩衝區或其一部分
lrs_get_static_buffer 獲取靜態緩衝區或其一部分
lrs_get_user_buffer 獲取套接字的用戶數據的內容
lrs_get_user_buffer_size 獲取套接字的用戶數據的大小
lrs_set_send_buffer 指定要在套接字上發送的緩衝區
   環境函數:
  lrs_cleanup 終止Windows套接字 DLL 的使用
  lrs_startup 初始化 Windows 套接字 DLL
   關聯語句函數:
  lrs_save_param 將靜態或接收到的緩衝區(或緩衝區部分)保存到參數中
  lrs_save_param_ex 將用戶、靜態或接收到的緩衝區(或緩衝區部分)保存到參數中
  lrs_save_searched_string 在靜態或接收到的緩衝區中搜索出現的字符串,將出現字符串的緩衝區部分保存到參數中
  轉換函數
  lrs_ascii_to_ebcdic 將緩衝區數據從 ASCII 格式轉換成 EBCDIC 格式
  lrs_decimal_to_hex_string 將十進制整數轉換爲十六進制字符串
  lrs_ebcdic_to_ascii 將緩衝區數據從 EBCDIC 格式轉換成ASCII 格式
  lrs_hex_string_to_int 將十六進制字符串轉換爲整數
   超時函數:(這一堆函數,是能夠對同一個socket生效的)
  lrs_set_accept_timeout 爲接受套接字設置超時
  lrs_set_connect_timeout 爲鏈接到套接字設置超時
  lrs_set_recv_timeout 執行lrs_receive命令後,等待服務器返回消息的超時時間,即服務器的響應時間。
  lrs_set_recv_timeout2 建立鏈接成功,接收到服務器返回的消息後,獲取匹配消息的超時時間。lrs_receive接收到數據後,會和預期的數據長度進行比較,若是長度不匹配,它將從新從套接字上讀取數據,直到超時爲止。
  lrs_set_send_timeout 爲發送套接字數據設置超時
   6、實戰講解
  在此只作簡單的知識普及,便於快速上手編寫socket測試腳本。簡述建立鏈接,收發協議,關閉鏈接的過程。
  初始化
//存放通訊返回報文
char * ActualBuffer="";
//存放返回報文長度,切記附初值
int numberOfResponse = -1;
//連接是否建立成功,判斷值
int rc = 0;
//返回報文是否成功,判斷值
int msgOk=-1;
//存放返回報文
char * position="";
//返回報文是否成功標識
char * passMsg="succee";
  服務器監聽
//--------------建立鏈接-----------------
rc= lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=<RemoteHost>", LrsLastArg);
if (rc==0){
//判斷鏈接是否建立成功
lr_output_message("Socket was successfully created ");
}
else{
lr_output_message("An error occurred while creating the socket, Error Code: %d", rc);
}
//--------------建立鏈接-----------------
   收發協議
lrs_send("socket0", "buf0", LrsLastArg);
//往「socket0」發送"buf0"
lrs_set_receive_option(EndMarker, BinaryStringTerminator, "</html>");
//設置接收協議包選項,注"</html>"以實際定義協議爲準,若是不設置次項。執行到lrs_receive的時候,log裏面打印Waiting for writable socket 10
//secs, 0 usecs,都須要等待10秒鐘。是這樣的,由於你在data.ws中定義了recv buffer的長度,例如你定義爲100,可是socket上的返回buffer長度不
//是100,這時候,loadrunner會嘗試再次去讀取,直到讀到長度爲100的buffer纔算成功。
lrs_receive("socket0", "buf1","Flags=MSG_PEEK ", LrsLastArg);
//將「socket0」中返回的數據存放到「buf1」中
   參數配置
  可能細心的同窗已經發現了,buf0與buf1是從哪裏來的。其實這倆兄弟是在data.ws中被定義的,以下所示:
  ;WSRData 2 1
  send buf0 5120
  "<參數化>"
  recv buf1 1024
  -1
  5120:此數值爲socket協議傳輸內容長度,切記嚴格輸入正確長度值。
  "<參數化>":爲buf0所傳輸內容。相對於loadrunner的http協議參數用{}來講,socket協議參數化採用<>做爲定義符。
  接收參數判斷
  在作了接收以後,咱們須要提取「buf1」中的某些關鍵字符做爲通訊成功標識。
//獲取套接字上接收到的最後的緩衝區及其大小
lrs_get_last_received_buffer("socket0",&ActualBuffer,&numberOfResponse);
//查詢返回報文是否成功
position = (char *)strstr(ActualBuffer, passMsg);
// strstr has returned the address. Now calculate * the offset from the beginning of str
msgOk = (int)(position - ActualBuffer + 1);
if(msgOk>0){
lr_end_transaction("核心對私維護", LR_PASS);
lr_output_message("本次交易:%s",ActualBuffer);
}
else{
lr_end_transaction("核心對私維護", LR_FAIL);
lr_error_message("本次交易:%s",ActualBuffer);
}
關閉鏈接
//--------------斷開socket--------------
lrs_disable_socket("socket0", DISABLE_SEND_RECV);
//--------------關閉socket--------------
lrs_close_socket("socket0");
   6、總結
  簡要描述了利用Loadrunner編寫socket性能測試腳本的過程,若有錯漏,請予以指正。
相關文章
相關標籤/搜索