1. 程式人生 > >使用JMeter做效能測試的心得

使用JMeter做效能測試的心得

一、基本概念

1.測試計劃是使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。
2.執行緒組:代表一定數量的併發使用者,它可以用來模擬併發使用者傳送請求。實際的請求內容在Sampler中定義,它被執行緒組包含。可以在“測試計 劃->新增->執行緒組”來建立它,然後線上程組面板裡有幾個輸入欄:執行緒數、Ramp-Up Period(in seconds)、迴圈次數,其中Ramp-Up Period(in seconds)表示在這時間內建立完所有的執行緒。如有8個執行緒,Ramp-Up = 200秒,那麼執行緒的啟動時間間隔為200/8=25秒,這樣的好處是:一開始不會對伺服器有太大的負載。執行緒組是為模擬併發負載而設計。
3、取樣器(Sampler):模擬各種請求。所有實際的測試任務都由取樣器承擔,存在很多種請求。如:HTTP 、ftp請求等等。
4、監聽器:負責收集測試結果,同時也被告知了結果顯示的方式。功能是對取樣器的請求結果顯示、統計一些資料(吞吐量、KB/S……)等。
6、斷言:用於來判斷請求響應的結果是否如使用者所期望,是否正確。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對於有效的測試是非常有用的。
7、定時器:負責定義請求(執行緒)之間的延遲間隔,模擬對伺服器的連續請求。
5、邏輯控制器:允許自定義JMeter傳送請求的行為邏輯,它與Sampler結合使用可以模擬複雜的請求序列。
8. 配置元件維護Sampler需要的配置資訊,並根據實際的需要會修改請求的內容。
9. 前置處理器和後置處理器負責在生成請求之前和之後完成工作。前置處理器常常用來修改請求的設定,後置處理器則常常用來處理響應的資料。




二、Jmeter報告 (轉載)
http://www.cnblogs.com/jackei/archive/2006/11/13/558720.html

1、Aggregate Report 解析

Aggregate Report 是 JMeter 常用的一個 Listener,中文被翻譯為“聚合報告”。今天再次有同行問到這個報告中的各項資料表示什麼意思,順便在這裡公佈一下,以備大家查閱。
如果大家都是做Web應用的效能測試,例如只有一個登入的請求,那麼在Aggregate Report中,會顯示一行資料,共有10個欄位,含義分別如下。
Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這裡顯示的就是 Name 屬性的值
#Samples:表示你這次測試中一共發出了多少個請求,如果模擬10個使用者,每個使用者迭代10次,那麼這裡顯示100
Average:平均響應時間——預設情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間
Median:中位數,也就是 50% 使用者的響應時間
90% Line:90% 使用者的響應時間
Note:關於 50% 和 90% 併發使用者數的含義,請參考下文
http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——預設情況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以表示類似 LoadRunner 的 Transaction per Second 數
KB/Sec:每秒從伺服器端接收到的資料量,相當於LoadRunner中的Throughput/Sec



基本知識:

1、吞吐量:是指在沒有幀丟失的情況下,裝置能夠接受的最大速率。
2、儲存的最小單位是位元組Byte,對於儲存單位,有以下幾個單位,GB、MB和KB,那麼這三者之間的換算關係是:1GB=1024MB,1MB=1024KB,1KB=1024Bytes。
Bit :“位”,稱為bit,也就是位元,有的時候也稱為位。一個位元組為8位二進位制表示。
Byte:“位元組”,一個位元組就是8位元。
3、Mbps (million bits per second 兆位/秒) 代表每秒傳輸1,000,000位元。該縮寫用來描述資料傳輸速度。例如:4Mbps=每秒鐘傳輸4M位元。
資料傳輸速率的單位,字母b(bit)是位元和字母 B (Byte)是位元組。
4、吞吐量與頻寬的區分:吞吐量和頻寬是很容易搞混的一個詞,兩者的單位都是Mbps.先讓我們來看兩者對應的英語,吞吐 量:throughput ; 頻寬: Max net bitrate 。當我們討論通訊鏈路的頻寬時,一般是指鏈路上每秒所能傳送的位元數。我們可以說乙太網的頻寬是10Mbps。但是,我們需要區分鏈路上的可用頻寬(帶 寬)與實際鏈路中每秒所能傳送的位元數(吞吐量)。我們傾向於用“吞吐量”一次來表示一個系統的測試效能。這樣,因為實現受各種低效率因素的影響,所以由 一段頻寬為10Mbps的鏈路連線的一對節點可能只達到2Mbps的吞吐量。這樣就意味著,一個主機上的應用能夠以2Mbps的速度向另外的一個主機發送 資料。
5、方差和標準差都是用來描述一組資料的波動性的(集中還是分散),標準差的平方就是方差。方差越大,資料的波動越大。


三.利用BadBoy生成測試計劃(測試指令碼)
badBoy可以非常容易的生成web的測試指令碼。類似與LoadRunner的使用,輸入站點的URL,點選Record開始錄製。File –> Export to Jmeter ,匯出為Jmeter認識的測試指令碼。


四.一個簡單的測試示例思路(目前自己思路,不斷改進)

a. 需要的“測試指令碼”,對應web的應用使用badboy生成測試指令碼。直接匯入Jmeter,進行配置。

b.如圖

TestPlan :是整個Jmeter測試執行的容器。
ThreadGroup :模擬請求,定義執行緒數、Ramp-Up Period、迴圈次數。
Step1 :迴圈控制器 ,控制Sample的執行次數。
Sample取樣器 :決定進行那種型別的測試,如http、ftp等。
監聽器 :圖形結果、聚合報告。
定時器 :Random型別,定義執行緒請求的延遲。

c.聚合報告的解釋

Label :各個模擬測試的名稱
#Samples :各個測試的樣本總數
Average :每個請求的平均響應時間
Median :中值,即50%請求的平均響應時間
90%Line :90%請求的響應時間
Min :最小響應時間 ,Max :最大的響應時間
Error% :錯誤響應的概率。即無法響應的概率。
ThroughPut :吞吐量 -- 預設情況下表示每秒完成的請求數(Request per Second)。
KB/Sec :每秒從伺服器端接收到的資料量。


五.Jmeter常見問題 (轉載) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094
說明:這些問答是從網上轉載的,自己修改了其中的一些內容,如果大家興趣,可以將大家在使用Jmeter的時候碰到的問題寫下來,我們一起補充到這個問答裡面,共同努力完善jmeter的資料。
1.  JMeter的工作原理是什麼?
向伺服器提交請求;從伺服器取回請求返回的結果。

2.  JMeter的作用?
    JMeter可以用於測試靜態或者動態資源的效能(檔案、Servlets、Perl指令碼、java物件、資料庫和查詢、ftp伺服器或者其他的資源)。 JMeter用於模擬在伺服器、網路或者其他物件上附加高負載以測試他們提供服務的受壓能力,或者分析他們提供的服務在不同負載條件下的總效能情況。你可 以用JMeter提供的圖形化介面分析效能指標或者在高負載情況下測試伺服器/指令碼/物件的行為。

3.   怎樣能看到jmeter提供的指令碼範例?
在\JMeter\jakarta-jmeter-2.0.3\xdocs\demos目錄下。

4.   怎樣設定併發使用者數?
   選中視覺化介面中左邊樹的Test Plan節點,單擊右鍵,選擇Add-> Thread Group,其中Number of Threads引數用來設定傳送請求的使用者數目。

5.  JMeter的執行指示?
   Jmeter在執行時,右上角有個單選框大小的小框框,執行是該框框為綠色,執行完畢後,該框框為白色。

6.  User Parameters的作用是什麼?
    提高指令碼可用性

7.   在result裡會出現彩色字型的http response code,說明什麼呢?
Http response code是http返回值,彩色字型較引人注目,可以使使用者迅速關注。象綠色的302就說明在這一步驟中,返回值取自本機的catch,而不是server。

8.   怎樣計算Ramp-up period時間?
Ramp-up period是指每個請求發生的總時間間隔,單位是秒。如果Number of Threads設定為5,而Ramp-up period是10,那麼每個請求之間的間隔就是10/5,也就是2秒。Ramp-up period設定為0,就是同時併發請求。

9.    Get和Post的區別?
   他們是http協議的2種不同實現方式。Get是指server從Request URL取得所需引數。從result中的request中可以看到,get可以看到引數,但是post是主動向server傳送引數,所以一般看不到這些引數的。

10. 哪些原因可能導致error的產生?
   a.   Http錯誤,包括不響應,結果找不到,資料錯誤等等;
   b.   JMeter本身原因產生的錯誤。

11. 為什麼Aggregate Report結果中的Total值不是真正的總和?
JMeter給結果中total的定義是並不完全指總和,為了方便使用,它的值表現了所在列的代表值,比如min值,它的total就是所在列的最小值。下圖就是total在各列所表示的意思。

12.  JMeter的Thread Number是提供多個不同使用者併發的功能麼?
不是,Thread Number僅僅是指併發數,如果需要實現多個不同使用者併發,我們應該採用其它方法,比如通過在jmeter外建立csv檔案的方法來實現。

13. 同時併發請求時,若需要模擬不同的使用者同時向不同的server併發請求,怎樣實現呢?
   方法很靈活,我們可以將不同的server在thread裡面預先寫好。或者預先將固定的變數值寫入csv檔案,這樣還可以方便修改。然後將檔案新增到User Parameters。

14.   User Parameter中的DUMMY是什麼意思?
     當其具體內容是${__CSVRead(${__property(user.dir)}${FILENAME},next())}時用來模擬讀檔案的下一行。

15.   當測試物件在多server間跳轉時,應該怎樣處理?
   程式執行時,有些http和隱函式會攜帶另外的server IP,我們可以從他們的返回值中獲取。

16.   為何測試物件是http和https混雜出現?
   Https是加密協議,為了安全,一般不推薦使用http,但是有些地方,使用https過於複雜或者較難實現,會採用http協議。

17.   Http和https的預設埠是什麼?
   Apache server (Http)的預設埠是80;
   SSL (Https)的預設埠是443。

18.   為何在run時,有些頁面失敗,但是最後不影響結果?
   原因較多,值得提及的一種是因為主流頁面與它不存在依賴關係,所以即使這樣的頁面出錯,也不會影響執行得到正常結果,但是這樣會影響到測試的結果以及分析結果。

19. 為什麼指令碼剛開始執行就有錯誤,其後來的指令碼還可執行?
   在Thread Group中有相關設定,如果選擇了continue,即使前面的指令碼出現錯誤,整個thread仍會執行直到結束。選擇Stop Thread會結束當前thread;選擇Stop Test則會結束全部的thread。推薦選項是Stop Thread。

20.     在Regular expression_r Extractor會看到Template的值是$1$,這個值是什麼意思呢?
   $1$是指取第一個()裡面的值。如果Regular expression_r的數值有多個,用這種方法可以避免不必要的麻煩。

21.    Regular expression_r中的(.*)是什麼意思?
   那是一個正則表示式(regular expression_r)。’.’等同於sql語言中的’?’,表示可有可無。’*’表示0個或多個。’()’表示需要取值。(.*)表達任意長度的字串。

22.   在讀取Regular expression_r時要注意什麼?
   一定要保證所取數值的絕對唯一性。

23.   怎樣才能判斷什麼樣的情況需要新增Regular expression_r Extractor?
   檢查Http Request中的Send Parameters,如果有某個引數是其前一個page中所沒有給出的,就要到原檔案中查詢,並新增Regular expression_r Extractor到其前一page的http request中。

24.   在自動獲取的指令碼中有時會出現空的http request,是什麼意思呢?
   是因為在獲取指令碼時有些錯誤,是指令碼工具原因。在run時這種錯誤不參與執行的。

25.   在執行結果中為何有rate為N/A的情況出現?
   可能因為JMeter自身問題造成,再次執行可以得到正確結果。

26.   常用http錯誤程式碼有哪些?
    400無法解析此請求。
    403禁止訪問:訪問被拒絕。
    404找不到檔案或目錄。
    405用於訪問該頁的HTTP動作未被許可。
    410檔案已刪除。
    500伺服器內部錯誤。
    501標題值指定的配置沒有執行。
    502 Web伺服器作為閘道器或代理伺服器時收到無效的響應。

27.    Http request中的Send Parameters是指什麼?
   是指code中寫定的值和自定義變數中得到的值,就是在執行頁面時需要的引數。

28.    Parameters在頁面中是不斷傳遞的麼?
   是的。引數再產生後會在頁面中一直傳遞到所需頁面。所以我們可以在動態引數產生時捕獲它,也可以在所需頁面的上一頁面捕獲。(但是這樣可能有錯誤,最好在產生頁面獲取)

29.   在使用JMeter測試時,是完全模擬使用者操作麼?造成的結果也和使用者操作完全相同麼?
   是的。JMeter完全模擬使用者操作,所以操作記錄會全部寫入DB.在執行失敗時,可能會產生錯誤資料,這就取決於指令碼檢查是否嚴謹,否則錯誤資料也會進入DB,給程式執行帶來很多麻煩。


六.Jmeter測試心得(轉載) http://www.javaeye.com/topic/211216

企業應用開發過程中,效能測試是很重要的一個環節,在這個環節中Apache的JMeter以它開源、100%純Java、操作方便等優點發揮著很大的作用。
經過一段時間的使用,多少有些心得和技巧,拿出來共享,希望能有些幫助。

1、製作測試指令碼:
手工製作測試指令碼,需要你知道請求的url和攜帶的引數等等,太花費時間,
所以可以用badboy工具錄製指令碼。這個工具雖然不是開源的,但是卻可以用來免費的錄製成.jmx的指令碼,使用起來很方便。
官方網站是:http://www.badboy.com.au/

2、出現亂碼了?
在用JMeter發行HTTPRequest時,在請求引數中有中文時,發現儲存到DB中後,相應的欄位是亂碼,
明明在引數後面的Encode選項中打了V。後來發現badboy錄製指令碼的時候並沒有記錄編碼方式,所以修改指令碼,
在Content encoding中設定正確的編碼方式就不會出現亂碼了。

3、JMeter的妙用---準備測試資料:
要求效能測試開始前,先準備5W條資料。當然可以通過直接修改DB,但是如果這5W條資料涉及到很多表的關聯,
甚至還要通過儲存過程的處理怎麼辦,直接修改DB很容易出現錯誤的資料,要是在客戶的機器上弄錯,可就闖禍了。
這時候想到了JMeter,它本來是用來模擬大量使用者併發請求的,現在用它來批量的生成資料吧。
如果要求每條資料都不同,就要修改指令碼,使用JMeter的函式來動態產生資料,比較常用的是CSVRead函式,
記不住名的話Ctrl+F可以呼喚出函式助手。使用這個函式的時候需要注意幾點,首先是csv檔案的編碼格式,
使用ansi沒有問題,使用unicode時會使讀取的第一行資料出現錯誤;
${__CSVRead(data.txt,0)}---讀取本行的第一列值
${__CSVRead(data.txt,1)}${__CSVRead(data.txt,next)}---讀取本行的第二列值,並把行標移動到下一行
試驗證明JMeter應該做好了同步,在多執行緒環境下上面的呼叫方法沒有問題;
最後,修改JMeter的執行緒數會加快資料生成的速度,原理是當併發執行緒在20左右的時候會達到最大的吞吐量(request/分),
所以應該設定執行緒數20左右。

4、JMeter中debug方法:
JMeter提供了log函式輸出log,但是有時候並不好用,比如我想輸出某個函式的返回值看是不是正確的,
${__log(${__CSVRead(data.txt,1)})}這樣的寫法是錯誤的,JMeter會丟擲異常,該怎麼辦呢?
答案是巧用監聽器(Listener)來輸出想看到的資料,結果顯示為樹的那個監聽器,
它可以讓你檢視每個sampler的請求資料和響應資料,在請求資料中就有你想看到的資訊。

5、常用的功能:
?使用HTTP Cookie Manager或URL重寫實現同一執行緒內的多個請求共享Session。
?把Login的請求放到只執行一次的控制器中,那麼即使迴圈多次,Login也只請求一次。
?如果想讓多個執行緒在同一時刻同時請求,那麼用Synchronizing Timer來做集合點。
?為了節省系統資源,使用非視窗模式執行JMeter(jmeter -n -t test.jmx)
?如果模擬併發使用者過多,比如200執行緒,那麼可以分散到多臺機器上執行Jmeter(比如4臺電腦,每臺50執行緒)
更多功能請參照使用手冊
中文手冊(未完成)http://wiki.javascud.org/pages/viewpage.action?pageId=5566

6、在winnt系統上,使用perfmon來幫助Jmeter採集伺服器的系統資源資料,可以配置log輸出這些資料作為效能瓶頸分析時使用。


七.置信區間 http://java.chinaitlab.com/tools/355421.html
對資料進行更科學的分析,確定測試結果。類似於Jmeter聚合報告的90% Line給出的參考,而不能僅僅參考均值。


記:熟悉Jmeter使用之後,自己更應該關注的是“測試實踐”,以及通過怎麼樣的方法改進效能。