壓力測試工具中使用變量

Apache JMeter( http://jakarta.apache.org/jmeter/ )是來自 Apache Jakarta 項目的一個壓力測試工具, 目前版本2.0.3, JMeter 支持 HTTP, FTP, SOAP/XML-RPC, JDBC 等多種目標的壓力測試(參見下圖)。
 
                                       

        關於 JMeter 的一般使用在它的官方主頁和其它網站可以搜索到不少文章, 但是很少看到如何使用一些動態內容(比如在 HTTP 請求中使用變量作爲參數)的文章, 最近因爲工作需要, 在這方面做了一些摸索, 總結如下:
0.測試項目概述
        爲了嘗試如何使用變量, 我們首先需要建立一個測試項目, 在這裏使用了 Buffalo (一種 AJAX 技術, 詳細資料參見 http://www.amowa.net/buffalo/index.html ), 或者可以看一下我下載的這個文件(att:在 JMeter 壓力測試工具中使用變量.Buffalo-info.zip)中的說明和例子。 目前 Buffalo 還不是很穩定, 但是建立一個測試環境已經足夠了, 而且很方便。

        我們建立的這個例子叫做 "buffalo-jmeter", 將這個壓縮文件(att:在 JMeter 壓力測試工具中使用變量.buffalo-jmeter.zip)中的 buffalo-jmeter.war 文件複製到 Tomcat(我用的是 Tomcat 5.0.30) 的 webapps 目錄下, 待 Tomcat 自動發佈完成之後就可以通過 http://localhost:8080/buffalo-jmeter/ (假設是發佈在本地的Tomcat上) 訪問測試頁面(如下圖)。


        在這個例子中我們假設一個業務: 首先通過 getToken() 獲得一個憑證, 然後通過這個憑證使用 getOrder() 去申請一個訂單, 憑證上存在時間記錄, 如果超過設定的時間(例子中是10秒)後這個憑證就失效而無法用於申請訂單了(在上圖中的對話框正說明了這種情形)。


1.測試中遇到的問題
        首先我們需要知道 Buffalo 其實是一種 XML-RPC 技術, 所以我們可以使用 JMeter 的 SOAP/XML-RPC Request 這個 Sampler 進行測試, 但是爲了方便快捷進行測試, 以下兩個問題需要解決:
如果測試服務器發生變化, 如何方便的一次性改變所有請求的 URL 地址;
如上一節所述, 10秒鐘後憑證會失效, 因此我們在測試 getOrder() 的時候不能輸入固定的憑證號, 應該每10秒左右獲取一個新的憑證, 這樣操作的難點在於如何自動讓 JMeter 得到新獲得的憑證號並應用到 getOrder() 請求中。

2.靜態變量(用戶定義的變量)
        JMeter 允許對一個測試計劃(*.jmx)設置用戶定義的變量, 因此我們可以把象 URL 等需要統一修改的值作爲變量定義起來(如下圖);



        變量在使用時可以使用 ${變量名} 的方式引用, 如下圖:




3.從 Response 中獲得數據
        可以使用 JMeter 提供的 後置處理器(Post Processers) --> 正則表達式提取器 (Regular Expression Extractor) 從返回的結果中取得數據, 在確定 getToken() 請求的返回值是類似下列的 XML 之後

<?xml version="1.0" encoding="utf-8"?>                                                                   
<burlap:reply xmlns:burlap="http://www.amowa.net/burlap/">                                              
    <string>TK1119466440468</string>                                                                    
</burlap:reply>                                                                                         

        我們可以使用正則表達式 "<string>(.*)<//string>" 來提取我們需要的憑證號。
        首先我們可以使用Javascript 正則表達式測試頁面來測試一下這個正則表達式是如何被執行的(如下圖):
        可以看到執行結果中, 我們需要的憑證號處於"array[1]"的位置。



        這樣使用"正則表達式提取器"(如下圖), 注意圖中的"引用名稱"就可以認爲是存放提取出來的數據的變量名:



        提取出來的變量可以這樣被引用(如下圖), 其中"_g1"代表"group number"(參見 JMeter 的聯機幫助: ... [refname]_g# ... ... and # is the group number, where group 0 is the entire match, group 1 is the match from the first set of parentheses, etc.)



4.測試結果分析
        我們使用3個線程同時對測試項目進行壓力測試(如下圖):



        通過對結果的分析我們看到了提取出來的變量確實在起作用, 而且, 這個變量是每個線程各自獨立的(如下圖):


後記
        對原 Buffalo 代碼的修改:
        原來 net.buffalo.server.BuffaloServiceServlet 中在輸出結果 xml 中沒有使用 response.setContentType("text/xml"), 這導致返回的 xml 沒有正確的 ContentType, 進而使 JMeter 無法獲得 Response, 在代碼中加上這句語句才能正確使用 JMeter 進行測試;
        下載的文件 att:在 JMeter 壓力測試工具中使用變量.buffalo-jmeter.zip 中的 net.buffalo.server.BuffaloServiceServlet 是已經修改過這個問題的, 因此可以直接用於測試;
        文件 att:在 JMeter 壓力測試工具中使用變量.buffalo-jmeter.zip 中還包括了上述的 JMeter 測試計劃(Buffalo-test.jmx)。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章