[JPT_05] 效能測試-指令碼開發(登入&隨機購買業務)

weixin_34365417發表於2018-09-22

目錄結構

一、使用者登入指令碼開發
    1.用Badboy錄製登入指令碼
    2.匯出指令碼新增到JMeter中
    3.優化指令碼:設定對登入使用者名稱進行引數化,呼叫csv讀取登入資料
    4.新增定時器(控制登入步驟的等待時間)
    5.設定響應斷言,判斷登入是否成功
    6.執行1個執行緒1次迴圈,檢驗指令碼執行效果
二、隨機購買商品指令碼開發
    1.用Badboy錄製商品購買業務的指令碼
    2.匯入指令碼到JMeter中,設定對登入使用者名稱進行引數化
    3.利用Fiddler抓包獲取新增商品到購物車的請求資料,補充新增到JMeter
    4.利用Regex Tester正規表示式測試器,檢驗獲取隨機商品id的正規表示式效果
    5.配置JMeter中的正規表示式提取器,設定goods_id為隨機變數
    6.新增定時器
    7.設定響應斷言,判斷是否購買成功
    8.新增檢視結果樹、聚合報告,統計指令碼執行的資料
    9.執行檢驗指令碼執行效果


本次ECShop測試站點:http://localhost/ecshop36/ecshop/

一、使用者登入指令碼開發

測試要點:
1.利用BadBoy錄製使用者登入ECShop站點的過程,生成JMeter指令碼
2.在JMeter中對登入使用者名稱進行引數化。為模擬不同使用者登入,更符合實際業務場景,因此需要針對使用者名稱進行引數化

具體操作過程如下:

1.用Badboy錄製登入指令碼
4866277-bf94779b72762306.png


2.匯出指令碼新增到JMeter中
4866277-294602d9e655d57c.png
4866277-6f1f0db03125a26b.png
4866277-94cac8ecbdd85c88.png


3.優化指令碼:設定對登入使用者名稱進行引數化,呼叫csv讀取登入資料

新增 CSV Data Set Config

4866277-00fc7d5ec1aeaa91.png
4866277-2fa35896e29b6637.png

登入資訊中設定使用者名稱為引數化對應的變數

4866277-d835d2042abeb001.png


4.新增定時器(控制登入步驟的等待時間)

指令碼錄製過程中,使用者輸入帳號及密碼,大概需5s左右,其餘操作則不考慮等待時間(可根據具體需求確定),需新增3個計時器:

>> 使用者登入前等待資訊輸入:5s 計時器
>> 登入成功等待返回首頁:3s 計時器
>> 使用者退出等待返回首頁:3s 計時器

以上時間的設定是基於前文 [JPT_03]效能測試-測試模型構建 & 用例設計登入業務執行緒數確定時假定的模擬使用者的時間花費而定。

新增 Constant Timer(固定定時器):

4866277-9aea5ee78073ab94.png
4866277-cdb0879c0b60297a.png


5.設定響應斷言,判斷登入是否成功

新增 Response Assertion(響應斷言):

4866277-165488e752c555e6.png

設定斷言內容為:"登入成功"
若Response資料中包含此字串,則代表登入成功

4866277-9f914752b6d1f9f2.png

新增View Results Tree(檢視結果數)、Summary Report(聚合報告),用於統計測試指令碼執行過程中的資料表現

4866277-e4b688fca0d72016.png


6.執行1個執行緒1次迴圈,檢驗指令碼執行效果
4866277-b543bb5d051d20f5.png
登入成功
4866277-cb87a4d7d244148e.png

以上,本次ECShop站點登入業務的指令碼開發完成


二、隨機購買商品指令碼開發

測試要點:
1.用BadBoy錄製使用者登入、瀏覽商品、加入購物車、設定物流方式、支付方式及收貨資訊提交訂單等過程,生成JMeter指令碼
2.為了實現隨機選擇某種商品,然後進行購買的行為,需在頁面中隨機獲取商品的id。登入成功後,通過分析商品首頁的HTML原始碼,利用JMeter正規表示式提取器實現隨機獲取商品id
3.在實際測試中,可利用Regex Tester正規表示式測試器執行獲取指令碼所需的動態資料,當確定資料獲取正確後,再配置JMeter中的正規表示式提取器
4.引數化:登入使用者名稱、商品隨機瀏覽的id、商品隨機購買新增到購物車的id

具體操作過程:

1.用Badboy錄製商品購買業務的指令碼
4866277-13e0a96dbba39ae1.png


2.匯入指令碼到JMeter中,設定對登入使用者名稱進行引數化
4866277-92e24e0b814bdbaf.png
4866277-2c2189a624487804.png


3.利用Fiddler抓包獲取新增商品到購物車的請求資料,補充新增到JMeter

分析指令碼請求,發現Badboy並未錄製到將所選商品具體屬性新增到購物車的請求,因此需要手動新增補充才能完整執行指令碼。此時利用Fiddler工具抓包分析,可找出對應請求,包括:Request url、Body Data資料...
Request url:http://.../ecshop/flow.php?step=add_to_cart
POST Data:goods={"quick":1,"spec":[],"goods_id":72,"number":"1","parent":0}

4866277-10f2977e440d1898.png
4866277-962834efa3c2fc48.png
配置項 取值設定
1 Name 自定義的名稱,如:新增商品到購物車
2 Server Name or IP 伺服器域名或IP
3 Port Number 設定伺服器提供服務的埠號,ECShop使用的Apache+PHP模式,常規情況埠號為80
4 Implementation 客戶端執行語言。與其他請求一樣,選擇Java即可
5 Protocol HTTP協議
6 Method Fidller抓包分析,為POST請求
7 Path 傳送請求的路徑,Fiddler抓包獲取新增購物車請求的路徑:.../ecshop/flow.php?step=add_to_cart
8 Body Data 利用Fiddler抓包,Body Data:goods={"quick":1,"spec":[],"goods_id":72,"number":"1","parent":0}
設定“goods_id”為隨機引數

PS:BadBoy錄製過程中,①若使用的帳號是已經購買過商品的帳號,且收貨資訊已經存在於資料庫中,則錄製不到新新增收貨地址的操作,此時亦可利用Fidller抓包獲取相應請求資料,手動新增到JMeter中;②當然也可以用全新未購買過商品的賬號進行錄製,就不需要單獨去抓取新增收穫地址的操作請求


4.利用Regex Tester正規表示式測試器,檢驗獲取隨機商品id的正規表示式效果

Regex Tester工具下載傳送門:https://www.jb51.net/tools/regex_tester/

4866277-79d5234198568d3b.png

利用Regex Tester正規表示式測試器對所設定的正規表示式進行測試驗證效果,源文字是從商品首頁對應的HTML原始碼獲取,執行匹配規則之後,從執行結果可以看出已經匹配獲取到商品的id編號(72,70,69,68,...)


5.配置JMeter中的正規表示式提取器,設定goods_id為隨機變數

2個地方對商品id引數化:根據goods_id進入商品詳細頁;新增對應goods_id的商品到購物車

對登入成功後的商品首頁,右鍵新增正規表示式提取器,以獲取商品的隨機id編號,用於後續步驟中

4866277-88dc5de31783b9c8.png
4866277-cff6f8bb8e063bf2.png

JMeter中正規表示式提取器的用法:

配置項 取值設定
1 Name 便於識別元件,可將名稱改為直觀的文字。如:“獲取商品id編號”
2 Name of created variable 表示JMeter其他元件呼叫該變數時的名稱。此處設定為"goods_id",表示商品id
3 Regular Expression 設定為goods.php\?id=(.*)\"> <div,注意需對問號?、雙引號"進行轉義。
(.*):表示在id=">之間取任意長度的任意字元
4 Template 表示取哪個匹配值,本處只有一個,故設定為“$1$”
5 Match No. 表示獲取資料的方式,0代表隨機獲取
6 Default Value 當沒有獲取到匹配的資料時,可取此處的預設值(id=72,即首頁預設的第一個商品)

將獲取到的隨機商品id,替換到後續請求中進行引用

4866277-b69c3a87f0f30d26.png
4866277-4d76f5cd35151c20.png


6.新增定時器

指令碼錄製過程中,使用者輸入使用者名稱及密碼,需5s左右;使用者登入成功後,系統預設有3s左右的使用者選擇操作時間;使用者選擇某件商品,然後新增到購物車,這個過程可增加計時器5s;編寫收貨資訊5s;填寫快遞資訊及付款方式5s;使用者退出系統時,也存在同樣的選擇時間,大約3s。

>> 使用者登入前等待資訊輸入:5s 計時器
>> 登入成功等待返回首頁:3s 計時器
>> 選擇商品、新增到購物車:5s 計時器
>> 填寫收貨資訊:5s 計時器
>> 填寫物流資訊、支付方式選擇:5s 計時器
>> 使用者退出等待返回首頁:3s 計時器
4866277-dfc2aa0f95cb0f1e.png


7.設定響應斷言,判斷是否購買成功

Add-->Assertions-->Response Assertion
Add-->Listener-->Assertion Results

4866277-63b3ee092e79824b.png

PS: 訂單是否成功,也可在ECShop後臺直接查詢

同時通過Fiddler抓包分析,發現"填寫收貨資訊進行提交"請求存在POST請求的302定向,此時為了確保前後頁面登入資訊的關聯性,需要勾選"Follow Redirects", 或者兩種定向方式都不勾選則預設"Follow Redirects"

4866277-0680cd51c4f621d7.png
4866277-447c90002bbdf765.png


8.新增檢視結果樹、聚合報告,統計指令碼執行的資料

新增View Results Tree、Summary Report,便於統計測試指令碼執行過程中的資料表現


9.執行檢驗指令碼執行效果
配置項 配置數值
Thread Group Number of Thread: 1
Step 1 Loop Count: 1

按照1個執行緒迴圈1次進行檢驗效果,已執行成功提交訂單,如下:

4866277-cd99afd53e5c9d17.png
4866277-4d5b5946a69e1505.png

在本地資料庫中,也可查詢到剛才在JMeter中執行指令碼獲取到使用者的收穫地址資訊、訂單資訊的記錄,如下:

4866277-853a2d74825659af.png

以上,本次ECShop站點隨機瀏覽購買商品業務的指令碼開發完成

相關文章