02.loadrunner之http介面指令碼編寫
目錄
2.POST:application/x-www-form-urlencoded指令碼
1.lr_start_transaction/lr_end_transaction事務組合
一、前言
本文主要針對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指令碼
未完待續
4.POST:multipart/form-data指令碼
未完待續
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);