JMeter java模擬多用戶高並發請求測試(json,form表單)


1.情景展示

  在實際開發過程中,需要進行測試的時候,往往需要進行壓力測試,或者高並發情況下,同時對一張表數據進行修改、讀取操作,程序會不會出現多個用戶取出的數據一致,或者修改次數與實際請求數不一致等問題。

2.分析

  如果在項目中寫多線程模擬並發請求,並不是很好,還需要自己寫代碼,來回修修改改;

  有一個工具就可以很好的模擬出高並發請求,供我們直接使用:JMeter,開源、免費;

  使用前提:JAVA運行環境

3.JMeter下載及安裝

  下載

  下載地址見文末推薦。

  這里需要注意的是:

  點擊“Download Releases” ,出現的當前永遠最新版本,紅框里會標注:當前版本運行的java最低版本;

  Linux系統下載*.tgz文件,windows系統下載*.zip文件;

  至於想要下載歷史版本,不知道在哪里藏着。

  安裝

  下載成功后,解壓到想要存放的位置,比如:D盤

  和tomcat一樣,只要你配置了JAVA_HOME環境變量,它就能運行(只要java版本號>=JMeter的最低要求,啟動就不存在閃退的情況)。

  如何查看當前環境下配置的jdk版本?見文末推薦。

  雙擊運行jmeter.bat文件即可。

  此時,會啟動兩個程序;

  使用java編寫的圖形界面

  這倆是同一個程序,關閉其中任何一個,另一個也會跟着關閉。

  下面,切入正題。

4.模擬多用戶高並發請求(json請求)

  第一步:創建線程組;

  選中TestPlan,右鍵,Add,添加線程組。

  設置線程組參數。

  這里配置為:10個線程,同時啟動,循環1次。

  第二步:新增http請求默認值;

  新增http請求默認值,所有的請求都會使用設置的默認值;

  設置協議為http,IP為localhost,端口為8080,項目訪問路徑(請求上下文)設置為/,請求字符集設置為UTF-8;

  大家根據自己的實際需要進行配置,嫌費事的可以是不添加http默認請求配置,在請求單獨配置也是沒有問題的。

  第三步:配置請求頭

  設置請求頭為application/json,目的是:告訴服務器,我發送的json數據。

  Content-Type:application/json

  以上信息復制到剪貼板,選擇:Add From Clipboard,即可自動將以上內容填充進去。

  也可以自己手動配置,點擊底部“Add”,會增加一欄,雙擊進去,輸入內容即可。

  需要說明的是:如果想要發送JSON請求

  這一步不能省略,否則,服務器會將請求數據當做"text/plain"來識別。 

  第四步:添加Http請求

  必須選中“Thread Group”,才能添加“HTTP Request”

 

  我這里需要將請求方式改為POST,請求地址,字符集;

  選擇“Body Data”,添加即將請求的JSON數據。

  第五步:添加監聽器;

  這里添加三種:聚合報告、圖形結果、用表格查看結果,區別在於結果展現形式不同。

  第六步:執行,並查看結果;

  紅框里,是我們所建立的所有配置;

  點擊菜單欄的綠三角,就會立刻發送請求;

  這個提示的意思是:在執行(發送請求)之前,是否進行保存的友好提示;

  選擇No,是不影響請求的執行噠。

  執行結束后,看三個監聽器的返回結果。

  一般情況下,我們還會查看服務器的返回結果,所以,再添加一個監聽器:結果樹。

  切換到結果樹視圖,選中返回類型為JSON,選中其中一個請求,Response Body里面將會是格式化后的JSON數據(當然了,這是要取決於服務器返回給咱的是什么格式的數據)

  這里接收到的中文是亂碼,也不知道是什么情況。

   

  第七步:清空監聽記錄,重新請求;

  再次請求時,這些監聽器的記錄是一直疊加的;

  如果想要清空這些監聽器的記錄的話,點擊“clear”,只清空當前選中的監聽器;點擊“Clear All”會清空所有添加的監聽記錄。

  這種方式更快捷

  注意:

  到此為止,我們只是模擬了一個用戶,而不是多個用戶,換言之,其實是同一個用戶的並發請求。

  第八步:多用戶並發JSON請求;

  同樣地,選中“Thread Group”,新建一個http請求

  紅框里,可以換個名字,方便區分;

  其它配置基本一樣,除了請求的json數據改一下就可以啦。

  清空記錄,發送請求,查看結果

  此時,每個請求都並發了10次,相當於每個用戶同時發送了10條請求。

  如果想要模擬10個不同的用戶並發,我們可以創建10個HttpRequest,確保每個請求里面的數據都不一樣,線程修改成:1

  這樣,就確保了10個用戶並發請求,且每個用戶只請求1次。

  第九步:保存當前配置文件。

  按快捷鍵:Ctrl+S

4.模擬多用戶高並發請求(form表單請求)

  第一步:創建線程組;

  同上

  第二步:新增http請求默認值;

  同上   

  第三步:添加數據源;  

  新建一個文本文件,名字隨意,比如:config.txt;

  目的:該文件用於配置用戶信息(其實就是請求參數);

  里面數據每行有兩個值,userIduserToken,中間用逗號隔開,我這里設置了兩個用戶的信息。

 

  第三步:新建Csv Data Set Config設置;

  目的:引用上面的數據源文件。

  Csv Data Set Config中引用配置文件config.txt,並定義變量名為userIduserToken(名稱隨意,只要一會和下面保持一致就可以啦)

  第四步:選中“Thread Group”,新建一個http請求;

  同上

  在請求中引用配置文件中的變量:

  在填寫參數Value的地方不要將值寫死,而是寫為${變量名}這種格式,我這里想要引用配置文件中userToken的值,所以寫為${userToken}

 

  至此,配置完畢,我們不用再像並發json那樣配置多個請求,才能模擬出不同用戶的並發。因為我們在配置文件config.txt,幾行記錄就代表幾個用戶。

  第五步:測試

  方法同上。

2020-12-10

5.多用戶並發JSON請求(動態配置多個用戶)

  今天又研究了一下,其實,json請求參數也可以配置成類似於form表單請求那樣;

  與form請求不一致的地方在於:我們需要確定好發請求的框架,

  比如,請求入參長這個樣子:

  我們不改key(key的名稱固定),只把對應的value改成動態獲取就可以啦。

  下面,一起來看下吧:

  第一步:配置數據源

  新建一個文本文件,名稱隨意,比如:還叫config.txt。

  確定好,設置幾個動態變量的值,我只需要“PartyCode”和“Code”這兩個key對應的值是變化的,從這個文本文件取值;

  第一行,可以設置參數名稱,讓JMeter獲取變量名字時,從第一行取(可以不加);

  一行代表一個用戶所對應的參數,多個用戶需要配置多個請求數據源,行末不要有多余字符;

  同一行數據,多個參數之間使用逗號隔開,不要有多余字符;

  如果key所對應的value是字符串的話,需要我們在配置數據的時候手動加上英文狀態下的雙引號(字符串,必須加);

  如果不加,在發送數據的時候也是不會加的,換句話說,通過變量取參數值的方式,數據會保持完全一致,並不會進行參數值格式檢驗;

  舉個例子:

  明明是字符串,卻不主動加雙引號;

  字符串加上了雙引號

  第二步:創建csv數據配置

  1.導入文件:點擊瀏覽,選擇剛才的數據源配置文件;

  2.文件字符集:設置成UTF-8;

  3.變量名稱:定義參數名稱,會通過該名字獲取對應的數據,多個變量之間使用逗號隔開;

  需要注意的是:變量的數量需要與每一行的實際的value數量保持一致(有幾個逗號,就配幾個變量名稱)

  4.忽略第一行:這個默認值是false,意思是,把第一行也當成數據源。

  注意:其實,第三和第四項設置是結合使用的。

  5.1 假如,我們在配置文件(數據源文件)里的第一行添加了變量名,那么,我可以第三項不填,第四項設為false(實際上我這里也加上了);

  如果不想用數據源文件,那我需要在第三項重新配置變量名稱,第四項改為true;

  5.2 當我們沒有在配置文件添加變量名稱時,換句話說就是:第一行就是數據源,那我們就在第三項配置變量名,再把第四項改為true;

  第三步:新建請求配置

  如果,你是按照我的操作步驟來的,那么線程組下面就會多出兩個請求配置

  首先,禁用之前的請求配置;

  選中請求,右鍵,禁用

  之所以禁用,是因為:方便查看運行結果。 

  其次,新建請求(方法,上面有)

  在需要動態引用數據的地方,通過el表達式${變量名},此時就不能再加雙引號啦,加上就被當成字符串啦!

  第四步:運行並檢驗執行結果。

  模擬兩個用戶的並發請求(共10次)  

 

  我們會發現:

  通過這種動態配置數據的方式,從配置文件取出來的數據並不是按保存時的順序取的,換句話說,就是隨機的,這樣,更加接近真是請求。

6.修改內存配置

  2020-12-14

  今天應實際需求,有7738條數據完成遠程調用,所以我就想到了使用JMeter來完成,后台開啟多線程異步請求,mysql數據庫表創建索引,避免鎖表情況的發生。

  然鵝,當我開啟7738個線程的時候,報錯:內存溢出;

  所以,只能修改原有的內存參數配置:

  JMeter_HOME/bin/jmeter.bat文件,選中,右鍵編輯,Ctrl+"F搜索:HEAP,找到:

  if not defined HEAP,在它的上面添加參數:

::在這里添加/修改內存
set HEAP=-Xms512m -Xmx1024m  

  事實證明,雖然可以同時開啟7000多個線程,但是執行起來,內存還是不夠,所以,我把-Xmx的值改成了2048m,在很短的時間內就執行完畢了,真爽!

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

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



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