工具應用:使用JMeter實現Phpwind的性能測試
實驗簡介
在前面的學習中,我們已經利用JMeter完成了針對Agileone系統的協議級介面測試。我們也知道,性能測試技術的核心便是利用多線程技術發送協議請求,完成對大量用戶訪問系統的模擬。而JMeter的設計初衷其實就是為了性能測試,比如我們創建一個測試計劃的第一步便是創建一個線程組。本實驗就為大家講解如果利用JMeter完成對Phpwind的登錄和發帖的性能測試。
實驗目的
(1) 掌握JMeter中的關聯查找的用法。
(2) 掌握JMeter中的線程設計及用法。
(3) 掌握JMeter中的測試報告的用法。
實驗流程
- 實現Phpwind的登錄取樣器
我們已經為Phpwind創建了從testuser_1到testuser_100共100個用戶,那麼在性能測試過程中,我們應該實現用戶的隨機登錄,這樣更能模擬真實場景。
(1) 創建一個「HTTP請求」取樣器,並命名為「DoLogin」,填寫好對應的登錄的POST請求參數。
(2) 為該取樣器創建「響應斷言」和「察看結果樹」,後續請求同。
(3) 為該取樣器創建一個「前置處理器」,並實現一個從1到100的隨機數。
(4) 最終實現的測試請求如下:
2. 利用正則表達式關聯驗證碼
由於在Phpwind中發帖時,必須指定一個欄位「verify」,該值是一個隨機數,我們必須使用正則表達式關聯響應中的對應的值。這部分在介面測試的實現過程中已經有所掌握,此處我們主要看看在JMeter中如何實現:
(1) 添加一個「HTTP請求」取樣器,並發送GET請求給「/phpwind/post.php?fid=2」獲取響應。
(2) 為該取樣器添加一個後置處理器,設置為「正則表達式提取器」,並為其進行如下設置:
(3) 對上述的幾個輸入欄位簡單做一個說明:
a) 引用名稱:下一個請求要引用的參數名稱,如填寫verifycode,則可用${verifycode}引用它。
b) 正則表達式:圓括弧包含的就是要提取的內容,這也是我們熟練應用的內容。
c) 模板:用$-$引用起來,如果我們設置的正則表達式查找到多個值,則序號表示處理哪一個值。
d) 匹配數字:0代表隨機取值,1代表全部取值,通常情況下填0就好。
e) 預設值:如果參數沒有取得到值,那默認給一個值讓它取。
3. 添加發帖請求
(1) 為該取樣器設置一個用戶參數,使用函數助手生成一個隨機數,用為帖子標題和內容的隨機數。
(2) 將上一步中獲取到的verifycode作為POST請求正文verify欄位的值。
(3) 最後生成的測試請求如下:
4. 確保每個請求下載全部資源
默認情況下,JMeter與介面測試一樣,只負責當前請求頁面的下載,而不會下載頁面的其它附加資源,這顯然是不符合真實情況的。所以我們需要下載頁面的全部資源,在HTTP取樣器中的「Advanced」標籤頁中,勾選「從HTML文件中獲取所有包含的資源」即可。
5. 設計並發場景
本次執行我們仍然按照前面的Java腳本相同的場景設計:50個用戶,每10秒鐘並發5個用戶,每個用戶運行100次。具體設置如下:
上述設置中的「Ramp-Up Period(in seconds) 」這個參數設置為100秒的意思是每兩秒鐘增加一個線程,雖然無法象自定義線程那樣任意定義頻率,但是這樣的設置與每10秒鐘並發5個用戶的作用沒有什麼本質差別。
除了設置運行次數外,我們還可以設置性能測試過程的總運行時間。在上圖的下部,勾選「調度器」並設置持續時間即可。如我們需要持續運行一個小時,則只需要設置其值為3600秒即可。
6. 為每一步設置思考時間
思考時間是為了模擬真實的用戶場景所必需的設置。JMeter為我們提供的「定時器」組件便是用於模擬用戶的思考時間的,JMeter自帶的定時器類型較多,我們以比較常用的「高斯隨機定時器」我們可以按照如下步驟在JMeter中一個取樣器設置思考時間:
(1) 右鍵某個取樣器,比如我們點擊「DoLogin」,新建一個「高斯隨機定時器」。
(2) 設置偏差為2000毫秒,固定延遲偏移為4000毫秒。其作用就是產生一個4秒正負2秒範圍內的隨機數,即隨機暫停時間為2秒~6秒之間。
更多關於JMeter定時器的用法,可以參考:「http://www.cnblogs.com/imyalost/p/6004678.html」。
7. 設置集合點
集合點這一概念最早是由LoadRunner這款性能測試工具提出來的,其作用是當一組線程發送完請求後,大家一起集合,直到所有線程都同步到一個時間點後,再一起發送請求。用於模擬更嚴格的並發測試,集合點的使用雖然不太符合真實場景,但是卻可以給伺服器施加更大的瞬時壓力,主要用於對伺服器進行並發測試。
在JMeter中,我們可以使用「Synchronizing Timer」定時器來完成集合點的處理。比如下圖為我們演示了如何為取樣器「DoPost」實施並發測試策略:
(1) Number of Simulated Users to Group by:該值對應的是集合點的線程數量,此處我們設置為50,表示一次集合需要等齊50個線程後才一起發送下一次請求。如果此處設置為0,則表示使用線程組設置的所有線程集合。
(2) Timeout in milliseconds:此處設置為10000,表示集合點的超時時間為10秒鐘,即如果10秒鐘還沒有等齊所有線程,則不再等待。已經完成集合的線程直接發送下一次請求。
事實上,在Java的原生線程開發中,我們也可以使用「wait()」和「notifyAll()」兩個同步方法完成集合點的模擬。
8. 查看性能測試結果
JMeter當中也內置了很多查看測試報告的組件,但是我們比較常用的就是為某個線程組創建的「聚合報告」,比如當前Phpwind的性能測試運行後的結果如下圖所示:
我們可以從上圖中看到每一個取樣器的執行次數,響應時間的各種數學統計(平均數,中位數,90%值,最小值,最大值),事務的錯誤率,網路帶寬的吞吐量,總的響應大小,總的請求大小等數據。除了對伺服器端的性能指標進行監控外,基本上這些指標已經足夠我們對一次性能測試進行基礎數據的分析了。
思考練習
(1) 熟悉JMeter中其它組件的用法。
(2) 利用JMeter完成一個項目的性能測試,並將遇到的問題逐一解決。
(3) 將JMeter中的性能測試與我們用原生Java自己開發的性能測試作比較,看看有何異同。
注:學習更多技術,觀看更多免費視頻,歡迎進入蝸牛學院官網 www.woniuxy.com
希望繼續在IT行業突破提升自己的各位朋友,歡迎加群594154674,不管你自我感覺牛不牛B。
推薦閱讀:
※JMeter之旅01
※核心實驗:監控並分析Windows和Linux關鍵性能指標
※80後測試工程師的中年危機,不知道自己還能不能幹測試,能幹多久
※Jmeter性能測試系列-指標分析與定義
※Jmeter性能測試系列-性能測試需求分析