一、技術詳述
-
本篇博客是對《軟件工程實踐總結&個人技術博客》這篇博客第二部分內容的展開。
-
該技術的用途在前面的博客中有提到,主要用於web端壓力測試,模擬多用戶同時在線並發發出請求的場景,如100個用戶同時查詢某篇文章。
-
閱讀本篇博客首先需要對Jmeter有一定的了解,Jmeter的下載安裝可以參考這篇文章《JMeter下載安裝及入門教程》,這里不再贅述。下面就開始介紹如何用Jmeter進行並發的壓力測試。
1.1 添加線程組
- 在測試計划中添加一個線程組test,設置用戶數,將Ramp-up period設為0。
1.2 添加Http請求
- 在test中添加一個HTTP Request “Login”,填寫必要的數據,如上圖。本篇博客中所用的請求都比較簡單,數據主要以Paramters的方式傳遞。
1.3 添加Listener
- 給線程組test添加View Results Tree作為Listener( 添加其它的也可以,個人感覺這個比較好用 ),以及View Results in Table( 主要是為了講述方便 )。
1.4 運行並查看結果
- 查看View Results Tree,點開一個請求,設置數據格式為JSON( 我們組的項目返回的數據格式主要是JSON ),可以看Response Body的數據如圖。
查看View Results in Table,可以看到每個請求開始的時間是一致的,可見實現了並發。
以上便是實現單個請求並發的方法。那么問題來了,如果一個線程組有多個請求該如何並發呢?
1.5 添加多個請求並添加Synchronizing Timer
- 如上圖在test中又添加了一個請求“InquiryStudentList”,並給其添加響應斷言Response Assertion( 判斷請求是否返回數據,沒有的話視為不通過 )。
- 給test添加Synchronizing Timer,設置保持默認就好,其中Number of Simulated Users to Group by即每次釋放的線程數量( 0等同於設置為線程租中的線程數量 )。添加完成后便可以使得線程組中的每個請求並發執行,即請求A並發執行,然后請求B再並發執行。
- 執行的結果如下:
- 可以看到,Login請求並發執行完畢,InquiryStudentList請求才開始並發執行。
然而,上述請求僅在不需要身份認證的情況下,才能通過,而身份認證則需要在請求頭中添加token。也就是說需要先登錄獲取用戶的token,鑒於token每次登錄都是不同的,而且一個用戶只對應一個token,需要提取登錄返回的token,並將其設為全局變量。
1.6 提取token並設為全局變量
- 這邊更改test的設置,使得其只包含Login請求,並將線程數置1。給Login請求添加JSON Exactor( 登錄返回JSON類型的數據 )用於獲取返回數據中的token。
- 為Login請求添加BeanShell PostProcessor,將token設置為全局變量。
- 給測試計划添加HTTP Header Manager,將token變量加入,使得該測試計划中的其他線程組都可以獲得這個token。
- 在測試計划中添加需要測試的線程組( 並發數自行設置 ),與之前不同的是該線程組添加了新的Listener“Aggregate Report”。且線程組中的請求都需要token才能通過。
- 更改測試計划的設置,確保每個線程組順序執行,即保證token能夠起作用。
- 運行測試,由上面兩張圖片可以看出確實將token提取出來並包含在請求中。
二、問題與解決
- 技術使用倒是沒有什么問題,主要的問題是學習使用的過程中的問題。大概有以下兩點:
1、沒有將token設為全局變量
我之前並未考慮將登錄單獨設為一個線程組( 因為先前只知道如何提取token ),而是每個線程組都設置一個登錄請求,且每個線程組都有一個請求頭管理器,但是這樣的話就會使得登錄請求返回的token多次被覆蓋,因為線程組含多個線程,每個線程都得登錄一次,而之前有提到一個用戶一次只能用一個token。所以,這樣做是行不通的( 指並發的情況,如果循環就可以 ),而且每個線程組都得設置個登錄,太多余了。
2、沒有令測試計划中的線程組順序運行
也就是說雖然單獨設置了登錄的線程組,但並沒有保證其是先運行的,也就是token還沒提取,其它線程組就已經在執行了。即前面提過的token失效的問題。
三、總結
-
沒啥好寫的,給個流程圖:
-
參考博文
jmeter--壓力測試
jmeter全局變量配置