1. 程式人生 > >02.loadrunner之http介面指令碼編寫

02.loadrunner之http介面指令碼編寫

目錄

一、前言

二、建立指令碼-http

1.通用部分

2.POST:application/x-www-form-urlencoded指令碼

3.POST:application/json指令碼

4.POST:multipart/form-data指令碼

5.GET指令碼

三、函式詳解

1.lr_start_transaction/lr_end_transaction事務組合

2.web_reg_save_param

3.web_reg_find-檢查點函式

四、問題處理


一、前言

本文主要針對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);