博客 / 詳情

返回

每週讀書與學習->JMeter性能測試腳本編寫實戰(二)- 前一個請求返回的結果作為後一個請求的入參

每週讀書與學習是由清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書的作者推出,分享作者多年的IT從業經歷,希望對很多計算機科學技術IT類專業畢業生以及IT從業者有所幫助。

在前面的學習中,介紹了很多Jmeter的理論知識,包括Jmeter中很多不同元件的詳細介紹以及每個元件的作用,本次主要從實踐的角度來介紹怎麼用這些元件來完成常見性能測試腳本的編寫,將會介紹一些常見的性能測試腳本編寫案例。

在上一次分享中,分享了JMeter性能測試腳本編寫實戰之如何實現用户需先登錄,然後再請求別的接口,本次將繼續分享JMeter性能測試腳本編寫實戰。

1、前一個請求返回的結果作為後一個請求的入參

在性能測試中,除了會對單個接口請求進行性能壓測外,也經常會遇到一些比較複雜的場景,比如需要同時對兩個不同的接口請求進行性能壓測,並且前一個接口請求返回的結果需要作為後一個接口請求的入參,如下圖所示就是一個實際的示例演示,這個示例是以調用http://www.nmc.cn/rest/province/ 接口獲取中國每一個省份或者直轄市下有哪些具體的城市信息來作為例子進行演示的。

 

從上圖中可以看到,由於獲取每個省份或者直轄市下的具體城市信息時,需要先獲取到該省份或者直轄市的代碼,然後在調用http://www.nmc.cn/rest/province/ 接口時,傳入對應的代碼,來獲取該省份或者直轄市下有哪些具體的城市信息,由於一開始並不知道每個省份或者直轄市的對應代碼是啥,所以第一步需要先通過省份或者直轄市的名稱來調用接口獲取該省份或者直轄市對應的代碼,在獲取到省份或者直轄市代碼後,再通過代碼作為入參調用接口獲取其下對應的所有的城市信息。

在理清了調用接口的先後順序後,就可以先將所有的省份和直轄市數據作為一個參數化數據,因為在中國所有的省份和直轄市的名稱是已知的,在Jmeter中,通常建議使用配置元件下的CSV 數據文件設置來進行參數化設置,如下圖所示,在文件名設置中選擇省份和直轄市對應的參數化數據文件的絕對路徑,並且設置文件編碼為utf-8,即表示通過utf-8的編碼格式來讀取參數化數據,避免出現亂碼的情況,因為省份和直轄市名稱都是中文形式的數據,如果編碼格式選擇不合適的話,可能會出現讀取名稱出現亂碼的情況,在實際性能測試中,出現亂碼時,通常都建議去排查下數據文件的編碼格式和在Jmeter中設置的編碼格式是否一致,如果不一致的話,通常就會產生亂碼。在設置完文件編碼後,在變量名稱中設置provinceName來作為變量來存儲讀取到的省份或者直轄市名稱。

在參數化數據文件中,需要將所有的省份和直轄市的名稱寫入,如下圖所示。

在做完參數化設置後,就可以添加一個取樣器來調用第一個接口http://www.nmc.cn/rest/province,如下圖所示,該接口不需要傳入任何的參數,因為直接訪問該接口時,會返回所有的省份或者直轄市名稱對應的代碼信息,由於該接口是一次返回了所有的省份或者直轄市名稱對應的代碼信息,所以如果需要通過某個省份或者直轄市名稱來找到對應的代碼,還需要添加一個後置處理器元件,由於該接口返回的數據是JSON格式的數據,所以可以選擇後置處理器下的JSON JMESPath Extractor來對返回的JSON數據進行後置處理來獲取某個省份或者直轄市名稱對應的代碼信息,並且由於需要確保該後置處理器和該取樣器進行匹配處理,所以在這裏選擇了邏輯控制器下的簡單控制器來進行了一個單獨的分組,該分組的作用就是確保JSON JMESPath Extractor這個後置處理器直接處理該取樣器返回的數據。

如下所示是http://www.nmc.cn/rest/province接口返回的所有的省份或者直轄市名稱對應的代碼信息。

[{"code":"ABJ","name":"北京市","url":"/publish/forecast/ABJ.html"},{"code":"ATJ","name":"天津市","url":"/publish/forecast/ATJ.html"},{"code":"AHE","name":"河北省","url":"/publish/forecast/AHE.html"},{"code":"ASX","name":"山西省","url":"/publish/forecast/ASX.html"},{"code":"ANM","name":"內蒙古自治區","url":"/publish/forecast/ANM.html"},{"code":"ALN","name":"遼寧省","url":"/publish/forecast/ALN.html"},{"code":"AJL","name":"吉林省","url":"/publish/forecast/AJL.html"},{"code":"AHL","name":"黑龍江省","url":"/publish/forecast/AHL.html"},{"code":"ASH","name":"上海市","url":"/publish/forecast/ASH.html"},{"code":"AJS","name":"江蘇省","url":"/publish/forecast/AJS.html"},{"code":"AZJ","name":"浙江省","url":"/publish/forecast/AZJ.html"},{"code":"AAH","name":"安徽省","url":"/publish/forecast/AAH.html"},{"code":"AFJ","name":"福建省","url":"/publish/forecast/AFJ.html"},{"code":"AJX","name":"江西省","url":"/publish/forecast/AJX.html"},{"code":"ASD","name":"山東省","url":"/publish/forecast/ASD.html"},{"code":"AHA","name":"河南省","url":"/publish/forecast/AHA.html"},{"code":"AHB","name":"湖北省","url":"/publish/forecast/AHB.html"},{"code":"AHN","name":"湖南省","url":"/publish/forecast/AHN.html"},{"code":"AGD","name":"廣東省","url":"/publish/forecast/AGD.html"},{"code":"AGX","name":"廣西壯族自治區","url":"/publish/forecast/AGX.html"},{"code":"AHI","name":"海南省","url":"/publish/forecast/AHI.html"},{"code":"ACQ","name":"重慶市","url":"/publish/forecast/ACQ.html"},{"code":"ASC","name":"四川省","url":"/publish/forecast/ASC.html"},{"code":"AGZ","name":"貴州省","url":"/publish/forecast/AGZ.html"},{"code":"AYN","name":"雲南省","url":"/publish/forecast/AYN.html"},{"code":"AXZ","name":"西藏自治區","url":"/publish/forecast/AXZ.html"},{"code":"ASN","name":"陝西省","url":"/publish/forecast/ASN.html"},{"code":"AGS","name":"甘肅省","url":"/publish/forecast/AGS.html"},{"code":"AQH","name":"青海省","url":"/publish/forecast/AQH.html"},{"code":"ANX","name":"寧夏回族自治區","url":"/publish/forecast/ANX.html"},{"code":"AXJ","name":"新疆維吾爾自治區","url":"/publish/forecast/AXJ.html"},{"code":"AXG","name":"香港特別行政區","url":"/publish/forecast/AXG.html"},{"code":"AAM","name":"澳門特別行政區","url":"/publish/forecast/AAM.html"},{"code":"ATW","name":"台灣省","url":"/publish/forecast/ATW.html"}]
 

由於返回的數據是一個JSON格式的數據,所以添加了後置處理器下的JSON JMESPath Extractor元件來對JSON數據進行處理,如下圖所示,設置將從JSON數據中提取到的省份或者直轄市名稱
對應的代碼賦值給province這個變量來存儲以供下一個取樣器調用接口獲取該代碼下對應的所有城市信息數據,設置JMESPath提取的表達式為[?name=='${provinceName}'].code,
該表達式中的${provinceName} 就是引用了前面參數化數據中定義的provinceName這個變量,並且設置匹配的次數為1,如果對JSON JMESPath Extractor不是很熟悉,可以參考本書前面的章節,
在前面的章節中有詳細介紹如何去使用JSON JMESPath Extractor從JSON數據中提取數據。

在通過JSON JMESPath Extractor獲取到省份或者直轄市對應的代碼後,就可以添加第二個取樣器來發起請求調用http://www.nmc.cn/rest/province接口來獲取省份或者直轄市下的所有城市信息數據了,如下圖所示,從圖中可以看到此時在接口URL中傳入了${province}這個變量,這個變量代表的就是某個省份或者直轄市對應的代碼。

在完成上述的Jmeter元件添加以及配置後,建議再添加查看結果樹元件以方便通過查看結果樹來查看每個取樣器的運行的結果,如下圖所示,而且從圖中可以看到當運行整個Jmeter測試計劃後,在查看結果樹中可以看到第一個取樣器已經正常發出了調用http://www.nmc.cn/rest/province接口的請求。

從查看結果樹中看到,第二個取樣器也正常發出了調用接口的請求,請求的URL地址為http://www.nmc.cn/rest/province/ABJ,如下圖所示,可以看到在URL地址中,已經添加上了對應的省份或者直轄市的代碼,由於在參數化數據中,第一個設置的參數化數據為北京市,並且從第一個取樣器返回的響應數據可以知道,北京市的代碼為ABJ,所以此時首次運行時,第二個取樣器請求的URL地址應該為http://www.nmc.cn/rest/province/ABJ,查看結果樹中顯示的實際結果和預期結果是完全匹配的,這説明性能測試腳本的運行符合預期。如下圖所示,通過查看獲取城市信息這個取樣器的響應數據,可以

看到已經返回了北京市這個直轄市下所有對應的全部城市數據信息。

在這個示例中,省份或者直轄市名稱的參數化數據是通過Jmeter配置元件下的CSV數據文件設置來實現的,除了通過這種方式可以實現外,還可以通過Jmeter函數助手中的CSVRead 函數來實現,如下圖所示。

2、本次學習總結

讀者們需要能在Jmeter工具下完成常見的性能測試腳本的編寫,能完成一些常見的HTTP請求以及數據庫請求的性能壓測,每天學習一個知識點,循序漸進,持續讓自己提高和進步。

出處:本次學習的內容參考自清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.