lr12 websocket


loadrunner12以上版本支持websocket,在http/html協議錄制時可以直接錄制websocket相關內容信息。

網上找的一個測試websocket網址:http://www.blue-zero.com/WebSocket/,在線websocket測試地址。以這個地址來學習。

  

錄制時注意事項:

1)選擇協議開始錄制,步驟:打開網址-》點擊連接-》輸入數據1,發送-》輸入數據2,發送-》斷開連接

2)錄制過程中建立連接后一直等待服務器返回應答,未返回建立連接數據。此時,連接為黑色,表示在連接狀態。此時,可隨意發送數據,斷開連接后,右側欄中會顯示全部的與服務器交互信息。

 錄制完腳本:

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;
}
View Code

 

腳本結構:

WebSocketBuffer.h

個人理解:這個文件是記錄的錄制過程中與服務器交互歷次交互信息。

注意這里顯示的值是錄制過程中的,比如發送數據包含wait100,對應receive中也會包含此值。並不是實際運行時,顯示的服務器返回值。

問題:腳本參數化時要將這里的值,也做參數化么?

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

}
View Code

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);
}
View Code

 

錄制完的腳本將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接口性能測試方法

 

 

 


 

參考資料:

1、loadrunner錄制websocket

2、http://community.hpe.com/t5/LoadRunner-and-Performance/Async-Communications-The-WebSocket-protocol-made-easy-in/ba-p/6469242#.V7EogLh95hH

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM