loadrunner12以上版本支持websocket,在http/html協議錄製時能夠直接錄製websocket相關內容信息。html
網上找的一個測試websocket網址:http://www.blue-zero.com/WebSocket/,在線websocket測試地址。以這個地址來學習。web
錄製時注意事項:express
1)選擇協議開始錄製,步驟:打開網址-》點擊鏈接-》輸入數據1,發送-》輸入數據2,發送-》斷開鏈接服務器
2)錄製過程當中創建鏈接後一直等待服務器返回應答,未返回創建鏈接數據。此時,鏈接爲黑色,表示在鏈接狀態。此時,可隨意發送數據,斷開鏈接後,右側欄中會顯示所有的與服務器交互信息。websocket
錄製完腳本:cookie
Action() { web_add_cookie("user=7; DOMAIN=www.blue-zero.com"); web_url("WebSocket", "URL=http://www.blue-zero.com/WebSocket/", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t18.inf", "Mode=HTML", EXTRARES, "Url=PLUG/WebSocketMain.swf", ENDITEM, "Url=http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f2/wg_thumb.gif", ENDITEM, LAST); web_custom_request("q.cgi", "URL=http://masterconn.qq.com/q.cgi", "Method=POST", "Resource=1", "Referer=", "Snapshot=t19.inf", "EncType=", "BodyBinary=\\x00\\x02\\x01@\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\xE2\\x00\\x00\\x07\\xDA\\x00\\x00\\x00\\x00\\x08;\\xA4\n\\xA4,\\xD5\\xB4d\\x92@\\x9A8V3\r\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\t\\x95\\xD41\\x95s\\xD9\\xF5Cc\\xCD\\xD5V\\xDD5\\x96\\x1ED\\xFDk5)\\x15T\\x9Ed\\xECvt\\xDC\\x04\\xDE&\\xF2\\xA5\\xBE\\xCB\\xEC\\xAD\\x0BH\\xF2+\\xF7Y\\xEA\\xE5," "\\x02\\xCF\\xB2\\xA5\\x1D\\xF5\\xD5Gy\\xE7\\x1E<\\xE3\\xDE\\xB2y\\xB2\\xCA\r\\xAD\\xCA\\xCFk\\x1E\\xB5\\xF0l\\xC0T\\xA0\\x88\\xCB\\xBE\\xF2\\x1B\\xBAs\\x01\\x8C\\xD5\\xA9\\xDD\\xF34NJ\\x92\\xA4\\x85\\xA4V5q*\\x16Q_\\\\\\x86\\x02>\\xE1\\x95\\xF0=\\x02^\\xA5\\xE4U\\x83y\\x99\\x84>\\xBD%-\\xA1\\x9C\\xFE\\xB6S\\x0E\\x1AZi\\x8C\\xF5v\\x1F\\xD1\\xF1A\\x9C\\xD6\\xDD\\xC3p\\xC9\t\\xAF\\xB4\\x1D,D\\xA6\\xF5U\\x05\\xCD\\xC4\\x1E", LAST); web_url("glyphicons-halflings-regular.eot", "URL=http://www.blue-zero.com/WebSocket/CSS/FONTS/glyphicons-halflings-regular.eot?", "Resource=0", "RecContentType=text/html", "Referer=http://www.blue-zero.com/WebSocket/", "Snapshot=t20.inf", "Mode=HTML", EXTRARES, "Url=http://www.bing.com/favicon.ico", "Referer=", ENDITEM, LAST); lr_think_time(8); web_url("favicon.ico", "URL=http://www.blue-zero.com/favicon.ico", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t21.inf", "Mode=HTML", LAST); lr_think_time(15); web_websocket_connect("ID=0", "URI=ws://121.40.165.18:8088/", "Origin=http://www.blue-zero.com", "OnOpenCB=OnOpenCB0", "OnMessageCB=OnMessageCB0", "OnErrorCB=OnErrorCB0", "OnCloseCB=OnCloseCB0", LAST); web_websocket_send("ID=0", "Buffer=#ah#8", "IsBinary=0", LAST); /*Connection ID 0 received buffer WebSocketReceive0*/ lr_think_time(16); //input value : wait100 web_websocket_send("ID=0", "Buffer=wait100#ah#8", "IsBinary=0", LAST); /*Connection ID 0 received buffer WebSocketReceive1*/ lr_think_time(11); //input value :let me see web_websocket_send("ID=0", "Buffer=let me see#ah#8", "IsBinary=0", LAST); /*Connection ID 0 received buffer WebSocketReceive2*/ web_websocket_close("ID=0", "Code=1000", LAST); return 0; }
腳本結構:session
WebSocketBuffer.happ
我的理解:這個文件是記錄的錄製過程當中與服務器交互歷次交互信息。socket
注意這裏顯示的值是錄製過程當中的,好比發送數據包含wait100,對應receive中也會包含此值。並非實際運行時,顯示的服務器返回值。ide
問題:腳本參數化時要將這裏的值,也作參數化麼?
WebSocketCB.c
這裏有幾個重要的事件,OnOpenCB0、OnErrorCB0、OnMessageCB0、OnCloseCB0。在哪用?查看腳本中的創建鏈接的函數。
每件事件默認的觸發信息都被註釋掉了。固然,這裏能夠將其取消註釋,也能夠根據實際需求編寫。
1)好比,OnMessageCB0事件中只輸出了connectionID與長度,若是想查看該事件返回值,則把data值也輸出。
2)好比,OnMessageCB0事件,在文中有示例說明,有心跳及服務器返回值處理,像保存成一個新參數,對結果成功與否判斷處理等。
文中示例:
void OnMessageCB0 ( const char* connectionID, int isbinary, const char * data, int length) { int isactivesession; int isheartbeat; int isupdate; lr_output_message("WebSocket ID = %s got message=%s length = %d, ", connectionID, data, length); isactivesession = strncmp(data,"5:::{\"name\":\"message\"",21); isupdate = strncmp(data,"5:::{\"name\":\"update\"",20); isheartbeat = strncmp(data,"2::",3); if(isheartbeat==0) { lr_user_data_point("Heartbeat message",1); web_websocket_send("ID=0","Buffer=2::","IsBinary=false",LAST); lr_output_message("WebSocket ID = %s heartbeat message sent back", connectionID); } if(isactivesession==0) { lr_save_param_regexp ( data, length, "RegExp=5:::{\"name\":\"message\",\"args\":.(.+).}", "ResultParam=myActiveSessions", LAST ); lr_user_data_point_ex("Active Sessions", atoi(lr_eval_string("{myActiveSessions}"))-1, DP_FLAGS_EXTENDED_LOG); lr_output_message(">>>> got visits counter!!!"); } if(isupdate==0) { lr_save_param_regexp ( data, length, "RegExp=LoadRunner\\\\\",\\\\\"Price\\\\\":([0-9]*\.?[0-9]+)},{", "ResultParam=myLRPrice", LAST ); lr_user_data_point_ex("LoadRunner price", atof(lr_eval_string("{myLRPrice}")), DP_FLAGS_EXTENDED_LOG); lr_output_message(">>>> got price update!!!"); } if (counter++ > 10) lr_save_string("OK","ready"); }
LR中默認的WebSocketCB.c
void OnOpenCB0 (const char* connectionID, const char * AccumulatedHeadersStr, int AccumulatedHeadersLen) { // lr_output_message("WebSocket ID = %s connected", connectionID); // lr_save_param_regexp (AccumulatedHeadersStr, // AccumulatedHeadersLen, // "RegExp=Sec-WebSocket-Accept: (.+)\\r\\n", // "ResultParam=Accept", // LAST ); // lr_output_message("Sec-WebSocket-Accept = [%s]", // lr_eval_string("{Accept}")); } void OnMessageCB0 (const char* connectionID, int isbinary, const char * data, int length) { // if (isbinary) { // lr_output_message("WebSocket ID = %s. [%d] bytes binary message received.", connectionID, length); // } // else { // lr_output_message("WebSocket ID = %s. [%d] bytes text message received.", connectionID, length); // } } void OnErrorCB0 (const char* connectionID, const char * message, int length) { // lr_output_message("WebSocket ID = %s error occured. Error message = %s", connectionID, message); } void OnCloseCB0 (const char* connectionID, int isClosedByClient, int code, const char* reason, int length) { // lr_output_message("WebSocket ID = %s closed. CloseCode= %d, CloseReason=%s", connectionID, code, reason); }
錄製完的腳本將WebSocketCB.c中註釋取取消,直接執行腳本,提示鏈接未成功,觸發OnErrorCB0提示。這多是測試服務器的事。
Action
由於是基於http協議錄製的,因此大部分仍是常見的信息。只是多個幾個websocket函數。從LR幫助手冊裏,能夠搜到這三個函數。
三個函數實現鏈接請求、發送數據、關閉請求。
web_websocket_connect("ID=0",
"URI=ws://121.40.165.18:8088/",
"Origin=http://www.blue-zero.com",
"OnOpenCB=OnOpenCB0",
"OnMessageCB=OnMessageCB0",
"OnErrorCB=OnErrorCB0",
"OnCloseCB=OnCloseCB0",
LAST);
This function creates a WebSocket connection upon which to send the message.
Headers that were detected during recording will be generated automatically, except for SecWebSocketKey. To add additional headers to the handshake request, place web_add_header or web_add_cookie steps before this function.
Callbacks will be generated with the default implementation commented out. For a description of the callback functions, see WebSocket Callback Functions.
LR幫助裏關於三個函數的示例:
Action()
{
web_websocket_connect("ID=0", "URI=ws://pumpkin:9876/", "Origin=http://pumpkin:9876", "OnOpenCB=OnOpenCB0", "OnMessageCB=OnMessageCB0", "OnErrorCB=OnErrorCB0", "OnCloseCB=OnCloseCB0", LAST);
web_websocket_send("ID=0", "Buffer=sample text message", "IsBinary=0", LAST);
web_websocket_send("ID=0", "Buffer/File={myfile}", "IsBinary=0", LAST);
/*Connection ID 0 received buffer WebSocketReceive0*/
lr_think_time(7);
web_websocket_close("ID=0", "Code=1000", "Reason=OK", LAST);
return 0;
}
創建鏈接後,發送數據,對於數據作參數化等操做就能夠了。
對於websocket接口類型的測試,固然使用jmeter工具也能夠。參考文章:Websocket接口性能測試方法
參考資料: