LoadRunner測試腳本編寫


一、前言
本文主要針對http接口GET和POST三種不同的請求類型來編寫腳本。
(1)application/x-www-form-urlencoded 鍵值對
(2)application/json Json串
(3)multipart/form-data 表單

二、創建腳本-http
1.通用部分
1.Create/Edit Script

 

 

2.New Script

 

 

 3.Web(HTTP/HTML)

 

 

 

 

 4.光標定位於右側腳本面板,點擊菜單Insert -> New step

 

 

 5.選擇Submit Data -> web_submit_data (根絕接口請求類型選擇)

 

 

 6.填入接口相關信息,點擊確定生成接口調用內容,然后在修改完善腳本。

 

 

 2.POST:application/x-www-form-urlencoded腳本

1.選擇Submit Data -> web_submit_data,填入接口信息

 

 

 

  2.生成腳本如下,點擊運行,根據輸出信息判斷調用成功。

 

 

 3.完善腳本

光標停留在要插入函數的位置,在INSERT菜單中,選擇new step,在列表中選擇或查找要插入的函數,根據提示填寫必要的參數;

①添加事務

{
// 定義事務
/* 通常將一個服務定義為一個事務。這樣在性能測試后事務相應時間就能看做一個服務的相應時間
事務開始函數 */
lr_start_transaction("login");

web_submit_data("login",
"Action=http://127.0.0.1:8087/hms/login.do",
"Method=POST",
"TargetFrame=",
"Referer=",
ITEMDATA,
"Name=username", "Value=nqsq", ENDITEM,
"Name=password", "Value=a", ENDITEM,
LAST);

// 事務結束函數
lr_end_transaction("login", LR_AUTO);

return 0;
}

②注冊獲取返回參數並打印

 

 

 執行后打印的內容,其中中文出現亂碼:

"0"
{"jgbm":"310120101010001","jgmc":"濂夎搐鍖哄崡妗ラ晣紺懼尯鍗敓鏈嶅姟涓績","rybm":"437","ryxm":"鍗楁ˉ紺懼尯","xb":"2","zcjgdm":"42504942400","zcrydm":"006"}
HTTP/1.1 200
Set-Cookie: JSESSIONID=1A540D4683A6BAD6D01ABA087E99B531; Path=/hms; HttpOnly
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
Access-Control-Max-Age: 86400
Access-Control-Allow-Headers: Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token
Access-Control-Allow-Credentials: true
XDomainRequestAllowed: 1
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 28 Nov 2018 14:31:15 GMT

{"status":"0","data":{"jgbm":"310120101010001","jgmc":"濂夎搐鍖哄崡妗ラ晣紺懼尯鍗敓鏈嶅姟涓績","rybm":"437","ryxm":"鍗楁ˉ紺懼尯","xb":"2","zcjgdm":"42504942400","zcrydm":"006"},"msg":"鐧誨綍鎴愬姛錛?}

③設置檢查點(注冊斷言)

以下代碼放在web_submit_data前面

/* 注冊斷言: Text=斷言內容 */
/* 該方法會判斷請求響應的內容是否包含status,如果不包含則會報錯 */
web_reg_find("Text=status",
LAST);

④處理Replay log中輸出中文亂碼問題

// 將data值從utf-8轉為gb2312格式保存在dataStr變量中,並打印
lr_convert_string_encoding(lr_eval_string("{data}"),"utf-8","gb2312","dataStr");
lr_output_message(lr_eval_string("{dataStr}"));

⑤完整內容:

Action()
{
// 定義事務
/* 通常將一個服務定義為一個事務。這樣在性能測試后事務相應時間就能看做一個服務的相應時間
事務開始函數 */
lr_start_transaction("login");

/* 注冊獲取返回參數,該方法可以配合打印返回數據,檢測數據內容 */
web_reg_save_param("status",
"LB=\"status\":",
"RB=,\"data\":",
LAST);
// 根據左邊界值【"data":】和右邊界值【,"msg":】搜索響應結果json串中data的值
web_reg_save_param("data",
"LB=\"data\":",
"RB=,\"msg\":",
LAST);
// 不指定邊界值,保存所有內容
/* web_reg_save_param("result",
"LB=",
"RB=",
LAST); */

/* 注冊斷言: Text=斷言內容 */
/* 該方法會判斷請求響應的內容是否包含status,如果不包含則會報錯 */
web_reg_find("Text=status",
LAST);

/* 向后面的web請求函數增加請求頭 */
/* 如果web請求方法中已經設置了相同的頭,則優先使用web請求方法中的頭,
例如web請求方法中的EncType參數,對應請求投中的Content-Type。
由於下面的方法已經設置了EncType參數,所以這里的設置並沒有什么X用 */
/* 表單直接使用方法自帶參數,鍵值對和json建議使用該方法 */
/* web_add_header("Content-Type",
"application/x-www-form-urlencoded; charset=utf-8"); */


/* 主要針對form表單和鍵值對兩種格式的web請求 */
web_submit_data("login",
"Action=http://127.0.0.1:8087/hms/login.do",
"Method=POST",
/* 該方法支持常見的兩種請求數據格式 */
/* (1)"EncType=multipart/form-data"。form表單提交數據 */
/* (1)"EncType=application/x-www-form-urlencoded"。默認使用鍵值對提交數據 */
//"EncType=",
"TargetFrame=",
"Referer=",
ITEMDATA,
"Name=username", "Value=nqsq", ENDITEM,
"Name=password", "Value=a", ENDITEM,
LAST);

/* 打印相應結果 */
/* lr_eval_string("{result}") 使用loadrunner引用外部函數,
只有這樣才能取出上面web_reg_save_param方法的返回值 */
lr_log_message(lr_eval_string("{status}"));
lr_log_message(lr_eval_string("{data}"));
// 查看搜索的所有內容
// lr_log_message(lr_eval_string("{result}"));

// 將data值從utf-8轉為gb2312格式保存在dataStr變量中,並打印
lr_convert_string_encoding(lr_eval_string("{data}"),"utf-8","gb2312","dataStr");
lr_output_message(lr_eval_string("{dataStr}"));

// 事務結束函數
lr_end_transaction("login", LR_AUTO);

return 0;
}

3.POST:application/json腳本

Action()
{   lr_think_time(1);
    lr_start_transaction("發卡交易");


    web_reg_save_param(
        "Result",
        "LB=H_ret_code\": \"",
        "RB=\"",
        LAST);

    web_custom_request("web_custom_request",
        "URL=http://81.1.53.23:9324",    //81.1.53.23   81.1.159.14
        "Method=POST",
        "EncType=application/json",
        "Resource=0",
        "Body={mac}{\"boxnum\":\"card1\",\"cust_flag\":\"0\",\"phone\":\"18087962361\",\"worktype\":\"0\",\"nation\":\"156\",\"idbirth\":\"1990-11-07\",\"idlosdate\":\"20170823\",\"card_productcode\":\"1201110010\",\"card_pwd\":\"78B93A6C9DB59FADD762A62F26F48C99\",\"idtype\":\"0\",\"idno\":\"130429199011070018\",\"cust_addr\":\"河北省邯鄲市永年縣臨洺關鎮西大街西馬道  46號\",\"workname\":\"IMS.ZNWD_002.zpk\",\"M_CustomerNo\":\"11\",\"M_PackageType\":\"JSON\",\"M_ServicerNo\":\"IBP\",\"M_ServiceCode\":\"ibp.tsf.t003.01\",\"M_MesgSndDate\":\"20170316\",\"M_MesgSndTime\":\"183917\",\"M_MesgId\":\"05ed61f7-f27e-438f-bf21-288f63646647\",\"M_MesgPriority\":\"3\",\"M_Direction\":\"1\",\"M_CallMethod\":\"1\",\"channelcode\":\"SS050200\",\"menu_code\":\"B0001\",\"menu_name\":\"個人開卡1\",\"MacKeyName\":\"IMS.ZNWD_002.zak\",\"devicetype\":\"11\",\"channeldate\":\"20170316\",\"channeltime\":\"183917\",\"channelserno\":\"20170316183917370\",\"device_num\":\"1\",\"deviceno\":\"1\",\"device_oid\":\"563ec9b1831eb623c9bcab33e15ad1db\",\"brno\":\"{jgh}\",\"teller\":\"{usercode}\",\"tellerno\":\"050017\",\"accountNo\":\"6231810010599000258\",\"custName\":\"高攀\",\"custinfo_type\":\"0\",\"custinfo_num\":\"130429199011070018\",\"id\":\"130429199011070018\",\"sex\":\"1\",\"auth_teller\":\"050017\",\"opencardtype\":\"1\"}",
        "Referer=",
        LAST);

    if(strcmp(lr_eval_string("{Result}"),"000000")==0)
    {
        lr_end_transaction("發卡交易", LR_PASS);
    }
    else
    {
        lr_end_transaction("發卡交易", LR_FAIL);
        lr_error_message("======Result:%s=====", lr_eval_string("{Result}"));
        lr_error_message("======mac:%s=====", lr_eval_string("{mac}"));
        
    }
 
    return 0;
}

4.POST:multipart/form-data腳本

Action()
{    
    lr_think_time(1);

    lr_start_transaction("個人不綁卡開戶");

     web_reg_save_param("Result",
    "LB=message\":\"",
        "RB=\"",
        LAST);

    web_submit_data("web_submit_data",
        "Action=http://17.8.22.58:18401/openapi/perTwoeleAuthOpenAcct",
        "Method=POST",
        "EncType=application/x-www-form-urlencoded",
        "TargetFrame=",
        "Referer=",
        "Mode=HTML",
        ITEMDATA,
        "Name=version", "Value=1.0", ENDITEM,                  
        "Name=appCode", "Value=ggb", ENDITEM,
        "Name=channelSerialNo", "Value={NewParam}", ENDITEM, 
        "Name=timestamp","Value=time(&t)",ENDITEM,   
        "Name=payload","Value={\"customerName\":\"{NewParam_4}\",\"idNo\":\"{NewParam_3}{NewParam_6}{NewParam_9}\",\"phone\":\"{NewParam_5}\",\"idType\":\"A\",\"isBearing\":\"2\",\"mapArr\":\"Wyc2MicsICczNCcsICcxMDQnLCAnNTMnLCAnNTInLCAnMTExJywgJzYwJywgJzczJywgJzY2JywgJzk3JywgJzY1JywgJzc3JywgJzc0JywgJzY4JywgJzM2JywgJzgxJywgJzg5JywgJzQxJywgJzM4JywgJzcyJywgJzExOScsICcxMDcnLCAnOTknLCAnMTAxJywgJzY3JywgJzEwMicsICczNScsICc1MCcsICcxMDknLCAnMTIyJywgJzg4JywgJzEyNicsICc0MCcsICc4NicsICc4MCcsICc5MCcsICc3OScsICc4MycsICc5NCcsICc0NycsICcxMTAnLCAnNDInLCAnNDgnLCAnMTAwJywgJzU2JywgJzQ0JywgJzc1JywgJzMzJywgJzg1JywgJzEwOCcsICc0NicsICc1NCcsICc5NScsICc2OScsICcxMjAnLCAnMzknLCAnNjQnLCAnNDUnLCAnMTEyJywgJzEyNCcsICcxMTcnLCAnNjEnLCAnMTE4JywgJzExNScsICcxMTQnLCAnNDknLCAnNjMnLCAnNzgnLCAnMTA2JywgJzExNicsICc3MCcsICc5NicsICc5MicsICc5MycsICc5MScsICcxMjMnLCAnODInLCAnNzYnLCAnMTA1JywgJzUxJywgJzQzJywgJzEyMScsICcxMjUnLCAnOTgnLCAnMTAzJywgJzU5JywgJzM3JywgJzcxJywgJzg3JywgJzExMycsICc4NCcsICc1NScsICc1OCcsICc1Nydd\",\"merchantId\":\"00001\",\"randomKey\":\"q8AF/uBJIYWwNnomR2oHt/HIgSq28X2c\",\"remark\":\"張建偉測試開戶\",\"transPass\":\"FTifAvSzcGoI7bV31ISlILtSlHKi2d5lunN6SY2iqY0C/fDTPueEqRJ59v5DIMoj7hob6HSEZ7ECzAOXMRHOEHROEdhPe5rMYJQ+iEo1ETs/Jf9fq6Ng5YiYfan2JNpAYWsort/N4l8dGVPa64lEpJLY8f31Wu881GooRCJmmqEbwblXW8QIjqYJ8UMp/04kVRjAeI9YM8Ky3ItMcAUHGFlKji7B03n28XAnBvJXYmQzVmFNRS+rocUhyKNL4LZjcVkYTAu3M7wYRttQFn116g==\"}", ENDITEM, 
        LAST);


     lr_convert_string_encoding(lr_eval_string("{Result}"),"UTF-8",NULL,"utf8_result");

    if(strcmp(lr_eval_string("{Result}"),"ok")==0){
        lr_end_transaction("個人不綁卡開戶",LR_PASS);
        
    }
    else{
        lr_end_transaction("個人不綁卡開戶",LR_FAIL);
        lr_error_message("======Result:%s=====",lr_eval_string("{utf8_result}"));
    }

    return 0;
}

5.GET腳本

web_custom_request("JYKS01",
"URL=http://{url}/nethisService.do?action=nethisCommonBusiness&businessCode={businessCode}&businessInfo={businessInfo}",
"Method=GET",
"TargetFrame=",
"Resource=0", // 指示URL是否屬於資源
"Referer=",
LAST);

參數businessInfo需要傳utf-8編碼后的參數值。

如何傳編碼前的參數值並且設置編碼格式待研究。

三、函數詳解
1.lr_start_transaction/lr_end_transaction事務組合

lr_start_transaction為事物開始函數,lr_end_transaction為事物結束函數,並負責記錄事物的運行時間。

語法格式如下:
int lr_start_transaction (const char * transaction_name);

int lr_end_transaction (const char * transaction_name,int status);

transacton為事物名稱。
status為事物的結束狀態:共有LR_PASS(通過)、LR_FAIL(失敗)、LR_AUTO(自動)、 LR_STOP(暫停)。可以在事物結束前通過lr_set_transaction_status進行修改。

如果在lr_end_transaction中沒有指定結束事物狀態是LR_AUTO,而是明確制定為LR_PASS、LR_FAIL、 LR_STOP其中的一種,則事物將以最后制定狀態來結束。

需要注意,事物開始后需要通過相同的名稱以函數lr_end_transaction結束。

2.web_reg_save_param

定義:注冊一個請求,將請求的動態數據信息保存到一個參數。

語法:

int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

參數說明:

· ParamName: 存放得到的動態內容的參數名稱

· list of Attributes: 其它屬性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。屬性值不分大小寫

 

  基本信息:

1、web_reg_save_param必須在獲取返回值的操作前面注冊,在獲取返回值的操作后面使用
2、保存參數最大不能超過256字節,如果超過256字節請使用int web_set_max_html_param_len (const char *length )函數擴大參數保存范圍
例如:web_set_max_html_param_len ("1024"); //擴大參數最大保存范圍為1024字節
3、LB和RB后面跟着"/ic",則邊界大小寫都匹配(不加,也就是默認是大小寫敏感的);在邊界之后指定“/BIN”,即RB/BIN、RB/BIN,則表示為二進制數據 ;
例如:web_reg_save_param("IsRight","LB/ic=cache-control: private\r\n\r\n","RB/ic=|",LAST);
4、屬性值不區分大小寫,如”Search=all”

附:

一、什么是關聯

關聯(correlation):腳本回放過程中,客戶端發出請求,通過關聯函數所定義的左右邊界值(也就是關聯規則),在服務器所響應的內容中查找,得到相應的值,已變量的形式替換錄制時的靜態值,從而向服務器發出正確的請求,這種動態獲得服務器響應內容的方法被稱作關聯。也是把腳本中某些寫死的數據,轉變成動態的數據。
什么內容需要關聯:當腳本中的數據每次回放都發生變化時,並且這個動態數據在后面的請求中需要發送給服務器,那么這個內容需要通過關聯來詢問服務器,獲得該數據的變化結果。例如:
1.登錄字符串。帶有會話 ID 或時間戳等動態數據的登錄字符串。
2.日期/時間戳。使用日期或時間戳或者其他用戶憑據的任意字符串。
3.常見前綴。后跟字符串的常見前綴,如 SessionID 或 CustomerID

二、手工關聯

web_reg_save_param 函數一般用於LR中進行手工關聯,運行腳本時,web_reg_save_param 函數將掃描所訪問的后續 HTML 頁。如果指定左邊界和/ 或右邊界, VuGen 將搜索這些邊界之間的文本。VuGen 找到文本后,會將其分配給某個參數。

舉個例子說明吧:

比如說對源碼中的<input type="hidden" id="orderId" name="orderId" value="f28958249e141e62312d855ce73252d3"/>的orderId的值進行關聯,那么我們可以這樣寫:

web_reg_save_param("orderId",
"LB=name=\"orderId\" value=\"",
"RB=\"",
LAST);

這個就是要在整個HTML文件中找,左邊界是:name="orderId" value=" 右邊界是:"

的中間文本的值,找到后賦給orderId。

資料:

https://blog.csdn.net/jiang1986829/article/details/47113613

https://blog.csdn.net/brbrbrbrbrbr/article/details/52404552

3.web_reg_find-檢查點函數
LR檢查點

  設置檢查點的目的不只是為了驗證我們的腳本沒有錯誤,而更重要的是一個規范問題,如何使得測試結果更具有說服力,因此建議所有的測試腳本中都添加檢查點設置。

一、設置檢查點的方法

1.將腳本切換到樹結構,在page view頁面上找到你要check的文本內容, 並執行鼠標右鍵,選擇Add a text check.

2.將腳本切換回代碼界面,在光標閃爍的上行,手動添加如下的代碼

web_reg_find("Text/IC=Payment Details", "SaveCount=para_count", LAST);

這里是要運行的頁面腳本

if (atoi(lr_eval_string("{para_count}"))>0) //驗證是否找到了頁面上的要檢查的字符串
 lr_output_message("Pass!");
else
  lr_output_message("Failed!");

注意:

l “Payment Details” 為你要檢查的文本;

l 腳本執行到此處,不管頁面上是否存在你要檢查的字符串,腳本都不會報錯,而是執行下去。

l 此段代碼將找到的你要檢查的字符串的個數,存為一個參數。 然后在頁面代碼的后面,通過檢查這個參數的值是否大於0,來判斷是否找到了你所要檢查的字符串。

l 這里的測試結果均以200狀態碼返回,其失敗的結果將在分析報告中進行分類標識。

//atoi()函數的作用是將一個ASCII字符串轉換為整型

//lr_eval_string()函數作用是取得參數值,將字符串變量中的參數值替換為當前的參數值並將這個字符串返回

資料:

https://www.cnblogs.com/lci05/p/3647698.html

四、問題處理
1.replaylog中的中文亂碼

解決這個問題必須認識到一個事實就是,loadrunner和測試服務器交換數據使用的是utf8格式,但是展現在replaylog中是使用gb2312格式, 而且在腳本中如何使用web_reg_find的時候也是使用的是gb2312格式,所以知道這個原理后,事情就好辦多了。

1.獲取測試服務器提供的utf8格式的文字並且轉換成gb2312格式展現出來

web_reg_save_param_ex(
"ParamName=aa",
"LB=ProductName",
"RB=ProductBriefName",
"NotFound=warning",
SEARCH_FILTERS,
LAST) ;


web_url("web_url",
"URL=http://124.238.214.65:70/Scripts/Home/HomeHotProduct.js",
"TargetFrame=",
"Resource=0",
"Referer=",
LAST);
lr_convert_string_encoding(lr_eval_string("{aa}"),"utf-8","gb2312","str");
lr_output_message(lr_eval_string("{str}"));

2.本地的gb2312的中文經過轉換成utf8發給測試服務器

lr_convert_string_encoding(lr_eval_string("智能手機"),"gb2312","utf-8","a1");
web_reg_save_param_ex(
"ParamName=aa",
"LB={a1}",
"RB=",
"NotFound=error",
SEARCH_FILTERS,
LAST);

web_url("IndexCategoryProductJson.js",
"URL=http://124.238.214.65:70/Scripts/Home/IndexCategoryProductJson.js",
"Resource=1",
"RecContentType=application/x-javascript",
"Referer=http://124.238.214.65:8081/",
"Snapshot=t24.inf",
LAST);

————————————————
版權聲明:本文為CSDN博主「angel1magic」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/angel1magic/article/details/84591985


免責聲明!

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



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