運用JMeter進行Web測試(適用初學者)

利用JMeter進行Web測試

JMeter介紹
腳本錄製
運行JMeter進行測試
JMeter主要組件介紹
參數化設置
動態數據關聯
使用命令行運行JMeter腳本

利用XSLT分析JMeter結果文件

JMeter介紹

JMeter, 一個100%的純Java桌面應用,它是Apache組織的開放源代碼項目,它是功能和性能測試的工具。JMeter可以用於測試靜態或者動態資源的性能 (文件、Servlets、Perl腳本、Java對象、數據庫和查詢、ftp服務器或者其他資源)。原先Jmemer是爲Web/HTTP測試而設計 的,但是它已經擴展以支持各種各樣的測試模塊。它和用於HTTP和SQL數據庫(使用JDBC)的模塊一起運送。它可以用來測試靜止資料庫或者活動資料庫 中的服務器的運行情況,可以用來模擬對服務器或者網絡系統加以重負荷以測試它的抵抗力,或者用來分析不同負荷類型下的所有運行情況。它也提供了一個可替換 的界面用來定製數據顯示,測試同步及測試的創建和執行。
  Jmeter的下載地址:http://jakarta.apache.org/jmeter/usermanual/index.html
  JMeter 的特性:
  a) 能夠對HTTP和FTP服務器進行壓力和性能測試, 也可以對任何數據庫進行同樣的測試(通過JDBC)。
  b) 完全的可移植性和100% 純Java。
  c) 完全 Swing 和輕量組件支持(預編譯的JAR使用 javax.swing.*)包。
  d) 完全多線程 框架允許通過多個線程併發取樣和 通過單獨的線程組對不同的功能同時取樣。
  e) 精心的GUI設計允許快速操作和更精確的計時。
  f) 緩存和離線分析/回放測試結果。
  g) 高可擴展性:
  h) 可鏈接的取樣器允許無限制的測試能力。
  i) 各種負載統計表和可鏈接的計時器可供選擇。
  j) 數據分析和可視化插件提供了很好的可擴展性以及 以及個性化。
  k) 具有提供動態輸入到測試的功能(包括Javascrīpt)。
  l) 支持腳本變成的取樣器(在1.9.2及以上版本支持BeanShell)。

腳本錄製


利用BadBoy進行腳本錄製

利用BadBoy錄製JMeter腳本(1)

通過Badboy的官方網站(http://www.badboy.com.au)下載Badboy的最新版本;
安裝Badboy。安裝過程同一般的Windows 應用程序沒有什麼區別,安裝完成後你可以在桌面和Windows開始菜單中看到相應的快捷方式——如果找不到,可以找一下Badboy安裝目錄下的Badboy.exe 文件,直接雙擊啓動Badboy;
啓動Badboy,你可以看到下面的界面。

利用BadBoy錄製JMeter腳本(2)

在地址欄(圖中紅色方框標註的部分)中輸入你需要錄製的Web應用的URL——這裏我們以http://www.baidu.com 爲例 。
點擊 開始錄製 按鈕(圖中藍色圓圈標註的部分)開始錄製。 
開 始錄製後,你可以直接在Badboy內嵌的瀏覽器(主界面的右側)中對被測應用進行操作,所有的操作都會被記錄在主界面左側的編輯窗口中(圖中***方框標 注的部分)——在這個試驗中,我們在baidu的搜索引擎中輸入 JMeter 進行搜索。不過錄制下來的腳本並不是一行行的代碼,而是一個個Web對象——這有點像LoadRunner的VuGen中的Tree View視圖; 
錄製完成後,點擊工具欄中的“停止錄製”按鈕(圖中紫色方框標註的部分),完成腳本的錄製

利用BadBoy錄製JMeter腳本(3)

選擇“File -> Export to JMeter”菜單,填寫文件名“baidu.jmx”,將錄製好腳本導出爲JMeter腳本格式。也可以選擇“File -> Save”菜單保存爲Badboy腳本;
啓動JMeter並打開剛剛生成的測試腳本,就可以用JMeter進行測試了


利用JMeter的代理服務器功能進行腳本錄製

利用JMeter的代理服務器功能
進行腳本錄製(1)

在測試計劃中添加線程組,在線程組中添加邏輯控制器-錄製控制器。
在工作臺中添加非測試元件-HTTP代理服務器。
端口:即代理服務器的監聽端口,我們設爲8080。
目標控制器選擇:測試計劃>線程組;
分組選擇:每個組放入一個新的控制器。

在HTTP代理服務器中添加定時器-高斯隨機定時器(用於告知Jmeter來在其生成的HTTP請求中自動的增加一個定時器)。定時器將會使相 應的的取樣器被延遲。 延時的規則是,在上一個訪問請求被響應並延時了指定的時間後,下一個被定時器影響的取樣訪問請求才會被髮送出去。 

如果在代理服務器元件裏使用了高斯隨機定時器,就應該在其中的固定延遲偏移(Constant Delay Offset)設置項裏添上${T}(用於自動引用紀錄的延遲時間)。

代理服務器配置好以後,點擊啓動,代理服務器就會開始記錄所接受的HTTP 訪問請求。 
打開瀏覽器,打開Internet選項,將局域網(LAN)設置中的代理服務器設爲:localhost,端口爲在代理服務器中設的端口:8080。

在瀏覽器地址欄中輸入地址並進行相關的操作進行錄製,錄製完成後, 停止HTTP 代理服務器; 在錄製控制器元件上單擊右鍵將記錄的元件保存爲一個文件用於以後重用,另外,不要忘了恢復瀏覽器的代理服務器設置。

運行Jmeter進行測試(1)


腳本錄製完畢後,就可以運行JMeter來進行我們的測試了。
到JMeter的網站http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi
下載JMeter的最新版本,將zip文件解壓縮到D:/JMeter,運行D:/JMeter/bin下的jmeter.bat即可。

打開JMeter會有一個默認的測試計劃,點擊文件-打開,選中錄製的腳本文件如:WebXSample_addUser.jmx,打開腳本進行測試。
在線程組上添加監聽器-聚合報告(用於分析測試結果)後,點擊運行-啓動,開始測試,測試完畢後在聚合報告中就可以看到測試結果。一個簡單的測試計劃就完成了。

聚合報告顯示測試結果

Label:每個 JMeter 的 element (例如 HTTP Request )都有一個 Name 屬性,這裏顯示的就是 Name 屬性的值 
#Samples:表示你這次測試中一共發出了多少個請求,如果測試計劃模擬10個用戶,每個用戶迭代10次,這裏就會顯示100 
Average:平均響應時間 — 默認情況下是單個 Request 的平均響應時間,當使用了事務控制器時,也可以以事務爲單位顯示平均響應時間 
Median:中位數,也就是 50 %用戶的響應時間 
90% Line: 90 %用戶的響應時間
Min:最小響應時間 
Max:最大響應時間 
Error%:錯誤率,本次測試中出現錯誤的請求的數量 / 請求的總數
Throughput:吞吐量 —— 默認情況下表示每秒完成的請求數( Request per Second )
KB/Sec:每秒從服務器端接收到的數據量

測試計劃(Test Plan)是使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。
線程組(Thread Group)代表一定數量的併發用戶,它可以用來模擬併發用戶發送請求。
取樣器(sampler)定義實際的請求內容,被線程組包含,我們主要用HTTP請求。
監聽器(Listener) 
邏輯控制器(Logic Controller)
斷言(Assertions) 
配置元件(Config Element)
前置處理器(Pre Processors)和後置處理器(Post Processors)
定時器(Timer)

JMeter主要組件介紹-測試計劃


測試計劃(Test Plan)是使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。
名稱:你可以爲你的測試計劃取一個有意義的名字。
註釋:對測試計劃的註釋。
用戶定義的變量:用戶可以自己定義變量,在用到此變量的時候直接用${變量名}引用即可。例:變量名=url,值=http://www.baidu.com,在需要http://www.baidu.com時直接用${url}即可。
Add directory or jar to classpath:向類路徑即%JMETER-HOME%\lib中添加目錄及jar包。

JMeter主要組件介紹-線程組

名稱:爲線程組起名字。
線程屬性-線程數:設置發送請求的用戶數目 ,即併發數。
線程屬性-Ramp-Up Period(in second):線程間的時間間隔,單位是秒。即所有線程在多少時間內啓動。
線程屬性-循環次數:請求的重複次數,如果選擇後面的forever(默認),那麼 請求將一直繼續,如果不選擇forever,而在輸入框中輸入數字,那麼請求將重複指定的次數,如果輸入1,那麼請求將執行一次,如果是0,會出現問題。
調度器配置-啓動時間:測試計劃什麼時候啓動,啓動延遲會覆蓋它。
調度器配置-結束時間:測試計劃什麼時候結束,持續時間會覆蓋它。
調度器配置-持續時間:測試計劃持續多長時間,會覆蓋結束時間。
調度器配置-啓動延遲:測試計劃延遲多長時間啓動,會覆蓋啓動時間。

JMeter主要組件介紹-取樣器(HTTP請求)

名稱:HTTP請求的名字。
Web服務器-服務器名稱或IP、端口號,腳本錄製時自動添加,也可以使用“用戶自定義變量”。
HTTP請求:用默認值即可。
同請求一起發送參數:請求中的參數、值可以在此設置,需要用到參數化及動態數據關聯,我們在後面專門介紹。
同請求一起發送文件:我可以制定同請求一起發送哪個文件。
其他任務包括:從HTML文件中獲取所有內含的資源、用作監視器、Embedded URLs must match

監聽器(Listener)負責收集測試結果,同時也被告知了結果顯示的方式。我們常用的包括:聚合報告、查看結果樹、用表格查看結果,都支持將結果數據寫入文件。其他的添加上去看看就行。聚合報告前面我們介紹過,後面是查看結果樹和用表格查看結果的截圖。

JMeter主要組件介紹-監聽器(用表格查看結果)

JMeter主要組件介紹-邏輯控制器

邏輯控制器(Logic Controller)可以自定義JMeter發送請求的行爲邏輯,它與Sampler結合使用可以模擬複雜的請求序列。

循環控制器可以設置請求的循環次數或永遠循環(如果選中永遠的話)。
事務控制器可以將多個請求放在同一個事務中。如果選中Gegerate parent sample,則聚合報告中只顯示事務控制器的數據,而不會顯示其中的各個請求的數據,反之則全部顯示。

JMeter主要組件介紹-斷言

斷言(Assertions)可以用來判斷請求響應的結果是否如用戶所期望的。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對於有效的測試是非常有用的。

JMeter主要組件介紹-配置元件


配置元件(Config Element)維護Sampler需要的配置信息,並根據實際的需要會修改請求的內容。我們主要在參數化中用到CSV Data Set Config


JMeter主要組件介紹-前置處理器和後置處理器

前置處理器(Pre Processors)和後置處理器(Post Processors)負責在生成請求之前和之後完成工作。前置處理器常常用來修改請求的設置,後置處理器則常常用來處理響應的數據。我們主要在動態關聯中用到後置處理器的正則表達式提取器。      

JMeter主要組件介紹-定時器


定時器(Timer)負責定義請求之間的延遲間隔。

參數化設置


在我們的測試計劃中我們使用的都是HTTP請求,在HTTP請求中常常會提交一些參數,我們爲了不想在每一次請求中都使用相同的參數值,就要想辦法讓每一次請求的參數的值都是不一樣的,我們就需要進行參數化設置,這裏我們介紹兩種參數化設置的方法。
一種是利用函數助手中的_Random函數進行參數化設置;
一種是利用配置元件中的CSV Data Set Config進行參數化設置。

參數化設置-函數助手(1)

JMeter中有一個函數助手的功能,裏面內置了多個函數,我們可以利用其中的_Random函數來進行請求中的參數化設置。

在JMeter中選擇“選項-函數助手對話框”打開函數助手對話框。

選擇一個功能_Random。
設定最小值爲1。
設定最大值爲100。
函數名稱設爲func1。
點擊生成將生成一個引用字符串${_Random(1,100,func1},在需要的請求參數中拷貝該字符串即可。
其中函數名稱用來在引用中作區別,即我們可以設定不同的名稱在不同的地方引用同一個函數的功能

例如:我們生成了兩個串${_Random(1,100,func1)}、 ${_Random(1,100,func2)},在添加圖書的請求中,我們在bookName的參數值中引 用${_Random(1,100,func1)},在bookConcern的參數值中應用${_Random(1,100,func2)},見截圖, 這樣測試運行時不同的線程將產生不同的bookName和bookConcern。

參數化設置-CSV Data Set Config(1)


在線程組上點擊右鍵選擇添加-配置元件-CSV Data Set Config,打開CSV Data Set Config。
Filename文件名:即參數化要引用的文件名。這裏是d:\number.txt
File encoding文件編碼:可以不填。
Variable Names(comma-delimited)變量名(用逗號分割):多個變量可以引用同一個文件,用逗號分割。這裏是num1,num2
Delimiter(use ‘\t’ for tab):參數文件中多個變量值的分隔符,\t表示用tab鍵分割,默認是逗號。
Recycle on EOF?:結束後是否循環?默認是True.
Number.txt文件內容見截圖。

參數化設置-CSV Data Set Config(2)


在添加圖書的請求中,我們在bookName的參數值中引用${num1},在bookConcern的參數值中應用${num2},見截圖,這樣測試運行時不同的線程將產生不同的bookName和bookConcern。

動態數據關聯

在HTTP請求的參數中經常會遇到一些參數的值是從服務器相應的動態數據,這些數據需要進行關聯才能使得每一次請求都能成功得被服務器接受,在JMeter中採用正則表達式提取器來獲取這些動態的數據。
正則表達式允許用戶從服務器響應中獲取數據,作爲一個後置處理器,正則表達式提取器會在每一個請求執行後再執行,正則表達式提取請求的參數值,產生模板字符串,並將結果保存到給出的變量中。

動態數據關聯(1)-正則表達式提取器


在HTTP請求的參數中經常會遇到一些參數的值是從服務器相應的動態數據,這些數據需要進行關聯才能 使得每一次請求都能成功得被服務器接受,在JMeter中採用正則表達式提取器來獲取這些動態的數據。比如我們想要獲得從服務器相應的TOKEN,就可以 使用下面的正則表達式提取器。

使用時就可以使用${token_g1}來表示獲取到的TOKEN值。如下圖:

使用命令行運行JMeter腳本


JMeter -n -t my_test.jmx -l log.jtl
-n告知JMeter採用非圖形化運行JMeter腳本
-t指定要運行的腳本文件
-l指定保存執行結果的文件名
執行命令前要檢查當前目錄是否是%JMeter_Home%\bin 目錄;
如果 JMeter 腳本不在當前目錄,需要指定完整的路徑;如果要把執行的結果保存在其他地方也要指定完整的路徑。

利用XSLT分析JMeter結果文件(1)


將結果文件的擴展名改爲xml,例:將log.jtl改爲log.xml。
在log.xml的文件頭
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
中添加
<?xml-stylesheet type=“text/xsl” href=“jmeter-results-report.xsl” ?>
使之變成
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="jmeter-results-report.xsl" ?>
<testResults version="1.2">
其中href指定xsl文件的路徑,如果與xml文件在同一目錄,則只寫文件名即可,否則要寫明詳細路徑。

利用XSLT分析JMeter結果文件(2)

將修改後的xml文件用瀏覽器打開即可得到統計結果

JMeter中進行分佈式測試

作爲一個純 JAVA 的GUI應用,JMeter對於CPU和內存的消耗還是很驚人的,所以當需要模擬數以千計的併發用戶時,使用單臺機器模擬所有的併發用戶就有些力不從心, 甚至還會引起JAVA內存溢出的錯誤。不過,JMeter也可以像 LoadRunner 一樣通過使用多臺機器運行所謂的代理來分擔負載產生器自身的壓力,並藉此來獲取更大的併發用戶數,我們只需手動配置一下即可。
1、在所有期望運行 JMeter作爲 負載產生器的機器上安裝JMeter,並確定其中一臺機器作爲 控制器,其他的機器作爲 代理。然後運行所有 代理 機器上的JMeter-server.bat文件—假定我們使用兩臺機器172.20.80.47和172.20.80.68作爲 代理;
2、在Controller 機器的JMeter安裝目錄下找到 bin 目錄,再找到 jmeter.properties 這個文件,使用記事本或者其他文字編輯工具打開它;
3、 在打開的文件中查找“remote_hosts=”這個字符串,你可以找到這樣一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示運行JMeter代理的機器,這裏需要修改爲“remote_hosts=172.20.80.47,172.20.80.68”;
4、保存文件,並重新啓動控制器機器上的JMeter,並進入啓動 ->遠程啓動菜單項。就會看到我們剛纔添加的兩個代理的地址,選中即可運行,如果想同時啓動所有代理,選擇遠程全部啓動即可。
要進行分佈式測試代理機器上需要添加環境變量,即添加用戶變量JMETER_HOME=d:\jmeter,系統變量中的path中添加d:\jmeter\bin(假設jmeter放在d盤根目錄下)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章