Apache JMeter是100%純java桌面應用程序,被設計用來測試客戶端/服務器結構的軟件(例如web應用程序)。它能夠用來測試包括基於靜態和動態資源程序的性能,例如靜態文件,Java Servlets,Java 對象,數據庫,FTP 服務器等等。JMeter能夠用來在一個服務器、網絡或者對象上模擬重負載來測試它的強度或者分析在不一樣的負載類型下的全面性能。javascript
另外,JMeter可以經過讓大家用斷言建立測試腳原本驗證咱們的應用程序是否返回了咱們指望的結果,從而幫助咱們迴歸測試咱們的程序。爲了最大的靈活性,JMeter容許咱們使用正則表達式建立斷言。php
Apache軟件組織的Stefano Mazzocchi是JMeter的創始人。他編寫它起初是爲了測試Apache JServ的性能(一個已經被Apache Tomcat工程所替代的工程)。咱們從新設計JMeter來加強用戶界面並增長功能測試的能力。css
咱們但願看到做爲開發者利用它的可插入架構使JMeter的功能快速擴展。將來發展的主要目標是在沒有影響JMeter的負載測試能力的狀況下儘量使JMeter成爲最實用的迴歸測試工具。html
開始使用JMeter最容易的方法是首先下載最新版而且安裝它。這個版本包含全部你在構建和運行Web,FTP,JDBC,和JNDI等測試時使用須要的全部文件。java
若是你想執行JDBC測試,你固然須要從供應商獲得適當的JDBC驅動。JMeter沒有提供任何JDBC驅動。mysql
你可能須要下載的其它軟件:linux
詳細參見JMeter Classpath 一章安裝附加的jar包git |
最後, 參見如何構建一個明確類型的測試用例的適合章節。例如,若是你對Web應用測試感興趣,那就參見建立一個Web測試計劃。其餘具體的測試計劃章節是:web
一旦你熟練建立和執行JMeter測試計劃, 經過你的測試計劃你會觀察到給你更多幫助的各類元件的配置(定時器, 監聽器, 斷言, 和其餘)。正則表達式
JMeter 須要最小需求的運行環境。
JMeter須要一個徹底適當的JVM1.4或者更高 |
由於JMeter 僅使用Java標準API, 請不要把由於JRE實現版本而沒法運行JMeter的bug報告提交。
JMeter是100%純Java應用程序而且可以正確的在任何有適當的Java實現的操做系統上運行。
JMeter 在下列環境已經被測試:
若是你計劃作JMeter開發或者想使用SUN的java標準擴展包,你將須要下列更多的可選包。
若是你想編譯JMeter源代碼或者開發JMeter插件,你將須要一個完整的適當的JDK1.4或者更高。
JMeter 使用 Apache的 Xerces XML 解析器,你能夠選擇告訴JMeter使用一個不一樣的XML 解析器。 這樣作,把第三方的解析器的類包包含在JMeter的classpath中, 並更新 jmeter.properties 文件裏的解析器實現的全類名。
JMeter有有限的 Email 能力。 它可以發送基於測試結果的Email,而且支持POP/IMAP 取樣器。它如今不支持 SMTP 取樣。 爲了可以支持 Email, 須要添加Sun 的JavaMail包和activation包到JMeter classpath 。
爲了測試一個使用SSL加密(HPPS)的web服務器, JMeter 須要一個提供SSL實現 (例如 Sun的 Java Secure Sockets Extension - JSSE)。包含須要的加密包到JMeter的classpath。 一樣,經過註冊SSL提供者更新system.properties文件。
JMeter默認協議等級TLS(傳輸層安全性)。這能夠經過修改在jmeter.proerties或者user.properties文件中的"https.default.protocol"來改變。
JMeter被配置接受全部的證書,無論是否信賴和合法時間等。這容許在測試服務器最大靈活性。
若是服務器須要一個客戶端證書,這是能夠提供的。
爲了更好的管理證書,也要有一個SSL 管理器 。
JMeter 代理服務器(見下)不支持記錄SSL(https)。 |
若是你須要JDBC測試,須要添加廠商的JDBC驅動到classpath。確認文件是一個jar文件,而不是zip。
Apache SOAP 須要 mail.jar 和 activation.jar. 你須要下載並拷貝這兩個jar文件到你jmeter/lib 目錄.一旦文件放到那裏,JMeter 會自動找到它們。
爲了運行BeanShell函數或者任何BeanShell測試元件(取樣器,定時器等),你須要從http://www.beanshell.org/下載beanshell的jar文件並拷貝jar文件到jmeter/lib目錄,JMeter會自動找到它。
詳細參見 http://activemq.apache.org/initial-configuration.html
詳細參見JMeter Classpath 一章安裝附加的jar包 |
避免在一個有空格的路徑安裝 JMeter。這將致使遠程測試出現問題。 |
咱們推薦大多數用戶運行最新版本。
要安裝一個構建版本,簡單解壓zip/tar文件到你想安裝JMeter的目錄。保證一個JRE/JDK正確的安裝而且設置環境變量JAVA_HOME,其它不須要作什麼了。
安裝目錄接口應該看到的像這樣一些東西(2.3.1版本):
jakarta-jmeter-2.3.1
jakarta-jmeter-2.3.1/bin
jakarta-jmeter-2.3.1/docs
jakarta-jmeter-2.3.1/extras
jakarta-jmeter-2.3.1/lib/
jakarta-jmeter-2.3.1/lib/ext
jakarta-jmeter-2.3.1/lib/junit
jakarta-jmeter-2.3.1/printable_docs
若是你想的話你能夠重命名父目錄(例如 jakarta-jmeter-2.3.1) ,可是不要改變任何子目錄命。父目錄路徑中不能包含任何空格;若是包含,你運行客戶端-服務器模式會有問題。
要運行JMeter, 運行 jmeter.bat (for Windows) 或者 jmeter (for Unix) 文件。那些文件在bin目錄下。稍微暫停後,JMeter GUI會顯示出來。
在bin目錄你會發現有些附加腳本頗有用。Windows腳本文件(CMD文件須要Win2K或者更新):
注意: LAST能夠在jmeter-n.cmd, jmeter-t.cmd 和 jmeter-n-r.cmd中使用,意味着最後一次測試會運行.
Unix腳本文件; 能夠運行在大多 Linux/Unix 系統.
JMeter 自動從下列目錄中的jar文件發現類。
若是你開發新的JMeter組件,你能夠壓縮它們成jar包並拷貝到JMeter的/lib/ext目錄。JMeter將會自動發如今這裏的任何jar文件中的JMeter組件。
支持的jar文件(類庫)應該放在lib目錄.
若是你不想把擴展jar包放到lib/ext目錄,能夠在jmeter.properties中定義search_paths屬性。不要使用lib/ext給那些公用的jar包;它僅僅是存放JMeter組件。
其餘jar包 (例如 JDBC, 和任何JMeter代碼須要支持的類庫)應該被代替放在lib目錄 - 而不是lib/ext目錄。
注意 |
你能夠在$JAVA_HOME/jre/lib/ext安裝有用的jar文件,或者(自從 2.1.1版本)你能夠在jmeter.properties中設置user.classpath屬性。
注意設置CLASSPATH 環境變量將不起做用。這是由於JMeter 使用"java --jar"啓動,而且java命令無記錄忽略CLASSPATH 變量,而且當使用-jar選項時-classpath/-cp 選項也被使用。[全部的java程序都是這樣,不只僅是JMeter。]
若是你從防火牆/代理服務器後測試,你須要提供給JMeter防火牆/代理服務器的主機名和端口號。這樣作,從命令行使用如下參數運行jmeter.bat/jmeter文件:
-H [代理服務器主機名或者ip地址]
-P [代理服務器端口]
-N [非代理主機] (例如: *.apache.org|localhost)
-u [代理證書用戶名- 若是須要]
-a [代理證書密碼 - 若是須要]
例如 : jmeter -H my.proxy.server -P 8000 -u username -a password -N localhost
或者, 你使用 --proxyHost, --proxyPort, --username, and --password
JMeter也有本身的內建HTTP代理服務器,來記錄HTTP(不是 HTTPS)瀏覽器會話。這是和上面的代理設置描述不混淆的,它是在JMeter發出HTTP或者HTTPS請求時使用的。 |
爲了避免相互影響測試, 你能夠選擇運行沒有用戶界面的JMeter。這樣作,使用下列命令選項:
-n 這是指定JMeter在非用戶界面模式運行
-t [包含測試計劃的JMX文件的名字]
-l [記錄取樣結果的JTL文件的名字]
-r 運行在jmeter.properties文件裏全部的遠程服務器 (或者經過在命令行覆蓋屬性指定遠程服務器)
這個腳本也容許咱們指定可選的防火牆/代理服務器信息:
-H [代理服務器主機名或者ip地址]
-P [代理服務器端口]
例如 : jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000
爲了分佈測試 ,在服務器模式運行JMeter,而且經過用戶界面控制每一臺服務器。
jmeter-server/jmeter-server.bat 腳本使用適當的classpath爲你開始遠程註冊。若是失敗,參見關於JMeter服務器啓動細節。 |
運行jmeter-server/jmeter-server.bat,加上下列選項命令:
這個腳本也容許咱們指定可選的防火牆/代理服務器信息:
-H [代理服務器主機名或者ip地址]
-P [代理服務器端口]
例如 : jmeter-server -H my.proxy.server -P 8000
Java系統屬性,JMeter屬性,和日誌屬性能夠經過命令行直接覆蓋(代替更改jmeter.properties文件)。這樣作,使用下列選項:
-D[prop_name]=[value] - 定義一個java系統屬性值。
-J[prop name]=[value] - 覆蓋一個JMeter屬性。
-L[category]=[priority] - 覆蓋一個日誌設置,設置一個特殊目錄爲給定的優先級。
-L 標誌也可使用沒有目錄名來設置根目錄日誌等級。
例如 :
jmeter -Duser.dir=/home/mstover/jmeter_stuff \
-Jremote_hosts=127.0.0.1 -Ljmeter.engine=DEBUG
jmeter -LDEBUG
注意 |
若是JMeter發現一個錯誤, 一個消息將被寫入日誌文件。日誌文件名在jmeter.properties文件中定義。通常定義爲 jmeter.log 。而且在JMeter啓動目錄,例如bin。
當在Windows下運行時,若是你不設置Windows顯示文件擴展名,文件名會僅顯示爲 JMeter。[你能夠作一些事都很容易地發現假裝成文本文件的病毒和垃圾文件...]
還有記錄錯誤,jmeter.log 文件記錄一些測試運行信息。例如:
10/17/2003 12:19:20 PM INFO - jmeter.JMeter: Version 1.9.20031002
10/17/2003 12:19:45 PM INFO - jmeter.gui.action.Load: Loading file: c:\mytestfiles\BSH.jmx
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Running the test!
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group BSH. Ramp up = 1.
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Continue on error
10/17/2003 12:19:52 PM INFO - jmeter.threads.JMeterThread: Thread BSH1-1 started
10/17/2003 12:19:52 PM INFO - jmeter.threads.JMeterThread: Thread BSH1-1 is done
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Test has ended
日誌文件對發現錯誤緣由頗有幫助,做爲JMeter不會打斷一個測試來顯示一個錯誤對話框。
調用JMeter的 "jmeter -?"命令將打印全部命令選項的一個列表。列表以下:
-h, --help 打印使用信息並退出
-v, --version 打印版本信息並推出
-p, --propfile {argument} 使用的JMeter屬性文件
-q, --addprop {argument} 附加的屬性文件
-t, --testfile {argument} 運行的JMeter測試文件(.jmx)
-l, --logfile {argument} 日誌取樣文件
-n, --nongui 非用戶界面運行JMeter
-s, --server 運行JMeter服務器
-H, --proxyHost {argument} 設置JMeter使用的代理服務器
-P, --proxyPort {argument} 設置JMeter使用的代理服務器端口
-u, --username {argument} 設置JMeter使用的代理服務器用戶名
-a, --password {argument} 設置JMeter使用的代理服務器密碼
-J, --jmeterproperty {argument}={value} 定義附加的 JMeter 屬性
-D, --systemproperty {argument}={value} 定義附加的 System 屬性
-S, --systemPropertyFile {filename} 一個屬性文件被作爲系統屬性添加
-L, --loglevel {argument}={value} 定義日誌等級: [category=]level
例如 jorphan=INFO or jmeter.util=DEBUG
-r, --runremote從非用戶界面模式啓動遠程服務器
-d, --homedir {argument} 使用的JMeter目錄
若是你但願改變JMeter運行時的屬性你須要改變在/bin目錄的jmeter.properties文件,或者建立你本身的jmeter.properties文件而且在命令行指定它。
注意 |
參數
屬性 |
描述 |
須要 |
ssl.provider |
你能夠爲你的SSL實現指定類。若是你想使用來自sun的JSSE,是這 樣:com.sun.net.ssl.internal.ssl.Provider。JMeter默認提供https支持。若是你正在使用JDK1.4, 或者你使用帶JSSE類的jar文件在JMeter的classpath裏的JDK1.4。 |
No |
com.sun.net.ssl.internal.ssl.Provider。 |
JMeter默認提供https支持是在你使用 JDK1.4或者你使用把JSSE類的jar包放到JMeter classpath中的JDK1.3時候。 |
No |
xml.parser |
你能夠指明一個你的XML解析器實現。 默認值是:org.apache.xerces.parsers.SAXParser |
No |
remote_hosts |
逗號分割遠程JMeter主機列表。若是你在一個分佈式環境運行JMeter,列出你用JMeter遠程主機運行的機器。這容許你使用機器的用戶界面控制那些服務器。 |
No |
not_in_menu |
在JMeter選項屏中你不想看到的組件列表。 若是JMeter被添加愈來愈多的組件,你會但願定製JMeter只出現那些你感興趣的組件。你能夠在這兒列出那些類名和他們的類標籤(JMeter的用戶界面出現的字符串), 它們將在選項屏中不出現。 |
No |
search_paths |
列出那些JMeter搜索JMeter附加類的路徑(以;分割);例如附加的取樣器。被添加到lib/ext目錄的任何jar包都被發現。 |
No |
user.classpath |
JMeter搜索的公用類庫的路徑列表。被添加到lib目錄的任何jar包都被發現。 |
No |
user.properties |
附加的JMeter屬性文件名。 初始化屬性文件後它們被添加,可是在-q和-J選項被處理以前。 |
No |
system.properties |
附加的系統屬性文件名。 -S和-D選項被執行前添加。 |
No |
又見 jmeter.properties 文件註釋,在你改變其它設置時會給你更多的信息。
3. 建立一個測試計劃
一個測試計劃描述了一系列Jmeter運行時要執行的步驟。一個完整的測試計劃包含一個或者多個線程組,邏輯控制器,取樣發生控制,監聽器,定時器,斷言和配置元件。
3.1 添加和刪除元件
在一個樹上經過右擊能夠添加元件到一個測試計劃 ,而且從"添加"列表中選擇一個新元件。另外,元件能夠從文件加載而且經過選擇"打開"選項添加。
爲了刪除元件,確保元件被選中,正確在元件上右擊,而且選擇"刪除"選項。
3.2 加載和保存元件
爲了從文件加載元件,右擊將要加載元件到的已經存在的樹元件,並選擇"打開"選項。選擇你的元件保存的文件。JMeter會加載元件到樹中。
爲了保存樹元件,在一個元件上右擊,選擇"保存"選項。JMeter會保存已選的元件,加上全部下面的子元件。用這種方法,你可以保存測試樹的片斷,單獨元件,或者整個測試計劃。
工做臺不會自動保存測試計劃,可是它能夠同上被單獨保存 |
3.3 配置樹元件
在測試樹中的任何元件都在JMeter的右側框架顯示配置。那些配置容許你配置測試元件的細節行爲,對於一個元件什麼能被配置依賴於它是一個什麼類型的元件。
能夠經過拖拉測試樹周圍的元件操做測試樹。 |
3.4 保存測試計劃
雖然這不是必須的,咱們推薦你在運行前保存測試計劃。爲了保存測試計劃,從文件菜單選擇保存測試計劃(使用最新版本,你再也不須要首先選擇測試計劃元件).
JMeter容許你保存整個測試計劃樹或者僅它的一部分.爲了僅保存測試計劃樹中特殊"支"位置的元件,從從這個"支"開始的地方選擇樹中的測試計劃元件 , 而後右擊鼠標訪問保存菜單項.另外選擇合適的測試計劃元件並從編輯菜單選擇保存. |
3.5 運行一個測試計劃
爲了運行一個測試計劃,從"運行"菜單項選擇"開始"。爲了中止你的測試計劃,從一樣的菜單選擇"中止"。JMeter 不會自動給它是否正在運行任何顯示。若是JMeter運行,一些監聽器使它變明顯,可是惟一肯定的方法是檢查"運行"菜單。若是"開始"不可用,"中止" 可用,證實JMeter正在運行你的測試計劃(或者,至少, 它認爲它是)。
有兩個類型的中止命令:
3.6 做用域規則
JMeter測試樹包含元件老是分等級和順序的。在測試樹中的一些元件是嚴格分級(監聽器,配置元件,後置處理器,前置處理器,斷言,定時器),一 些主要是有序的(控制器,取樣器)。當你建立測試計劃時,你將建立一個有序的取樣請求(經過取樣器)列表,那些請求描述了一組步驟的執行。那些請求常組織 在也有序的控制器中。給出以下測試樹:
測試樹例子
請求的順序是 One,Two,Three,Four。
一些控制器影響它的子元件的順序,你能夠在組件參考讀到特定的控制器。
其餘元素是分等級的。例如,一個斷言在測試樹中是分等級的。若是它的父元件是請求,它就被應用於那個請求。若是它的父元件是控制器,它就影響全部那個控制器下的全部請求。以下測試樹:
分級例子
Assertion #1 僅被應用於請求 One, Assertion #2 僅被應用於 請求 Two 和 Three。
另外一個例子,此次使用定時器:
複雜的例子
在這個例子裏,請求的命名錶現它們被執行的順序。Timer #1 應用於 請求 Two, Three, 和 Four (注意對於分等級的元件怎樣的順序是不相關的)。Assertion #1 應用於請求Three。Timer #2 對全部請求有效。
但願那些例子使你弄清了配置(分等級的)元件如何被應用。若是你想每一個請求都被樹分叉拒絕,到它的父元件,到它的父元件的父元件,等等,每次收集全部它的父元件的配置元件,你將看到它如何工做的。
元件首部管理器, Cookie 管理器和受權管理器的配置和默認元件的配置被視爲是不一樣的.默認元件配置的設置被併入取樣器能夠到達的一組值裏了。然而來自管理器的設置沒有併入。若是多於一個管理器在一個取樣器範圍中,僅僅一個被使用,可是如今沒有辦法指定那個被使用。
3.7 錯誤報告
JMeter 把警告和錯誤信息報告在jmeter.log文件中,也有一些測試運行自己的信息.只是偶爾地,JMeter對於某些錯誤是沒法補捉和記錄的,這些信息會 顯示在命令臺上。若是一個測試的執行並非你所期待的,請檢查日誌,也許錯誤會被報告(例如:也許在函數調用上有語法錯誤)。
取樣錯誤(例如:HTTP 404 - 找不到文件)是不會被正常的記錄在日誌中的,取而代之的,他們會被看成取樣結果的屬性來儲存,取樣結果的狀態能被許多不一樣的監聽器所獲得。
4. 測試計劃元件
測試計劃對象有一個叫作"功能測試"複選框。若是被選擇,它會使JMeter記錄來自服務器返回的每一個取樣的數據。若是你在測試監聽器中選擇一個文 件,這個數據將被寫入文件。若是你嘗試一個較小的測試來保證JMeter配置正確而且你的服務器正在返回指望的結果,這是頗有用的。這樣的後果就是這個文 件會快速的增大,而且JMeter的效率會影響。若是你不作壓力測試這個選項應該關閉(默認關閉)。
若是你不記錄數據到文件,這個選項就沒有不一樣了。
4.1 線程組
線程組元件是任何測試計劃的起點。一個測試計劃的全部元件必須在一個線程組下。由名字能夠看出,線程組元件控制JMeter運行測試時使用的線程數。線程組管理容許你:
每一個線程會做爲一個總體執行測試計劃並徹底獨立於他測試線程。多線程用來模擬到達服務器程序的同步鏈接。
Ramp-up period告訴JMeter多久開始"ramp-up"選擇的所有線程。若是使用10個線程,ramp-up period是100秒,那麼JMeter用100秒使全部10個線程啓動並運行。每一個線程會在上一個線程啓動後10秒(100/10)啓動。若是有30 個線程和一個120秒的ramp-up period,那麼每一個連續的線程會延遲4秒。
Ramp-up須要要充足長以免在啓動測試時有一個太大的工做負載,而且要充足小以致於最後一個線程在第一個完成前啓動(除非你想那樣發生)。
使用ramp-up=線程數啓動,並上下調整到所需的。
默認,線程組被配置僅循環一次。
1.9版本引入了一個測試運行*調度器*。 單擊在線程組面板底部的複選框來顯示額外的文本域,在裏面你能夠輸入啓動和結束時間。當測試啓動時,若是必須JMeter會等待啓動時間到達。在每一個週期 結束,JMeter檢驗結束時間是否到達,若是是,運行中止,若是不是測試被容許繼續,直到迭代限制到達。
另外你可使用啓動延遲和持續時間文本域。注意啓動延遲會覆蓋啓動時間,持續時間會覆蓋結束時間。
4.2控制器
JMeter有兩種控制器:取樣器和邏輯控制器。
取樣器告訴JMeter發送請求到服務器。例如,若是你要JMeter發送一個HTTP請求添加一個HTTP請求取樣器。你也能夠經過添加一個或者多個配置元件到一個取樣器來定製一個請求。更多信息,見取樣器。
邏輯控制器讓你定製當發送請求時JMeter使用的判斷邏輯。例如,你能夠添加交替控制器來在兩個HTTP請求取樣器之間交替 。更多信息,見邏輯控制器。
4.2.1 取樣器(Sampler)
取樣器告訴JMeter發送請求到服務器。JMeter取樣器包括:
每一個取樣器有一些你能夠設置的屬性。你能夠經過添加一個或多個配置元件到取樣器來進一步定製它。注意JMeter發送請求按照取樣器出如今樹中的順序。
若是你想發送多個相同類型的請求(例如,HTTP Request)到相同的服務器,能夠考慮使用一個默認配置元件。每一個控制器有一個或者多個默認配置元件(見下)。
記得添加一個監聽器到線程組來查看/保存你的請求結果到磁盤。
若是你對使用JMeter平臺的基礎驗證器到你的請求響應感興趣,添加一個斷言到請求控制器。例如, 在壓力測試一個web程序時,服務器會返回一個成功的HTTP響應代碼,可是這個頁面有錯誤或者被忽略部分。你能夠添加斷言來檢查某個HTML標籤,一些 錯誤字符串,等等。JMeter容許你使用正則表達式建立斷言。
JMeter 內建取樣器
4.2.2 邏輯控制器
保持
邏輯控制器讓你定製當發送請求時JMeter使用的判斷邏輯。邏輯控制器還能夠做爲下列任何元件的子元件:取樣器(請求)、配置元件、和其餘邏輯控制器。邏輯控制器能夠改變來自它們的子元件的請求順序。它們能夠修改請求自己,致使JMeter重複請求,等。
理解邏輯控制器在測試計劃中的效果,考慮下列測試樹:
這個測試的第一件事就是登陸請求僅在第一次通過時被執行。隨後的迭代會忽略它。這應使用僅一次控制器。
登錄後,下一個取樣器加載搜索頁面( 假設一個用登陸的web應用程序,併到達搜索頁面去搜索)。這僅是一個簡單的請求,不會被任何邏輯控制器過濾。
加載搜索頁面後,咱們要作一個搜索。事實上,咱們想作兩個不一樣的搜索。然而,在每一個搜索之間咱們想要本身從新加載搜索頁面。咱們經過4個簡單 HTTP元件這樣作。(load search, search "A", load search, search "B"). Instead, we use the Interleave Controller which passes on one child request each time through the test. It keeps the ordering (ie - it doesn't pass one on at random, but "remembers" its place) of its child elements. Interleaving 2 child requests may be overkill, but there could easily have been 8, or 20 child requests.
注意HTTP默認請求屬於插入控制器。假如"Search A"和"Search B"共享一樣的PATH信息(一個HTTP請求說明中包括域,端口,方法,協議路徑和參數,附加其餘可選項)。兩個搜索請求訪問一樣的後端搜索引擎(比方 說Servle,或者cgi腳本),這樣是說得通的。與其二者都配置使用相同信息的HTTP取樣器,咱們能夠抽象那些新到一個單獨的配置元件。當內部控制 器經過"Search A"或者"Search B"傳遞時,它會從HTTP默認請求配置元件中得到值填充空白。因此咱們能夠爲那些請求保留PATH域爲空,而後把那些信息放到配置元件。在這個例子中, 這至可能是一個很小的好處,但它顯示了這個特性。
在這個樹中下一個元件是另外一個HTTP默認請求,這個時間被添加到線程組自己。這個線程組有一個內建的邏輯控制器,所以它正好使用這個配置元件作爲 上面的描述。它填充任何穿過的請求的空白。 在web程序中你全部的HTTP取樣器元件DOMAIN域爲空,這是極度有用的,替代的,把那些信息放到HTTP默認請求元件中,添加到線程組。經過這樣 作,你能夠在一個同的服務器經過改變你測試計劃中的一個域來測試你的程序。另外,你必須編輯每一個取樣器。
最後一個元件是一個HTTP Cookie管理器。一個Cookie管理器應該添加到全部web測試上-不然JMeter會忽略Cookie。經過在線程組級添加它,咱們能夠肯定全部的線程分享一樣的Cookie。
邏輯控制器能夠組合達到不一樣的結果。見內建邏輯控制器列表。
4.3 監聽器
監聽器提供訪問JMeter收集當JMeter運行的關於測試計劃的信息。
圖形結果監聽器在一張圖上繪製響應時間。
"查看結果樹"監聽器顯示了請求和響應取樣器的細節,而且以基礎的HTML和XML顯示響應表現。
其餘監聽器提供了摘要或者集合信息。
另外,監聽器能夠指導它們收集的數據到一個文件供之後用。在JMeter中每個監聽器提供一個域來指出存儲數據的文件。
在測試中監聽器能夠添加到任何位置。它們僅僅會從它們等級或者它們如下等級的元件收集數據。
伴隨JMeter有不少有趣的監聽器。
4.4 定時器
默認,JMeter線程發送請求時不在請求間暫停。咱們建議你經過添加一個可用的定時器到你的線程組來指定一個延遲。若是你不添加延遲,JMeter會在短期內產生太多請求,可能會壓倒你的服務。
定時器會使JMeter在一個線程開始每一個請求間延遲一段時間。
若是你選擇添加多於一個定時器到一個線程組,JMeter會在執行取樣器前得到定時器數量並暫停那個時間量。
4.5 斷言
斷言容許你斷言關於從測試服務器收到的響應的行爲。使用斷言你本質上你能夠測試你的應用程序返回你指望的結果。
例如,你能夠斷言一個查詢的響應會包含一些特殊的文本。你指定的文本多是Perl風格的正則表達式, 而且你能夠指出這個響應是包含這個文本,仍是匹配整個響應。
你能夠添加一個斷言到任何取樣器。例如你能夠添加一個斷言到HTTP請求檢查文本"</HTML>"。JMeter會檢查在HTTP響應中表現的文本。若是JMeter沒有找到這個文本,它會標記這個爲一個失敗的請求。
爲了查看斷言結果,添加一個斷言監聽器到線程組。
4.6 配置元件
配置元件配合取樣器工做。雖然它不發送請求(除了HTTP代理服務器),可是它能夠添加或者修改請求。
一個配置元件進能訪問有所代替元件所在的樹分支的內部。例如,若是你在一個簡單邏輯控制器裏面設置一個HTTP Cookie管理器,Cookie管理器很容易訪問"web Page 1"和"web Page 2"HTTP請求。可是不能訪問"web Page 3"。
一樣,一個在樹枝內部的配置元件比在父支的一樣元件有更高的優先級。例如,咱們定義兩個HTTP默認請求元件,"Web Defaults 1"和"Web Defaults 2"。 若是咱們把"Web Defaults 1"放置在一個循環控制器內部,僅"Web Page 2"能夠訪問它。另外一HTTP請求會使用"Web Defaults 2",若是咱們把它放置在線程組 (全部其餘分支的父支)。
圖 1 - 測試計劃展現配置元件的可達性
4.7 前置處理器元件
前置處理器在取樣器請求創建前執行一些行爲。若是前置處理器附屬於取樣器元件,那麼它會僅在那個取樣器元件運行前執行。前置處理器最經常使用來在取樣請求運行前修改它的設置,或者更新不能從響應文本提取的變量。 當前置處理器執行時,詳細信息見做用域規則。
4.8 後置處理器元件
後置控制器在取樣器請求創建後執行一些行爲。若是後置處理器附屬於取樣器元件,那麼它會僅在那個取樣器元件運行後執行。後置處理器最經常使用來處理響應數據,經常使用來從它裏面提取數值。\\\\\\詳細見做用域規則關於前置處理器執行。
4.9 執行順序
Please note that Timers, Assertions, Pre- and Post-Processors are only processed if there is a sampler to which they apply. Logic Controllers and Samplers are processed in the order in which they appear in the tree. Other test elements are processed according to the scope in which they are found, and the type of test element. [Within a type, elements are processed in the order in which they appear in the tree]. |
For example, in the following test plan:
The order of execution would be:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1
Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1
4.10 Properties and Variables
JMeter properties are defined in jmeter.properties (see Gettting Started - Configuring JMeter for more details).
Properties are global to jmeter, and are mostly used to define some of the defaults JMeter uses. For example the property remote_hosts defines the servers that JMeter will try to run remotely. Properties can be referenced in test plans - see Functions - read a property - but cannot be used for thread-specific values.
JMeter variables are local to each thread. The values may be the same for each thread, or they may be different.
If a variable is updated by a thread, only the thread copy of the variable is changed. For example the Regular Expression Extractor Post-Processor will set its variables according to the sample that its thread has read, and these can be used later by the same thread. For details of how to reference variables and functions, see Functions and Variables
Note that the values defined by the Test Plan and the User Defined Variables configuration element are made available to the whole test plan at startup. If the same variable is defined by multiple elements, then the last one takes effect. Other elements such as the User Parameters Pre-Processor or Regular Expression Extractor Post-Processor may be used to redefine the same variables. These redefinitions only apply to the current thread.
Note that global variables cannot be updated during a test. The setProperty function can be used to define a JMeter property. These are global to the test plan, so can be used to pass information between threads.
5.建立一個Web測試計劃
在這一部分,你將學會如何建立一個基礎的測試計劃來測試一個Web站點,你將會建立5個用戶向Jackrta網站上的兩個網頁發送請求。一樣,你要告訴用戶運行測試兩次。這樣,總的HTTP發送請求爲(5個用戶*2次請求*重複2次)=20。要建立這個測試計劃,你將會用到下面的元件:線程組,HTTP請求,HTTP請求默認值和圖形結果。
要建立更好的測試計劃,能夠參考建立一個高級web測試計劃 。
5.1添加用戶
處理每一個JMeter測試計劃的第一步就是添加線程組元件。這個線程組會告訴JMeter你想要模擬的用戶數量,用戶應該發送請求的頻率和應該發送的數量。
下一步來添加一個線程組:
首先選擇這個測試計劃,用鼠標右鍵點擊而後在獲得的菜單中選擇"添加"--> "線程組"。
這時你應該看到這個線程組已經在測試計劃下面了,若是沒有看到,就點擊測試計劃元件展開這個測試計劃樹。
下一步,你須要修改這些默認的屬性。若是你尚未選擇線程組元件,則從測試計劃樹型結構中選擇它。這時你應該看到JMeter窗口右邊的線程組控制面板了。
圖5.1. 線程組默認值
首先給這個線程組起一個有意義的名字。在名稱域中, 輸入Jakarta Users.
下一步,增長用戶的數量(稱爲線程)爲5。
域Ramp-Up Period:,使用默認值爲0。這個屬性表示每一個用戶啓動的遲延時間。例如,若是你輸入Ramp-Up Period爲5秒,JMeter將會在5秒結束前完成啓動全部的用戶。因此,若是你有五個用戶而且Ramp-Up Period爲五秒,那麼開始用戶的延遲就是1秒。(5個用戶 / 5秒 = 1 用戶每秒)。若是你設置其值爲0,JMeter將會當即啓動你全部的用戶。
域Loop Count:取消標記爲"永遠"的複選框選擇並設置循環次數爲2。 這個屬性表示你的測試的重複次數。若是你設置爲1,JMeter將你的測試只運行一次。 要讓JMeter不斷的運行,你要選擇"永遠"這個複選框。
在大多數的應用程序中,你須要手動來接受你在控制面板中所作的修改。但在JMeter中,若是你作了修改,控制面板能夠自動的接受。若是你修改的元件的名字,當你離開控制面板後樹型菜單自動更新(例如, 當你選擇另一個樹元件)。 |
見圖 5.2 爲完整的Jakarta Users線程組。
圖 5.2. Jakarta Users 線程組
5.2添加默認HTTP請求屬性
咱們已經定義了用戶,如今要定義他們的行爲了。在這一部分,你將學會對你的HTTP請求設置默認值。而後在5.3節,用你在這裏指定的默認設置來添加HTTP請求元件。
首先選擇Jakarta Users(就是剛纔的線程組)元件,右鍵點擊並在彈出的菜單中選擇"添加"-->"配置元件"-->"HTTP請求默認值"。 而後選擇這個新元件來顯示其控制面板(見圖5.3)。
圖5.3. HTTP 請求默認值
跟大多數的JMeter元件同樣, HTTP請求默認值控制面板也有一個名稱域。在這個例子中將它保留爲默認值。
下面這個文本域是Web服務器的服務器/IP。對於你建立的測試計劃,全部的HTTP請求都將發送到相同的Web服務器jakarta.apache.org。向這個域中輸入這個域名,這是惟一一個須要咱們去修改它的默認值的文本域,其它的文本域都保留它們的默認值。
HTTP請求默認值元件並不告訴JMeter來發送HTTP請求,它僅僅定義這個HTTP請求所用的默認值。 |
見圖5.4完整的HTTP請求默認值元件
圖5.4. 測試計劃的HTTP 默認值
5.3添加 Cookie 支持
除非你的應用程序明確的不使用Cookies,幾乎全部的網站應用程序都會使用cookie支持。要添加cookie支持,能夠簡單的在你的測試計 劃中給每個線程組添加一個 HTTP Cookie管理器。這樣確保每一個線程組有本身的cookies,可是共享跨越全部的HTTP請求對象。
添加 HTTP Cookie管理器,簡單地選擇這個線程組,選擇添加-->配置元件-->HTTP Cookie管理器,也能夠從編輯菜單或經過右鍵點擊來實現添加。
5.4添加 HTTP 請求
在這個測試計劃中,咱們須要實現兩個HTTP請求。第一個就是 Jakarta網站首頁(http://jakarta.apache.org/),第二個就是工程嚮導網頁(http://jakarta.apache.org/site/guidelines.html)。
JMeter按照它們在樹的出現的次序來發送請求。 |
首先給Jakarta Users元件添加第一個HTTP請求 (添加--> 取樣器--> HTTP 請求)。而後從樹中選擇HTTP請求元件並修改下列屬性(見圖5.5):(取樣器就是sampler)
圖 5.5. Jakarta首頁的HTTP請求
下一步,添加每二個HTTP請求並修改下列屬性(見圖5.6):
圖 5.6. Jakarta工程Guidelines頁的HTTP請求
5.5 添加一個監聽器來瀏覽/儲存測試結果
最後一個須要添加到測試計劃的元件是監聽器 。這個元件的用途是將全部的HTTP請求結果存儲在一個文件中並顯現出數據的可視模型。
選擇Jakarta Users 元件,而後添加一個"圖形結果"監聽器 (添加--> 監聽器-->圖形結果). 接着,你須要指定一個文件路徑和輸出文件名。你能夠在文件名域中輸入或選擇瀏覽按鈕並選擇一個路徑而後輸入文件名。
圖 5.7. 圖像結果監聽器
5.6 登陸一個web站點
在這它不是一個例子,可是一些網站須要在許可你作某些操做前登陸.在一個web瀏覽器中,登陸會表現爲一個包含用戶名,密碼和一個提交按鈕的表單. 這個按鈕產生一個POST請求,傳遞表單的值做爲參數.It's not the case here, but some web-sites require you to login before permitting you to perform certain actions. In a web-browser, the login will be shown as a form for the user name and password, and a button to submit the form. The button generates a POST request, passing the values of the form items as parameters.
在JMeter中這樣作,添加一個HTTP請求,並設置爲POST方法.你還要經過表單知道域的名字和目標頁面.經過查看那登錄頁面的代碼能夠發現 它們.To do this in JMeter, add an HTTP Request, and set the method to POST. You'll need to know the names of the fields used by the form, and the target page. These can be found out by inspecting the code of the login page. [若是這比較難作,你可使用JMeter代理記錄器來記錄登陸順序.If this is difficult to do, you can use the JMeter Proxy Recorder to record the login sequence.] 設置路徑爲提交按鈕的目標.單擊添加按鈕並輸入用戶名和密碼資料.有時登陸表單包含附加的隱藏域.它們也須要被添加.Set the path to the target of the submit button. Click the Add button twice and enter the username and password details. Sometimes the login form contains additional hidden fields. These will need to be added as well.
Figure 5.8. Sample HTTP login request
在這章,你將學到如何建立高級測試計劃來測試web站點。
若是須要一個基礎的測試計劃例子,見建立一個web測試計劃 。
若是你的web應用程序使用URL重寫,而不是cookies保存會話信息,那麼爲了測試你的站點你將須要作一點額外的工做。
爲了正確響應URL重寫,JMeter須要解析從服務器獲得的HTML並獲取惟一的會話ID。利用適當的HTTP URL重寫修改器來完成這些。 簡單地在修改器中輸入你的會話ID參數名,它會找到它並添加它到每個請求。若是請求已經有一個值,它將會被替代。若是"緩存會話Id?"被選中,那麼最 後建立的會話ID將被保存,而且若是HTTP的上次取樣不包含一個會話ID,它將會被使用。
URL 重寫例子
下載這個例子.在圖1中展現了一個使用URL重寫的測試計劃。注意URL重寫修改器附被添加到簡單控制器,所以確認它僅影響簡單控制器下的請求.
圖 1 - 測試樹
在圖2中,咱們看到了URL重寫修改器的GUI,它僅僅有一個讓用戶指定會話ID參數名的文本域。 有一個複選框來指示會話ID將被化爲爲路徑 (以";"隔開),這樣賽過使用一個請求參數。
圖 2 - 請求參數
HTTP消息頭管理器容許你定製JMeter在HTTP請求消息頭髮送什麼信息。這個消息頭包括像"User-Agent", "Pragma", "Referer"等屬性。
HTTP消息頭管理器像HTTP Cookie管理器同樣,若是你由於一些緣由你不但願在你的測試裏爲不一樣的HTTP請求對象指定不一樣的消息頭,能夠添加到線程組等級。
7. 建立一個數據庫測試計劃
在這一部分,你將學會如何去建立一個基礎的測試計劃來測試一個數據庫服務器。你會建立10個用戶來給數據庫服務器發送2次SQL請求。一樣,你也可讓用戶運行他們的測試三次。這樣總的JDBC請求數量就是(10用戶)*(2次請求)*(重複3次)=60。要構建這個測試計劃,你將會用到下面的元件:線程組,JDBC請求,圖形結果。
這個例子使用了MySQL數據庫驅動。要使用這個驅動,它所包涵的.jar文件必須複製到../lib/directory下(詳情參見JMeter's ClassPath)。 |
7.1 添加用戶
處理每一個JMeter測試計劃的第一步就是添加線程組元件。這個線程組會告訴JMeter你想要模擬的用戶數量,用戶應該發送請求的頻率和應該發送的數量。
開始來添加一個線程組:首先選擇這個測試計劃,點擊鼠標右鍵獲得添加菜單,而後選擇添加-->線程組。
這時你應該看到這個線程組已經在測試計劃下了,若是沒有看到,就點擊測試計劃元件展開這個測試計劃樹。
下一步,你須要修改這些默認的屬性。若是你尚未選擇線程組元件,則從測試計劃樹型結構中選擇它。這時你應該看到JMeter窗口右邊的線程組控制面板了(見下圖7.1)。
Figure 7.1. Thread Group with Default Values
首先給這個線程組起一個有意義的名字。在名稱域中, 輸入JDBC Users。
你將須要一個可用的數據庫,數據庫表,和表的用戶使用權限。在這個例子中,數據庫是'mydb',表名是'Stocks'。 |
接下來,將用戶的數量(即線程)增長到10。
在下一個Ramp-Up Period文本域中, 使用默認值0。這個屬性表示每一個用戶啓動的遲延時間。例如,若是你輸入Ramp-Up Period 爲5秒,JMeter將會在五秒結束前完成啓動全部的用戶。因此,若是你有五個用戶而且Ramp-Up Period爲五秒,那麼啓動用戶的延遲就是1秒。(5個用戶/5秒 = 1用戶每秒). 若是你設置其值爲0,JMeter將會當即啓動你全部的用戶。
最後,輸入循環次數爲3。 這個屬性告訴JMeter你的測試運行多少次。若是你設置爲1,JMeter將你的測試只運行一次。 要讓JMeter不斷的運行,你要選擇"永遠"這個複選框。
在大多數的應用程序中,你須要手動來接受你在控制面板中所作的修改。但在JMeter中,若是你作了修改,控制面板能夠自動的接受。若是你修改的元件的名字,樹型菜單當你離開控制面板後自動更新。 (例如, 當你選擇另一個樹元件。) |
見圖7.2 完整的JDBC Users線程組.
圖7.2. JDBC Users線程組
7.2 添加JDBC請求
如今咱們已經定義了用戶,是時候定義他們。在這一部分,咱們將會詳細說明JDBC請求的執行。
首先選擇JDBC用戶元件,點擊鼠標右鍵,獲得添加菜單,而後選擇添加-->配置元件-->JDBC鏈接配置。接着,選擇這個新元件來顯示它的控制面板(見圖7.3)。
設定下面的文本域(咱們這裏假定用一個名爲test的本地MySQL數據庫)。
剩下的域保留默認值。
圖 7.3. JDBC配置
再次選擇JDBC用戶元件。點擊鼠標右鍵,獲得添加菜單,而後選擇添加-->Sampler-->JDBC請求。而後,選擇這個新元件來顯示其控制面板(見圖7.4)。
圖 7.4. JDBC請求
在咱們這個測試計劃中,咱們將發送2個JDBC請求。第一個是向Eastman Kodak stock,第二個是向Pfizer stock(很顯然須要改變這些例子來適合你的特殊的數據庫)。下面有插圖文字說明。
JMeter發送請求的次序就是你向樹中添加它們的次序。 |
開始編輯下列的屬性(見圖7.5):
圖 7.5. Eastman Kodak stock的JDBC請求
下一步,添加第二個JDBC請求並編輯下列的屬性(見圖7.6):
圖 7.6. Pfizer stock的JDBC請求
7.4 添加一個監聽器瀏覽/保存測試結果
你須要添加到你測試計劃的最後元件是一個監聽器。這個元件責任是儲存全部你的JDBC請求結果到文件,而且展現一個可視數據模型。
選擇JDBC用戶元件,添加一個圖形結果監聽器(添加-->監聽器-->圖形結果)。
圖 7.7. 圖像結果監聽器
8 建立一個FTP測試計劃
在這章,你將學習到如何建立一個基本的測試計劃來測試FTP站點。你將爲在O'Reilly的FTP站點上的兩個文件建立四個發送請求的用戶。一樣,你將告訴用戶運行測試兩次。因此整個測試數目是(4個用戶)*(2個請求)*(重複2次)=16個FTP請求。爲了構造測試計劃,你將須要使用下列元件:測試線程,FTP請求,FTP默認請求和Spline Visualizer。
這個例子使用O'Reilly的FTP站點,www.oro.com。當運行這個例子時請考慮周到,而且(若是可能)考慮再次運行其餘FTP站點。 |
8.1 添加用戶
你想處理每一個JMeter測試計劃的第一步是添加線程組元件。線程組告訴JMeter你想模擬的用戶數,用戶發送請求的頻率,和發送請求的數量。
順便說一下,首先選擇測試計劃,右鍵點擊獲得"添加"菜單,而且選擇"添加"-->"線程組",經過這種方式添加線程組。
如今你應該看到了測試計劃下的線程組元件了。若是你看不到這個元件,單擊測試計劃元件展開測試計劃樹。
下一步,你須要修改默認配置。若是你尚未選擇線程組元件,在樹裏選擇它。如今在JMeter窗口右部你應該能夠看到線程組控制面板。
(見下圖8.1)
圖8.1 使用默認值的線程組
首先給線程組起一個更加有意義的名字。在名稱域,輸入O'Reilly Users。
下一步,增長用戶數(稱做線程)到四個。
在下一個文本域——Ramp-UP Period,使用默認值0秒。這個屬性告訴JMeter啓動每一個用戶之間的時間間隔。例如,你輸入Ramp-Up Period 爲五秒,JMeter將會在最後5秒結束前啓動全部你的用戶。因此,若是咱們有5個用戶和一個5秒的Ramp-Up Period,那麼啓動用戶的延遲就是1秒(5用戶/5秒=1用戶每秒)。若是你設置爲那個值爲零,那麼JMeter將會馬上啓動因此你的用戶。
最後,清除標爲"永遠"的複選框,而且在循環次數文本域中輸入2。這個屬性告訴JMeter重複你的測試的次數。若是你輸入循環次數爲0,那麼JMeter將會運行你的測試一次。爲了讓JMeter重複運行你的測試計劃,選擇永遠複選框。
在大部分應用程序中,你必須在控制面板中手工改變。然而,在JMeter中,控制面板中自動接受你作的改變。若是你修改元件名,這個樹會在你離開控制面板前自動使用新的文本更新這個樹(例如,當你選擇另外一個樹元件時)。 |
見圖8.2 完整的O'Reilly Users線程組。
圖8.2 O'Reilly Users線程組
8.2 添加默認FTP請求配置
既然咱們已經定義了咱們的用戶,是時間定義他們要執行的任務了。在這一節,你將爲你的FTP請求指定默認設置。而後在8.3節,你將會添加使用你在這裏指定的一些默認設置的FTP請求元件。
首先選擇O'Reilly Users元件。右鍵點擊獲得"添加"菜單,而後選擇"添加" --> "配置元件" --> "FTP默認請求"。因而選擇新的元件預覽它的控制面板(見圖8.3)。
圖8.3 FTP默認請求
像大多數JMeter元件同樣,FTP默認請求控制面板有一個你能夠修改的名稱域。在這個例子裏,保持這個文本域使用默認值。
忽略下一個文本域,它是FTP服務器的服務器名/IP。爲了你正在構建的測試計劃,全部的FTP請求將會發送到相同的FTP服務器,ftp.oro.com。輸入域名到這個文本域。這是惟一一個須要咱們去修改它的默認值的文本域,因此保持剩餘的文本域使用它們的默認值。
FTP默認請求元件沒有告訴JMeter發送一個FTP請求。它只是簡單定義了FTP請求元件使用的默認值。 |
見圖8.4 完整的FTP默認請求元件。
圖8.4 咱們測試計劃的FTP默認
8.3 添加FTP請求
在咱們的測試計劃中,咱們須要製做兩個FTP請求。第一個是O'Reilly下的mSQL下的java下README文件(ftp://ftp.oro.com/pub/msql/java/README),第一個文件是tutorial文件(ftp://ftp.oro.com/pub/msql/java/tutorial.txt)。
JMeter按照它們在樹中出現的順序發送請求。 |
首先添加第一個FTP請求到O'Reilly Users元件(添加 --> 取樣器 --> FTP 請求)。而後在樹中選擇FTP請求元件,而且編輯下列屬性(見圖8.5):
由於你已經在FTP默認請求元件中指定了服務器名,因此你不須要設置這個值了。 |
圖8.5 O'Reilly mSQL java README文件的FTP請求
下一步,添加第二個FTP請求,並修改下列屬性(見圖8.6):
圖8.6 O'Reilly mSQL java tutorial文件的FTP請求
8.4 添加一個監聽器瀏覽/保存測試結果
你須要添加到你測試計劃的最後元件是一個監聽器。這個元件責任是儲存全部你的FTP請求結果到文件,而且展現一個可視數據模型。
選擇O'Reilly Users元件,添加一個Spline Visualizer監聽器(添加 --> 監聽器 --> Spline Visualizer)。
圖8.7 Spline Visualizer監聽器
9 構建一個LDAP測試計劃
在這一節,你將學習到如何建立一個基本的測試計劃來測試一個LDAP服務器。你將爲在LDAP上的四個測試建立四個用戶發送請求。一樣,你要告訴用 戶運行測試兩次。因此,整個請求次數是(4用戶)x (4請求)x (重複2次)=32 LDAP請求。爲了構造測試計劃,你將使用下列元件:線程組,LDAP請求,LDAP請求默認值和表格視圖結果。
這個例子,假定在你的本地機器上已經安裝了LDAP服務器。
9.1 添加用戶
你想使用JMeter測試計劃的第一步是添加一個線程組元件。線程組告訴JMeter你想要模擬的用戶數,用戶多長時間發送一次請求,和它們發送多少個請求。
繼續進行,經過首先選擇測試計劃添加線程組,單擊鼠標右鍵獲得"添加"菜單,而後選擇"添加"-->"線程組"來添加一個線程組。你如今應該在測試計劃下看到線程組。若是你沒有看到這個元件,那麼經過單擊測試計劃元件展開測試計劃樹。
圖9.1 線程組默認值
9.2 添加登陸配置元件
開始選擇Siptech User元件。點擊鼠標右鍵獲得添加菜單,而後選擇"添加"--> "配置元件" --> "登陸配置"元件。而後選擇這個新元件來查看它的控制面板。
像大多JMeter元件同樣,登陸配置元件控制面板有名稱域你能夠修改。在這個例子中,保留它爲默認值。
圖9.2 登陸配置元件測試計劃
9.3 添加LDAP請求默認值
開始選擇Siptech User元件。單擊鼠標右鍵獲得添加菜單,而後選擇"添加"-->"配置元件"-->"LDAP請求默認值"。選擇這個新元件來查看它的控制面板。
像大多JMeter元件同樣,LDAP請求默認值控制面板有名稱域你能夠修改。在這個例子中,保留它爲默認值。
圖9.3 LDAP請求默認值測試計劃
在DN域輸入"你服務器的根DN"。 |
9.4 添加LDAP請求
在咱們測試計劃咱們須要準備四個LDAP請求。
JMeter以添加它們到樹的順序發送請求。開始添加第一個LADP請求到Siptech User元件(添加-->LDAP請求)。而後,在樹中選擇LDAP請求元件,編輯下列屬性
圖9.4.1 Inbuilt Add test LDAP請求
你不須要設置服務器域和端口域,用戶名,密碼和DN,由於你已經在Login Config Element和LDAP請求默認值中指定了。
下一步,添加第二個LDAP請求,編輯下列屬性
圖9.4.2 Inbuilt Modify test LDAP請求
圖9.4.3 Inbuilt-Delete Test LDAP請求
圖9.4.4 Inbuilt-Search Test LDAP請求
9.5 添加一個監聽器瀏覽/保存測試結果
你須要添加到你測試計劃的最後元件是一個監聽器。這個元件責任是保存全部你的LDAP請求結果到一個文件,而且顯示一個可視化數據模型。選擇Siptech Users元件,添加一個表格視圖結果(添加-->表格視圖結果)。
圖9.5表格視圖結果監聽器
9.6 保存測試計劃
雖然它不是須要的,可是咱們推薦你在運行前保存測試計劃到一個文件。爲了保存測試計劃,從文件菜單選擇保存測試計劃(使用最新版本,它再也不須要首先選擇測試計劃元件)。
JMeter容許你保存這個測試計劃樹或者僅僅其中一部分。爲了僅保存在測試計劃樹上的特殊"分支",選擇在樹中用來啓動"分支"的測試計劃元件,而後右擊在菜單項中選擇"保存"。或者,選擇合適測試計劃元件,而後從編輯菜單選擇保存。 |
9.7 運行測試計劃
從運行菜單,選擇運行。
若是你測試正在運行,JMeter在右手上方的角落點亮一個綠正方形顯示。當全部測試中止,那個方塊變成灰色。即便你選擇了"中止",綠光依然會繼續持續,直到全部測試都已經退出。 |
10構建一個Web服務測試計劃
在這章,你將學習如何建立一個測試web服務的測試計劃。你將建立五個發送請求到一個頁面的用戶。同時,你將告訴用戶運行他們的測試兩次。因此整個 請求是(5用戶)*(1請求)*(重複2次)=10HTTP請求。爲了構造測試計劃,你將須要使用如下元件:測試計劃、Web服務(SOAP)請求 (beta版代碼)和圖表結果。
General notes on the webservices sampler.如今實現使用Apache SOAP驅動程序,須要來自sun的activation.jar和mail.jar包。因爲協議限制,JMeter沒有包含這些jar文件到二進制版 本。請查閱SOAP文檔的將來細節。
若是取樣器表現出從web服務中獲得一個錯誤,仔細檢查SOAP消息,確認格式正確。細節方面,確認xmlns屬性和WSDL是同樣的。若是xml 命名空間是不一樣的,web服務將會可能返回一個錯誤。Xmethods爲那些想要測試他們的測試計劃的人包含了一系列公用的web服務。
10.1添加用戶
你想處理每一個JMeter測試計劃的第一步是添加線程組元件。線程組告訴JMeter你想模擬的用戶數,用戶發送請求的頻率,和發送請求的數量。
順便說一下,首先選擇測試計劃,右鍵點擊獲得Add菜單,而且選擇Add->ThreadGroup,經過這種方式添加線程組。
如今你應該看到了測試計劃下的線程組元件了。若是你看不到這個元件,單擊測試計劃元件展開測試計劃樹。
下一步,你須要修改默認配置。若是你尚未選擇線程組元件,在樹裏選擇它。如今在JMeter窗口右部你應該能夠看到線程組控制面板。
(見下10.1)
圖10.1 使用默認值的線程組
首先給線程組起一個更加有意義的名字。在name文本域,輸入O'Reilly Users。
先一步,增長用戶數(調用線程)到四個。
在下一個文本域——Ramp-UP Period,使用默認值0秒。這個屬性告訴JMeter啓動每一個用戶之間的時間間隔。例如,你輸入Ramp-Up Period 爲五秒,JMeter將會在最後5秒結束前啓動全部你的用戶。因此,若是咱們有5個用戶和一個5秒的Ramp-Up Period,那麼啓動用戶的延遲就是1秒(5用戶/5秒=1用戶每秒)。若是你設置爲那個值爲零,那麼JMeter將會馬上啓動因此你的用戶。
最後,清除標爲"Forever"的複選框,而且在循環次數文本域中輸入2。這個屬性告訴JMeter重複你的測試的次數。若是你輸入循環次數爲0,那麼JMeter將會運行你的測試一次。爲了讓JMeter重複運行你的測試計劃,選擇Forever複選框。
在大部分應用程序中,你必須在控制面板中手工改變。然而,在JMeter中,控制面板中自動接受你作的改變。若是你修改元件名,這個樹會在你離開控制面板前自動使用新的文本更新這個樹(例如,當你選擇另外一個樹元件時)。 |
見圖10.2 完整的Jakarta Users線程組。
圖10.2 Jakarta Users線程組
10.2添加web服務請求
在咱們的測試計劃,咱們將使用一個.NET web服務。自從你在使用web服務取樣器,咱們將不用深究寫一個web服務的細節。若是你不知道如何寫一個web服務,使用google搜索web服務 並本身去熟悉寫java和.NET的web服務。應該注意的是.NET和Java的web服務實現有很大的不一樣。這個主題包含在用戶手冊太寬了。請參考其 他源代碼來獲得更好的不一樣之處的概念。
JMeter發送請求是以它們出如今書中的順序。 |
開始添加Web服務(SOAP)請求(Beta代碼)取樣器到Jakarta Users元件(添加-->取樣器-->Web服務(SOAP)請求(Beta代碼))。而後,在樹中選擇web服務請求元件並設置下列屬性(見圖10.5):
圖10.3 Web服務請求
若是WSDL文件加載正確,"Web方法"下拉框將會增長元素。若是下拉框仍然爲空,它說明獲得WSDL文件有問題。你可使用瀏覽器讀取XML測試WSDL。例如,若是你測試一個IIS web服務,URL會像這樣:http://localhost/myWebService/Service.asmx?WSDL。在這點,"SOAPAction","URL","SOAPData"應該爲空。
下一步,選擇web方法並點擊"配置"。取樣器應該會填充"URL"和"SOAPAction"文本域。加入WSDL文件有效,正確的SOAPAction會輸入。
最後一步是在"SOAP/XMl-RPC"文本域粘貼SOAP消息。
11. 構建一個JMS點對點測試計劃
在本節中,你將學會如何建立一個測試計劃來測試JMS點對點的解決方案。測試的創建是一個有五個線程的線程組,經過每一個請求隊列發送4個消息。一個固定的回覆隊列將用來監聽應答消息。每一個1到10次迭代。構建測試計劃,你將使用下列元件:線程組,JMS點對點和圖形結果。
大概介紹一下JMS。如今有兩種JMS取樣器。一個使用JMS主題,另外一個使用隊列。主題消息一般被稱做發佈/訂閱消息。它通常使用的狀況是一個生產者發佈消息,多個訂閱者來消費。
11.1 添加一個線程組
你想使用JMeter測試計劃的第一步是添加一個線程組元件。線程組告訴JMeter你想要模擬的用戶數,用戶多長時間發送一次請求,和它們發送多少個請求。
繼續進行,經過初次的選擇測試計劃添加線程組,單擊鼠標右鍵獲得一個菜單,而後選擇添加-->線程組來添加一個線程組。
你如今應該在測試計劃下看到了線程組。若是你沒有看到這個元件,而後經過單擊測試計劃元件展開測試計劃樹。
下一步,你須要修改默認屬性。若是你尚未選擇線程組元件,那麼在這個樹中選擇它。你如今應該在JMeter窗口的右邊部分看到了線程組控制面板。(見下圖:11.1)
圖11.1使用默認值的線程組
開始,爲咱們的線程組提供一個更加有描述性的名字。在name域,輸入Point-to-Point。
下一步,增長用戶數(即線程)到5。
在下一個域中,Ramp-Up週期,保持默認值0秒。這個屬性告訴JMeter啓動每一個用戶之間有多長延遲。例如,若是你輸入Ramp-up週期爲 5秒,JMeter會到5秒末完成啓動全部你的用戶。因此若是咱們有五個用戶和一個5秒的Ramp-up週期,那麼啓動用戶之間的延遲將會是1秒(5用戶 /5秒=1用戶每秒)。若是你設置爲那個值爲零,那麼JMeter將會馬上啓動因此你的用戶。
最後,清除標爲"Forever"的複選框,而且在循環次數域中輸入4。這個屬性告訴JMeter重複你的測試的次數。若是你輸入循環次數爲0,那麼JMeter將會運行你的測試一次。爲了讓JMeter重複運行你的測試計劃,能夠選擇Forever複選框。
在大部分應用程序中,你必須在控制面板中手工改變。然而,在JMeter中,控制面板中自動接受你作的改變。若是你修改元件名,這個樹會在你離開控制面板前自動使用新的文本更新這個樹(例如,當你選擇另外一個樹元件時)。 |
11.2 添加點對點取樣器
確認你須要的jar文件在JMeter的lib目錄下。若是它們不在,中止JMeter,拷貝jar文件過去,而後重啓JMeter。
開始添加JMS點對點取樣器到Jakarta用戶元件(添加-->JMS點對點)。而後,在樹中選擇JMS點對點取樣器元件。在構建例子中將提供一個使用ActiveMQ3.0工做的配置。
11.3 添加一個監聽器瀏覽/保存測試結果
你須要添加到你測試計劃的最後元件是一個監聽器。這個元件責任是保存全部你的HTTP請求結果到一個文件,而且顯示一個可視化數據模型。
選擇Jakarta Users元件,添加一個圖形結果監聽器(添加-->圖形結果)。下一步,你須要指定一個目錄和一個輸出文件名。你能夠,選擇瀏覽按鈕,瀏覽一個目錄,而後輸入一個文件名。
圖11.2圖形結果監聽器
11.4 保存測試計劃
雖然它不是須要的,可是咱們推薦你在運行前保存測試計劃到一個文件。爲了保存測試計劃,從文件菜單選擇保存測試計劃(使用最新版本,它再也不須要首先選擇測試計劃元件)。
JMeter容許你保存這個測試計劃樹或者僅僅其中一部分。爲了僅保存在測試計劃樹上的特殊"分支",選擇在樹中用來啓動"分支"的測試計劃元件,而後右擊在菜單項中選擇"保存"。或者,選擇合適測試計劃元件,而後從編輯菜單選擇保存。 |
11.5 運行測試計劃
從運行菜單,選擇運行。
若是你測試正在運行,JMeter在右手上方的角落點亮一個綠正方形顯示。當全部測試中止,那個方塊變成灰色。即便你選擇了"中止",綠光依然會繼續持續,直到全部測試都已經退出。 |
一旦JMeter完成你的測試計劃,從運行菜單選擇中止。
若是你在監聽器中選擇一個文件保存結果,那麼你將會有一個可以在任何visualizer中打開的文件。每一個visualizer以它們本身的風格顯示結果。
有可能會在多於一個的visualizer中打開同一個文件。這是沒有問題的。JMeter會確保在測試運行時沒有取樣器記錄到同一文件多於一次。 |
11.6 ActiveMQ3.0的類庫
下面是必須在JMeterlib\ext目錄提供的類庫。
12.建立JMS主題測試計劃
在這章,你將學習如何建立一個測試計劃去測試JMS提供者。你將建立五個訂閱者和一個發佈者。你將建立兩個線程組而且設置一個爲重複10次。消息總 數是(6線程)x(1消息)x(重複10次)=60個消息。爲了構造測試計劃,你將使用如下元件:線程組、JMS發佈者、JMS訂閱者和圖標結果。
通常在。當前有兩個JMS取樣器。一個使用JMS主題,另外一個是使用JMS隊列。主題消息是一般說的發佈/訂閱消息。在案例裏它通常用在一個被生產 者發佈消息和多個訂閱者接收消息的地方。隊列消息通常被用在發送者指望獲得一個響應時的事務。消息系統和普通的HTTP請求有很大不一樣。在HTTP中,單 個用戶發送一個請求而且獲得一個響應。消息系統能夠工做在同步和異步模式。
12.1添加用戶
第一步是添加線程組元件。線程組告訴JMeter你想要模擬的用戶數,用戶多久發送一次請求,它們發送多少請求。
接着首先選擇測試計劃添加線程組元件,單擊鼠標右鍵獲得Add菜單,而且選擇Add --> ThreadGroup。
你如今能夠在測試計劃下看到線程組元件。若是看不到這個元件,而後經過單擊測試計劃元件"展開"測試計劃樹。
下一步,你須要修改默認屬性。若是你沒有選擇在樹中的線程組,就選擇它。你如今能夠在JMeter窗口右部分看到線程組控制面板(見下12.1)。
圖12.1 具備默認值的線程組
開始爲線程組提供一個更有描述性的名字。在這個name文本域,輸入Subscribers。
下一步,增長用戶數(叫作線程)到5.
在下一個文本域——Ramp-UP Period,使用默認值0秒。這個屬性告訴JMeter啓動每一個用戶之間的時間間隔。例如,你輸入Ramp-Up Period 爲五秒,JMeter將會在最後5秒結束前啓動全部你的用戶。因此,若是咱們有5個用戶和一個5秒的Ramp-Up Period,那麼啓動用戶的延遲就是1秒(5用戶/5秒=1用戶每秒)。若是你設置爲那個值爲零,那麼JMeter將會馬上啓動因此你的用戶。
最後,清除標爲"Forever"的複選框,而且在循環次數文本域中輸入2。這個屬性告訴JMeter重複你的測試的次數。若是你輸入循環次數爲0,那麼JMeter將會運行你的測試一次。爲了讓JMeter重複運行你的測試計劃,選擇Forever複選框。
在大部分應用程序中,你必須在控制面板中手工改變。然而,在JMeter中,控制面板中自動接受你作的改變。若是你修改元件名,這個樹會在你離開控制面板前自動使用新的文本更新這個樹(例如,當你選擇另外一個樹元件時)。 |
12.2添加JMS訂閱者和發佈者
確認在JMeter的lib文件夾下有須要的jar包。若是沒有,關閉JMeter,拷貝jar文件過去,重啓JMeter。
開始添加JMS Subscriber取樣器到Jakarta Users元件(Add --> Sampler --> JMS Subscriber)。而後,在樹中選擇JMS Subscriber元件,而且編輯下列屬性:
圖12.2 JMS Subscriber
圖12.3. JMS Publisher
12.3添加一個監聽器瀏覽/保存測試結果
你須要添加到你測試計劃的最後元件是一個監聽器。這個元件責任是儲存全部你的HTTP請求結果到文件,而且展現一個可視數據模型。
選擇Jakarta Users元件,添加一個Graph Resultsr監聽器(Add --> Listener --> Graph Results)。 Next, you need to specify a directory and filename of the output file. You can either type it into the filename field, or select the Browse button and browse to a directory and then enter a filename.
圖12.4 Graph Results監聽器
12.4保存測試計劃
雖然它不是須要的,可是咱們推薦你在運行前保存測試計劃到一個文件。爲了保存測試計劃,從File菜單選擇Save Test Plan(使用最新版本,它再也不須要首先選擇測試計劃元件)。
JMeter容許你保存這個測試計劃樹或者其中一部分。爲了僅保存在測試計劃樹上的特殊"分支",選擇在樹中用來啓動"分支"的測試計劃元件,而後右擊在菜單項中選擇"Save"。或者,選擇合適測試計劃元件,而後從Edit菜單選擇Save。 |
12.5運行測試計劃
從Run菜單,選擇Run。
若是你測試正在運行,JMeter在右手上方的角落點燃一個綠正方形顯示。當全部測試中止,那個方塊變成灰色。即便你選擇了"stop",綠光依然會繼續停留,知道全部測試都已經中止。 |
一旦JMeter完成你的測試計劃,從Run菜單選擇Stop。
若是你在你的監聽器中選擇一個文件保存結果,而後你將有一個可以在任何可視化工具下打開的文件。
每一可視化工具會使用它本身的風格去顯示結果。
|
若是可能在多個可視化工具中打開同一個文件。這是否是問題。JMeter會保證在測試運行期間沒有取樣會再次被記錄於同一文件。
13構建一個監視器測試計劃
在這一節,你講學習如何建立一個測試計劃來監視web服務器。監視器對一個壓力測試和系統管理頗有用。使用壓力測試,監視器能夠提供一些關於服務器 性能的附加信息。它也會使看出服務器性能和在客戶端響應時間直接的關係更加容易。做爲一個系統管理員工具,監視器提供很容易的方法從一個控制檯監視多個服 務器。監視器被設計和Tomcat 5下的狀態servlet一塊兒運行。理論上說任何支持JMX(Java Management Extension)的servlet容器均可以指定狀態servlet來提供一樣的信息。
由於一些人要使用伴隨其餘servlet或者EJB容器的監視器,Tomcat的狀態servlet將不要作任何修改工做在其餘的容器來進行內存統計。爲了獲得線程信息,你將須要改變MBeanServer的查找來重新獲得MBeans。
13.1添加一個服務器
第一步添加一個線程組元件。線程組告訴JMeter你想要模擬的用戶數。由於使用JMeter做爲監聽器,因此老是爲1.對於那些不熟悉服務器監視器的人這是很是重要的。做爲一個通常規則,對於單個服務器使用多個線程是嚴重的而且會形成重大的壓力。
繼續進行,經過初次的選擇測試計劃添加線程組,單擊鼠標右鍵獲得添加菜單,而後選擇添加-->線程組。
你如今應該在測試計劃下看到線程組。若是你沒有看到這個元件,那麼經過單擊測試計劃元件展開測試計劃樹。
圖10.1 使用默認值的線程組
輸入服務器名。
13.2HTTP認證管理
添加HTTP受權管理器到線程組元件(添加-->HTTP受權管理器)。輸入你的web服務器的用戶名和密碼。重要提示:監視器僅能工做於Tomcat5的5.0.19和更新版本。如何創建Tomcat的相關說明,情參考tomcat 5文檔。
13.3添加HTTP請求
添加HTTP請求到線程組元件(添加-->取樣器-->HTTP請求)。而後,在樹中選擇HTTp請求元件,並編輯下列屬性:
13.4添加固定定時器
添加一個定時器到這個線程組(添加-->定時器-->固定定時器)。在"線程延遲"方框輸入5000毫秒。通常使用間隔少於5秒會給你服務器添加壓力。在你在你的產品環境部署監視器前找出一個可接受的間隔。
13.5添加一個監聽器保存測試結果
若是你想保存來自服務器的結果,添加一個簡單的數據監聽器。若是你想保存計算的統計表,在監聽器輸入一個文件名。若是你想保存產生數據和統計表,確認你使用不一樣的文件名。
選擇線程組元件,添加一個簡單數據記錄器監聽器(添加-->監聽器-->簡單數據記錄器)。下一步,你須要指定一個目錄和一個輸出文件文件名。你能夠在文件名域輸入它,也能夠選擇瀏覽按鈕,瀏覽一個目錄,而後加入一個文件名。
13.6添加監視器結果
經過選擇測試計劃元件添加監聽器(添加-->監聽器-->監視器結果)。在監視器結果監聽器中有兩個tab。第一個是"健康",它顯示了監視器受到的最後取樣的狀態。第二個tab是"性能",它顯示了服務器性能的歷史視圖。
一個關於健康狀況的快速註釋會被計算出來。典型地,一個服務器內存用完或者達到最大線程數,它就要崩潰。若是是Tomcat 5,一旦線程到達最大,請求將被放置到一個隊列直到一個線程可用。在容器之間線程關係的重要性改變很大,因此如今使用50/50的實現更加保守。一個更加 有效管理線程的容器可能看不到任何性能的降低,可是使用的內存也確定會顯示一些影響。
性能圖像顯示爲不一樣的線條。空閒內存線顯示在當前已分配存儲塊剩餘多少空閒內存。Tomcat 5返回最大內存,可是它沒有被繪製。在一個調試好的環境,服務器應該從不達到最大內存。
注意在圖形的兩邊都有標題。在左邊是百分比,右邊是死亡/健康。若是內存線尖峯上升和降低迅速,它可能指示memory thrashing。在其它狀況,使用Borland OptimizeIt或者JProbe是一個好方法。你想看到的是對於負載,內存和線程的一個規則的圖案。任何不肯定路線的狀態經常都預示了不良的性能或 者某個種類的一個bug。
13.7保存測試計劃
雖然它不是須要的,可是咱們推薦你在運行前保存測試計劃到一個文件。爲了保存測試計劃,從文件菜單選擇保存測試計劃(使用最新版本,它再也不須要首先選擇測試計劃元件)。
JMeter容許你保存這個測試計劃樹或者僅僅其中一部分。爲了僅保存在測試計劃樹上的特殊"分支",選擇在樹中用來啓動"分支"的測試計劃元件,而後右擊在菜單項中選擇"保存"。或者,選擇合適測試計劃元件,而後從編輯菜單選擇保存。 |
13.8運行測試計劃
從運行菜單,選擇運行。
若是你測試正在運行,JMeter在右手上方的角落點亮一個綠正方形顯示。當全部測試中止,那個方塊變成灰色。即便你選擇了"中止",綠光依然會繼續持續,直到全部測試都已經退出。 |
一旦JMeter完成你的測試計劃,從運行菜單選擇中止。
若是你在監聽器中選擇一個文件保存結果,那麼你將會有一個可以在任何visualizer中打開的文件。每一個visualizer以它們本身的風格顯示結果。
有可能會在多於一個的visualizer中打開同一個文件。這是沒有問題的。JMeter會確保在測試運行時沒有取樣器記錄到同一文件多於一次。 |
14.監聽器介紹
監聽器是顯示取樣器結果的組件。結果能夠顯示在樹、表格、圖表或者簡單的寫入一個日誌文件。爲了觀察來自提供的取樣器的響應內容,能夠添加"觀察結果樹"或者"在表格觀察結果"監聽器到測試計劃。爲了圖形化觀察響應時間,能夠添加圖形結果
不一樣的監聽器使用不一樣的方法顯示響應信息。然而,若是他們其中一個被指點,他們全部使用相同的原始數據寫入到輸出文件。 |
"配置"按鈕能夠指定那些域被寫入文件,和是否把它做爲一個CSV或者XML文件。CSV文件比XML文件小得多,全部若是產生大量的取樣建議使用CSV文件。
若是你僅指望記錄某幾個取樣,能夠添加監聽器做爲取樣器的一個子節點。或者你可使用簡單控制器去組織取樣器集,而且添加監聽器到那個控制器。相同的文件能夠被多個取樣器使用-可是肯定它們都使用相同的配置!
14.1屏幕捕獲
JMeter可以保存任何監聽器做爲一個PNG文件。在左邊的面板選擇監聽器。單擊edit -> Save As Image
圖1-Edit -> Save As Image
14.2非GUI測試運行
當在非GUI模式運行時,使用-l標誌爲測試運行建立一個頂級監聽器。
14.3資源使用
監聽器。爲了最小的資源使用,刪除全部的監聽器,而且使用-l標誌運行測試在非GUI模式來定義僅一個監聽器。這樣在測試完成以後日誌文件能夠被從新讀取到一個監聽器。
14.4CSV日誌格式
CSV日誌格式依賴於在配置中被選擇的數據項。僅那些指定的數據項被記錄在文件。列的表現順序是固定的,以下:
*時間標誌-自從1970-1-1的毫秒數
*用時-毫秒
*標籤-取樣器標籤
*響應代碼-例如200、404
*響應消息-例如OK
*線程名
*數據類型
*成功與否-true或者false
*失敗消息-若是要的話
*字節數-在取樣中的字節數
*URL
XML文件格式以下:
14.6XML日誌格式2.0
原始XML(2.0)格式以下(轉行能夠不相同):
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<sampleResult timeStamp="1144365463297" dataType="text" threadName="Listen 1-1" label="HTTP Request" time="1502" responseMessage="OK" responseCode="200" success="true">
<sampleResult timeStamp="1144365464238" dataType="text" threadName="Listen 1-1" label="http://www.apache.org/style/style.css" time="171" responseMessage="OK" responseCode="200" success="true">
<property xml:space="preserve" name="samplerData">
GET http://www.apache.org/style/style.css
</property>
<binary>
body, td, th {
font-size: 95%;
font-family: Arial, Geneva, Helvetica, sans-serif;
color: black;
}
...
</binary>
</sampleResult>
</sampleResult>
...
</testResults>
14.6XML日誌格式2.1
更新的XML(2.1)格式以下(轉行能夠不相同):
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
-- HTTP Sample, with nested samples
<httpSample t="1392" lt="351" ts="1144371014619" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="iso-8859-1" by="12407">
<httpSample t="170" lt="170" ts="1144371015471" s="true" lb="http://www.apache.org/style/style.css" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="ISO-8859-1" by="1002">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
...
Content-Type: text/css
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">body, td, th {
font-size: 95%;
font-family: Arial, Geneva, Helvetica, sans-serif;
color: black;
}
...
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/style/style.css</url>
</httpSample>
<httpSample t="200" lt="180" ts="1144371015641" s="true" lb="http://www.apache.org/images/asf_logo_wide.gif" rc="200" rm="OK" tn="Listen 1-1" dt="bin" de="ISO-8859-1" by="5866">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
...
Content-Type: image/gif
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">http://www.apache.org/images/asf_logo_wide.gif</responseData>
<responseFile class="java.lang.String">Mixed1.html</responseFile>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/images/asf_logo_wide.gif</url>
</httpSample>
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">
...
<html>
<head>
...
</head>
<body>
...
</body>
</html>
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/</url>
</httpSample>
-- nonHTTPP Sample
<sample t="0" lt="0" ts="1144372616082" s="true" lb="Example Sampler" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="ISO-8859-1" by="10">
<responseHeader class="java.lang.String"></responseHeader>
<requestHeader class="java.lang.String"></requestHeader>
<responseData class="java.lang.String">Listen 1-1</responseData>
<responseFile class="java.lang.String">Mixed2.unknown</responseFile>
<samplerData class="java.lang.String">ssssss</samplerData>
</sample>
</testResults>
取樣節點名字能夠是"sample"或者"httpSample"。 |
14.7 Sample Attributes
取樣器屬性意義以下:
屬性 |
內容 |
by |
字節數 |
de |
數據編碼 |
dt |
數據類型 |
ec |
Error count (0 or 1, unless multiple samples are aggregated) |
hn |
Hostname where the sample was generated |
lb |
標籤 |
lt |
延時(ms)-不是全部的取樣器支持這個 |
na |
全部線程組中的活躍線程數 |
ng |
在這個線程組中活躍的線程數 |
rc |
響應代碼 |
rm |
響應消息 |
s |
是否成功 |
sc |
Sample count (1, unless multiple samples are aggregated) |
t |
用時(ms) |
tn |
線程名 |
ts |
時間標誌 |
varname |
Value of the named variable (versions of JMeter after 2.3.1) |
JMeter2.1和2.1.1版本保存響應代碼爲"rs",可是讀取它指望是"rc"。這個bug已經被修復,因此爲"rc";"rc"或者"rs"均可以被讀取。
Versions of JMeter after 2.3.1 allow additional variables to be saved with the test plan. Currently, the variables are saved as additional attributes. The testplan variable name is used as the attribute name. |
14.8保存響應數據
像上面展現的那樣,若是須要響應數據能夠被保存爲XML日誌文件。然而,這將使文件至關大,而且文本必須被編碼才能夠被安靜的驗證XML。一樣圖片不會被包括。
另外一個解決方案是使用後置處理器保存響應結果到文件。這樣爲每一個取樣產生一個新的文件,而且保存文件爲取樣器名。文件名會被包含在一個取樣日誌輸入。當取樣日誌文件被加載時若是須要數據將從文件重新獲得。
14.9Loading (reading) response data
To view an existing results file, you can use the File "Browse..." button to select a file. If necessary, just create a dummy testplan with the appropriate Listener in it.
Results can be read from XML or CSV format files. When reading from CSV results files, the header (if present) is used to determine which fields were saved. In order to interpret a header-less CSV file correctly, the appropriate JMeter properties must be set.
15. 遠程測試
若是你的JMeter客戶機不可能高效的模擬充足的用戶加壓力到你服務器,an option exists to control multiple, remote JMeter engines from a single JMeter GUI client。經過遠程運行JMeter,你能夠跨越不少低配置的電腦複製一個測試,並在服務器模擬一個大的負載。一個JMeter GUI客戶端實例可以控制任何多個遠程JMeter實例,並從它們收集全部的數據。這種方法有以下特性:
注意當你在你的應用程序服務器上真正執行JMeter引擎時,你須要注意這樣一個事實。這就是它將會在應用程序服務器添加處理開銷,因此你的測試結 果會稍微收到影響。推薦的方法是在同一個以太網段有一個或者多個機器做爲你要配置運行JMeter引擎的應用程序服務器。這將在沒有影響應用程序性能的前 提下最小化網絡在測試結果中的影響。
第一步:啓動服務器
爲了在遠程節點運行JMeter,經過運行 JMETER_HOME/bin/jmeter-server (unix)或者JMETER_HOME/bin/jmeter-server.bat (windows)腳本在你但願運行的全部機器上啓動JMeter服務器組件。
第二步:添加服務器IP到你的客戶端配置文件
在JMeter控制機上編輯配置文件。在/bin/jmeter.properties文件中找到屬性"remote_hosts",並添加你運行的JMeter服務器的IP。添加多個服務器,逗號分隔。
注意你可使用-J命令行參數來指定遠程計算機。例如:
jmeter -Jremote_hosts=host1,127.0.0.1,host2
第三步:啓動JMeter客戶端
如今你準備啓動JMeter
15.2 技巧
若是你運行Suse Linux,這些技巧會有幫助。默認安裝會啓用防火牆。若是那樣的話,遠程測試會不能徹底工做。下列技巧是由Sergey Ten貢獻。
若是你看到鏈接被拒絕,經過下列參數開啓調試。
15.3 使用不一樣的端口
默認,JMeter使用標準的RMI端口1099。可能須要改變它。爲了這樣工做成功,全部下列須要保持一致:
自從JMeter2.1.1之後,jmeter-server腳本提供了更改端口支持。例如架設你想使用1664端口(可能1099已經被使用)。
在Windows下(在DOS窗口)
C:\JMETER> SET SERVER_PORT=1664
C:\JMETER> JMETER-SERVER [其餘參數]
在Unix下
$ SERVER_PORT=1664 jmeter-server [其餘參數]
[注意使用大寫字母標示環境變量]
15.4 Using sample batching
Listeners in the test plan send their results back to the client JMeter which writes the results to the specified files By default, samples are sent back as they are generated. This can place a large load on the network and the JMeter client. There are some JMeter properties that can be set to alter this behaviour.
Other fields that vary between samples are lost.
The following properties apply to the Batch and Statistical modes:
你的硬件能力會限制你有效運行JMeter的線程數。它也會依賴於你服務器的速度(一個更快的服務器由於它更加快速的返回一個請求因此會使 JMeter工做更加努力)。JMeter工做越多,它的時間信息就越不許確。JMeter作越多的動做,每一個線程必須等待訪問CPU的時間越長,定時信 息越長。若是你須要大規模的負載測試,考慮在多個機器上運行多個非用戶界面的JMeter。
見構建一個Web測試
見構建一個高級的Web測試
詳細參見HTTP代理服務器設置代理服務器。要作的最重要的事是過濾你感興趣的全部請求。例如,在記錄圖片請求方面並無觀點(JMeter被導致 下載一個頁面的全部圖片-見HTTP請求)。這些僅僅會能亂你的測試計劃。大多數可能,全部你的文件共享一個擴展,例 如.jsp,.asp,.php,.html或者類似的。你應該經過輸入".\jsp"做爲一個"Include Pattern"包含這些。
另外,你能夠經過輸入".\gif"做爲一個"Exclude Pattern"。依賴於你的應用程序,這多是個好方法,也可能不是。你可能也必須包含樣式表,javascript文件和其餘包含文件。測試你的設置來驗證你記錄的是你想要的,而後清楚,從新啓動。
The Proxy Server expects to find a ThreadGroup element with a Recording Controller under it where it will record HTTP Requests to. This conveniently packages all your samples under one controller, which can be given a name that describes the test case.
如今,經歷測試用力的幾步。若是你有一個之前定義的測試用力,使用JMeter記錄你的行爲來定義你的測試用例。一旦你完成一個明確步驟系列,使用一個適當的命名文件保存這個測試用例。而後,
代理服務器軟件一個最實用的特性是你能夠從被記錄的取樣中提取出某些通用的元件。經過在測試計劃級別或者用戶自定義變量元件中定義一些自定義變量, 你可讓JMeter在你記錄的取樣中自動的替換那些值。舉例來講,若是你在服務器"xxx.yyy.com",測試一個應用,那麼你可使 用"xxx.yyy.com"定義一個變量叫作"server",而後在你記錄的取樣那個值被發現的任何地方都會被替換爲"${server}"。
一些測試計劃須要爲不一樣的用戶/線程使用不一樣的值。例如,你可能想要測試一個爲每一個用戶指定一個惟一的登陸序列。這經過JMeter提供的設備很容易完成。
例如:
CSV數據集元件會爲每一個線程讀取一個新行。
減小資源使用的一些建議:
BeanShell 攔截器有一個很是有用的特性——它扮演一個很容易經過telnet或者http訪問的服務器
那是不安全的。鏈接到那個端口的任何人均可以發出任何BeanShell命令。這可以提供無限制的訪問JMeter應用程序和主機。*若是那些端口不是受保護拒絕訪問不要容許這個服務器。 |
若是你想使用這個服務器,在jmeter.properties文件定義下列屬性:
beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh
在上面的例子中,服務器會被啓動,而且監聽9000和9001端口。9000端口會用來爲http訪問。9001端口會用來爲telnet訪問。 startup.bsh文件會經過服務器處理,而且能夠用來定義各類函數和啓動變量。startup文件爲設置和打印JMeter和系統屬性定義方法。這 是你將在JMeter控制檯看到的:
Startup script running
Startup script completed
Httpd started on port: 9000
Sessiond started on port: 9001
做爲一個實際例子,假設你有一個在非圖形界面模式長期運行的JMeter,而且你想在測試中改變多個時間的吞吐量。測試計劃包含了一個不變的吞吐量定時器,它定義了一個期限屬性,例如${__P(throughput)}。下列BeanShell命令能夠用來改變測試:
printprop("throughput");
curr=Integer.decode(args[0]); // 起始值Start value
inc=Integer.decode(args[1]); // 增量Increment
end=Integer.decode(args[2]); // 最終值Final value
secs=Integer.decode(args[3]); // 改變等待Wait between changes
while(curr <= end){
setprop("throughput",curr.toString()); // Needs to be a string here
Thread.sleep(secs*1000);
curr += inc;
}
printprop("throughput");
這個腳本能夠存儲到一個文件(throughput.bsh)的話,使用bshclient.jar發送到服務器。例如:
java -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60
Each BeanShell test element has its own copy of the interpreter (for each thread). If the test element is repeatedly called, e.g. within a loop, then the interpreter is retained between invocations unless the "Reset bsh.Interpreter before each call" option is selected.
Some long-running tests may cause the interpreter to use lots of memory; if this is the case try using the reset option.
You can test BeanShell scripts outside JMeter by using the command-line interpreter:
$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interperter file.bsh [parameters]
or
$ java -cp bsh-xxx.jar bsh.Interperter
bsh% source("file.bsh");
bsh% exit(); // or use EOF key (e.g. ^Z or ^D)
Variables can be defined in startup (initialisation) scripts. These will be retained across invocations of the test element, unless the reset option is used.\
Scripts can also access JMeter variables using the get() and put() methods of the "vars" variable, for example: vars.get("HOST"); vars.put("MSG","Successful"); . The get() and put() methods only support variables with String values, but there are also getObject() and putObject() methods which can be used for arbitrary objects. JMeter variables are local to a thread, but can be used by all test elements (not just Beanshell).
If you need to share variables between threads, then JMeter properties can be used:
import org.apache.jmeter.util.JMeterUtils;
String value=JMeterUtils.getPropDefault("name","");
JMeterUtils.setProperty("name", "value");
The sample .bshrc files contain sample definitions of getprop() and setprop() methods.
Another possible method of sharing variables is to use the "bsh.shared" shared namespace. For example:
if (bsh.shared.myObj == void)
Unknown macro: { // not yet defined, so create it}
bsh.shared.myObj.process();
Rather than creating the object in the test element, it can be created in the startup file defined by the JMeter property "beanshell.init.file". This is only processed once.
這是一個至關開放的命題。首先有不少問題要問,另外還有一些必須的資源。你會須要一些硬件運行基準/負載測試。許多工具證實是有用的。能夠考慮一些產品。最後,爲何Java是實現負載測試/基準產品的一個好選擇。
咱們預期的平均用戶數(正常負載)是多少?
咱們預期的峯值用戶數是多少?
何時壓力測試你應用程序是個好時間(例如,下班時間或者每一個週末),記住這可能完全崩潰大家一個或多個服務器?
咱們側應用程序是否有狀態?若是是這樣,你的應用程序如何管理它(cookies,session重寫,或者其餘方法)?
下列資源會很是有用。記住若是你不定位這些資源,你將成爲這些資源。As you already have your work cut out for you, it is worth knowing who the following people are, so that you can ask them for help if you need it.
誰熟悉咱們的網絡技術?若是你遇到任何防火牆或者代理問題,這會變的很重要。一個專用測試網絡(那會有一個很是低的網絡延遲)是很是好的事情。知道誰能夠爲你設立一個是很是有用的(若是你感受這是必須的)。若是應用程序不能預期測量,誰能夠添加額外的硬件?
誰知道應用程序的功能如何?正常順序是
測試過程能夠從黑盒測試到白盒測試(不一樣點是第一個不須要應用程序知識[因此稱爲"黑河"],然而第二個須要應用程序知識)進行。在這個過程不難發現應用程序的問題,因此它準備否認你的工做。
這應該是一塊廣泛使用的有一個標準的(例如vanilla)軟件安裝硬件。記住,若是你公佈大家結果,你的客戶會作的第一件事僱傭一個研究生驗證它 們。You might as well make it as easy for this person as you possibly can.
對於Windows,Windows XP Professional應該是最小的(其它的不支持多線程超過50-60個鏈接,你可能指望比那更多的用戶)。
很是好的免費平臺包括linux,BSD和Solaris Intel。若是你有跟多一點錢,還有一些商業的linux。若是你能適應它,一個商業的Unix(Solaris等)多是最好的選擇。
For non-Windows platforms, investigate "ulimit -n unlimited" with a view to including it in your user account startup scripts (.bashrc or .cshrc scripts for the testing account).
若是你進行更高尺度的基準測試/壓力測試,這個平臺會成爲限制因素。因此使用大家可用的最好的硬件和軟件是有價值。記得在你公佈基準測試時包括硬件/軟件配置。
不要忘記JMeter的批處理模式。若是你有一個服務器,它支持Java但可能沒有一個快的繪圖實現,或者你須要遠程登陸,這會是有用的。批處理模 式相比遠程顯示或者客戶端-服務器模式能夠減小網絡流量。批處理文件能夠被加載到工做站的JMeter來分析,或者你可使用CSV輸出和輸入數據到電子 表格。
下列工具會都頗有用。熟悉它們將會頗有用的。這應該包括實驗它們,並閱讀適當的文檔(man-pages, info-files, application --help messages和任何提供的文檔)。
它經常使用來肯定你是否你個到達目標站點。Options can be specified so that 'ping' provides the same type of route reporting as 'traceroute'.
當用戶一般會使用一我的們易讀的網絡地址,可是你可能但願當執行基準測試/壓力測試時避免DNS查找的開銷。這就用來肯定你目標站點的惟一地址(IP地址)。
若是你不能"ping"通你的目標站點,這個命令多半能夠用來肯定問題(多是防火牆或者代理)。它也能夠用來估算整個網絡延時(本地運行應該給出最小可能網絡延遲-記住你的用戶運行的將會是一個繁忙的Internet)。一般,跳躍越少越好。
有不少商業的產品,但都有至關高的價格。若是你能夠適應它,這或許也是能夠走的路線。若是那些產品不能作你想要的,或者你限制在一個預算,下列工具就值得一看。事實上,你或許應該開始試試Apache ab工具,若是你的需求不是特別的複雜它能夠很好的工做。
你應該明確從使用這個開始。它很好的處理HTTP 'get'請求,作一點工做也能夠處理HTTP 'post'請求。它用'C'語言寫的,它運行的很是好,而且提供很好的性能報告(if basic)。
這個工具值得一看。它是一個用來執行HTTP測試/基準測試的類庫(所以更值得開發人員關注)。它想要用來連同JUnit代替web瀏覽器(所以是非GUI的)。
這個工具也很值得一看。它有一個優秀的用戶界面,可是它也許不能徹底作你想作的。If this is the case, be aware that the functionality of this product is not likely to change.
若是你有非標準的需求,那麼這個解決方案提供了以開源社區來提供它們(固然,若是你正在閱讀這個文檔,你可能已經熱衷於這個工具)。這個產品免費和你的需求一塊兒進行。
爲何不是Perl或者C?
Perl多半是一個很好的選擇,只惋惜基準程序包彷佛給出至關模糊的結果。還有,使用Perl模擬多個用戶是一個很棘手的問題(多鏈接能夠經過從一 個shell腳本分支多個進程模擬,可是那些都不是線程,它們是進程)。然而,Perl社區是很強大的。若是你發現某個東西已經寫了一些好像有用的東西, 這多是一個很好的解決方案。
C,固然是一個很好的選擇(check out the Apache ab tool)。可是你須要準備全部測試你應用程序須要的常規網絡,線程,狀態管理碼。
Java給你了(免費)你應用程序須要的常規網絡,線程,狀態管理碼。Java有HTTP,FTP和HTTPS-也有RMI,IIOP和JDBC(沒有提到cookies,URL編碼和URL重定向)。另外Java提供了自動化垃圾回收和字節碼安全。
And once Microsoft moves to a CLR (common language run-time) a Windows Java solution will not be any slower than any other type of solution on the Windows platform.
18.1 Samplers
JMeter函數是一些可以轉化在測試樹中取樣器或者其餘配置元件的域的特殊值。一個函數調用就像這樣:
${__functionName(var1,var2,var3)}
"__functionName"匹配函數名。
圓括號周圍設置函數的參數,例如${__time(YMD)}實際參數因函數而不一樣。不須要參數的函數使圓括號內
爲空,例如${__threadNum}。
函數列表:
有兩類函數:自定義靜態值(或者變量),和內置函數。
自定義靜態值容許當一個測試樹編譯而且提交運行時自定義變量被它們的靜態值代替。這個替代在測試運行開始時發生一次。這能夠用來替換全部HTTP請求中的 DOMAIN域 ,例如 - 作一個簡單的問題來使用一樣的測試改變for example - making it a simple matter to change a test to target a different server with the same test.
這用不使用函數的替代是可能的,可是不方便並且intuitive。它須要用戶建立默認配置元件來填充取樣器空值。自定義函數容許one to replace only part of any given value, not just filling in blank values. 使用內建的函數用戶能夠計算基於在運行時前一個相應數據的新值, which thread the function is in, the time,and many other sources. These values are generated fresh for every request throughout the course of the test.
函數在線程之間是共享的。在測試計劃中每一個函數調用是被一個單獨函數實例調用的。 |
一個用戶自定義函數能夠寫在任何測試組件的任何域中。一些域不容許隨機字符串,由於他們指望數字,然而不指望一個函數。 然而,大多數域會容許函數。內建的函數容許寫進任何非控制器測試組件的任何域。 這包含取樣器,定時器,監聽器,修改器,斷言,前置處理器,後置處理器和配置元件。
當使用變量/函數When using variable/function references in SQL code (etc), remember to include any |
自定義函數使用這種格式: ${varName} . 在測試計劃樹元件中,一個自定義值兩列的表格a two-column table of user-defined values is kept, matching up variable names with static values. Referencing the variable in a test element is done by bracketing the variable name with '${' and '}'.
內建函數使用一樣的風格書寫,但慣例,內建參數以"__"開始來避免和用戶值名*衝突。一些函數使用參數配置它們,而且包含在括弧內,以逗號分隔。 若是函數沒有參數,括弧能夠省略。 A further complication for argument values that themselves contain commas is that the value should be escaped as necessary. Thus, if you need to include a comma in your parameter value, escape it like so: '\,'.
JMeter提供了一個工具來幫助你使用各類內建函數構建函數調用,而後你能夠拷貝粘貼。 It will not automatically escape values for you, since functions can be parameters to other functions, and you should only escape values you intend as literal.
* 若是你使用和內建函數一樣的名字定義一個自定義變量,你的靜態變量會覆蓋內建函數。 |
函數助手對話框從JMeter工具菜單中是可用的。
函數助手對話框
使用函數助手,你能夠從下拉中選擇一個函數,並賦予值。
對於它的參數,表格的左列提供了簡短的參數描述,右邊的列是你爲那個參數填寫的值。不一樣的函數使用不一樣的參數。
當你完成這些,點擊"生成"按鈕,適當的字符串就生成出來了,你能夠拷貝粘貼到你喜歡的測試計劃中。
正則函數用來解析使用任何正則表達式的前響應(經過用戶提供)。這個函數返回使用填充的變量值的模板字符串。
__regexFunction存儲值以備之後使用。在第六個參數中,你能夠指定一個參考名。在之後這個函數執行時,一樣的值會在稍後使用自定義值規則時被獲得。例如,若是你輸入"refName"做爲第六個參數,你將能夠這樣使用:
參數
屬性 |
描述 |
是否須要 |
第一個參數 |
第一個參數使用應用於響應數據的正則表達式。It will grab all matches. Any parts of this expression that you wish to use in your template string, be sure to surround in parentheses. Example: <a href="(.)">. This will grab the value of the link and store it as the first group (there is only 1 group). Another example: <input type="hidden" name="(.)" value="(.*)">. This will grab the name as the first group, and the value as the second group. These values can be used in your template string |
Yes |
Second argument |
This is the template string that will replace the function at run-time. To refer to a group captured in the regular expression, use the syntax: $[group_number]$. Ie: $1$, or $2$. Your template can be any string. |
Yes |
Third argument |
The third argument tells JMeter which match to use. Your regular expression might find numerous matches. You have four choices:
|
No, default=1 |
Fourth argument |
If 'ALL' was selected for the above argument value, then this argument will be inserted between each appended copy of the template value. |
No |
Fifth argument |
Default value returned if no match is found |
No |
Sixth argument |
A reference name for reusing the values parsed by this function. |
No |
Seventh argument |
Input variable name. If specified, then the value of the variable is used as the input instead of using the previous sample result. |
No |
counter每次調用產生一個新數字,從1開始每次增長1。counter能夠配置來保持單獨模擬每一個用戶的值,或者對於全部的用戶使用同一個 counter。若是每一個用戶的值是單獨增長的,那在整個測試計劃過程當中就像記錄數字迭代同樣。一個全局的counter就像記錄請求運行了多少次。
counter使用一個數字變量來計數,它有一個最大值2,147,483,647.
counter函數實例如今徹底是單獨的。[JMeter 2.1.1和較早版本使用一個固定的線程變量來保持跟蹤每一個用戶的計數,因此多個counter函數操做一樣的值。] 全局counter - "FALSE" - 經過每一個counter實例單獨維護。
屬性
屬性 |
描述 |
是否須要 |
第一個參數 |
TRUE 若是你但願每一個模擬的用戶的counter保持單獨並分隔其餘用戶設爲TRUE。 FALSE for a global counter. |
是 |
第二個參數 |
A reference name for reusing the value created by this function. |
No |
thread number函數簡單返回當前執行的線程數量。那些數字是單獨的線程組,意味着從函數的視角來看線程組1的線程 #1和在另外一個線程組的線程#1是不可區分的。
這個函數沒有參數。
這個函數不能夠運行在那些任何運行在一個單獨線程的配置元件中(例如 自定義變量)。 Nor does it make sense to use it on the Test Plan. |
intSum函數用來計算兩個或者更多int值的和。
JMeter2.3.1或者更早版本須要被表現的參考名,這個參考名如今是可選的,可是它必須不是一個非法的整數 |
屬性
屬性 |
描述 |
是否須要 |
第一個參數 |
第一個int值。 |
是 |
第二個參數 |
第二個int值。 |
是 |
第n個參數 |
第n個int值。 |
否 |
最後一個參數 |
爲經過這個函數計算的值重用的參考名。若是指定,參考名必須包含至少一個非數字字符,不然它將被做爲另外一個int值對待添加進去。 |
否 |
longSum函數用來計算兩個或者更多long值的和。
屬性
屬性 |
描述 |
是否須要 |
第一個參數 |
第一個long值。 |
是 |
第二個參數 |
第二個long值。 |
是 |
第n個參數 |
第n個long值。 |
否 |
最後一個參數 |
爲經過這個函數計算的值重用的參考名。若是指定,參考名必須包含至少一個非數字字符,不然它將被做爲另外一個long值對待添加進去。 |
No |
StringFromFile函數用來從文本文件讀取字符串。對於運行須要許多變量數據的測試很是有用。例如當測試一個銀行程序時,100個或者1000個不一樣的賬號數字多是須要的。
另見CSV測試配置元件,它很容易使用。然而,那個元件如今不支持多個輸入文件。
每次調用,它會從文件讀取下一行。當文件到達最後,它會從開頭再次開始讀取,若是沒有到達最大循環數。若是在一個測試腳本對於函數有多個參考名,每一個都會單獨打開文件,甚至文件名是相同的。 [若是這個值在其餘任何地方再次使用,對於每一個函數的調用使用不一樣的變量名。]
若是打開文件或者讀取文件發生錯誤,函數返回字符串"*ERR*"
屬性
屬性 |
描述 |
是否須要 |
文件名 |
Path to the file name. (The path can be relative to the JMeter launch directory) If using optional sequence numbers, the path name should be suitable for passing to DecimalFormat. See below for examples. |
Yes |
Variable Name |
A reference name - refName - for reusing the value created by this function. Stored values are of the form ${refName}. Defaults to "StringFromFile_". |
No |
Start sequence number |
Initial Sequence number (if omitted, the End sequence number is treated as a loop count) No |
No |
The file name parameter is resolved when the file is opened or re-opened.
The reference name parameter (if supplied) is resolved every time the function is executed.
Using sequence numbers:
When using the optional sequence numbers, the path name is used as the format string for java.text.DecimalFormat. The current sequence number is passed in as the only parameter. If the optional start number is not specified, the path name is used as is. Useful formatting sequences are:
Examples:
pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat
pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat
pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999
If more digits are required than there are formatting characters, the number will be expanded as necessary.
*To prevent a formatting character from being interpreted, enclose it in single quotes. Note that "." is a formatting character, and must be enclosed in single quotes *(though #. and 000. work as expected in locales where the decimal point is also ".")
In other locales (e.g. fr), the decimal point is "," - which means that "#." becomes "nnn,".
See the documentation for DecimalFormat for full details.
If the path name does not contain any special formatting characters, the current sequence number will be appended to the name, otherwise the number will be inserted aaccording to the fomatting instructions.
If the start sequence number is omitted, and the end sequence number is specified, the sequence number is interpreted as a loop count, and the file will be used at most "end" times. In this case the filename is not formatted.
${_StringFromFile(PIN#'.'DAT,,1,2)} - reads PIN1.DAT, PIN2.DAT
${_StringFromFile(PIN.DAT,,,2)} - reads PIN.DAT twice
Note that the "." in PIN.DAT above should not be quoted. In this case the start number is omitted, so the file name is used exactly as is.
machineName函數返回本地主機名。
屬性
屬性 |
描述 |
是否須要 |
變量名 |
爲重用經過這個函數計算的這個值的一個參考名 |
否 |
javaScript函數執行一個JavaScript代碼片斷,並返回它的值。
JMeter的Javascript函數調用一個單獨的JavaScript解析器。Javascript是一種腳本語言,因此你能夠作計算等。
語言詳細,請參考Mozilla Rhino概述
下列變量對於腳本是可用的:
JMeter不是一個瀏覽器,並不能在下載頁面解析JavaScript。 |
屬性
屬性 |
描述 |
是否須要 |
表達式 |
被執行的JavaScript表達式。例如:
|
Yes |
Variable Name |
A reference name for reusing the value computed by this function. |
No |
Remember to include any necessary quotes for text strings and JMeter variables. Also, if the expression has commas, please make sure to escape them. For example in: |
random函數返回在最小值和最大值之間的一個隨機數。
屬性
屬性 |
描述 |
是否須要 |
最小值 |
一個數字 |
是 |
最大值 |
一個更大的數 |
是 |
變量名 |
A reference name for reusing the value computed by this function. |
否 |
CSVFile函數從CSV文件返回一個字符串 (c.f. StringFromFile )
注意:1.9.1如下版本僅支持一個文件。JMeter自從1.9.1版本支持多文件名。
在大多數狀況下,較新的CSV數據集配置元件更早使用
當一個文件名第一次遇到時,文件會被打開,並讀取到一個內部數組。若是一個空行被發現,這被認爲是文件的結尾 - 這容許使用跟隨註釋 (N.B.這個特性是在1.9.1之後引進的)
全部接下來一樣文件名的參考使用相同內部數組。 N.B. 文件名大小寫對於函數是有效的,甚至OS 不關心,因此 CSVRead(abc.txt,0) 和 CSVRead(aBc.txt,0) 會指向不一樣的內部數組。
*ALIAS 特性容許一樣的文件被打開屢次,並容許使用更短的文件名。
每一個線程都有它本身的內部指針指向文件數組的當前行。當一個線程第一次指向這個文件,它會被分配到數組的下一個空行 ,因此每一個線程會和其餘線程訪問不一樣的行。 [Unless there are more threads than there are rows in the array.]
注意: the function splits the line at every comma by default. If you want to enter columns containing commas, then you will need to change the delimiter to a character that does not appear in any column data, by setting the property: csvread.delimiter
屬性
屬性 |
描述 |
是否須要 |
File Name |
The file (or *ALIAS) to read from |
Yes |
Column number |
The column number in the file. 0 = first column, 1 = second etc. "next" - go to next line of file. *ALIAS - open a file and assign it to the alias |
Yes |
For example, you could set up some variables as follows:
This would read two columns from one line, and two columns from the next available line. If all the variables are defined on the same User Parameters Pre-Processor, then the lines will be consecutive. Otherwise, a different thread may grab the next line.
The function is not suitable for use with large files, as the entire file is stored in memory. For larger files, use CSV Data Set Config element or StringFromFile . |
property返回JMeter的屬性的值。若是這個屬性值沒找到,沒有默認值提供,它會返回屬性名。當提供一個默認值時,就不須要提供一個函數名 - 參數能夠爲空,並它被忽略。
For example:
屬性
屬性 |
描述 |
是否須要 |
屬性名 |
要獲得的屬性名 |
是 |
變量名 |
A reference name for reusing the value computed by this function. |
否 |
默認值 |
這個屬性的默認值 |
否 |
This is a simplified property function which is intended for use with properties defined on the command line. Unlike the __property function, there is no option to save the value in a variable, and if no default value is supplied, it is assumed to be 1. The value of 1 was chosen because it is valid for common test variables such as loops, thread count, ramp up etc.
For example:
Define the property value:
jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu
Fetch the values:
${__P(group1.threads)} - return the value of group1.threads
${__P(group1.loops)} - return the value of group1.loops
${__P(hostname,www.dummy.org)} - return value of property hostname or www.dummy.org if not defined
In the examples above, the first function call would return 7, the second would return 1 and the last would return www.dummy.org (unless those properties were defined elsewhere!)
Parameters
Attribute |
Description |
Required |
Property Name |
The property name to be retrieved. |
Yes |
Default Value |
The default value for the property. If omitted, the default is set to "1". |
No |
log函數把一條信息記入日誌,並返回空字符串
參數
屬性 |
描述 |
是否須要 |
被記錄的字符串 |
一個字符串 |
是 |
日誌等級 |
OUT, ERR, DEBUG, INFO (默認), WARN or ERROR |
否 |
Throwable文本 |
若是非空,建立一個Throwable傳遞到 logger |
否 |
OUT和ERR日誌等級用來直接輸出到System.out和System.err
相應的,既然這樣,輸出老是被打印 - 它不依賴當前的日誌等級
logn函數把一條信息記入日誌,並返回空字符串
參數
屬性 |
描述 |
是否須要 |
被記錄的字符串 |
一個字符串 |
是 |
日誌等級 |
OUT, ERR, DEBUG, INFO (默認), WARN or ERROR |
否 |
Throwable文本 |
若是非空,建立一個Throwable傳遞到 logger |
否 |
相應的,既然這樣,輸出老是被打印 - 它不依賴當前的日誌等級
BeanShell函數執行經過它的腳本並返回結果。
請注意BeanShell的jar文件並無包含在JMeter中;它須要單獨下載。
*使用BeanShell的所有詳細信息,請參見BeanShell站點http://www.beanshell.org/ *
Note that a different Interpreter is used for each independent occurence of the function in a test script, but the same Interpreter is used for subsequent invocations. This means that variables persist across calls to the function.
A single instance of a function may be called from multiple threads. However the function execute() method is synchronised.
If the property "beanshell.function.init" is defined, it is passed to the Interpreter as the name of a sourced file. This can be used to define common methods and variables. There is a sample init file in the bin directory: BeanShellFunction.bshrc.
The following variables are set before the script is executed:
means that this is set before the init file, if any, is processed. Other variables vary
from invocation to invocation.
Parameters
Attribute |
Description |
Required |
BeanShell script |
A beanshell script (not a file name) |
Yes |
Name of variable |
A reference name for reusing the value computed by this function. |
No |
Example:
${__BeanShell(123*456)} - returns 56088
${__BeanShell(source("function.bsh"))} - processes the script in function.bsh
split函數按照分隔符分隔字符串,並返回原始字符串。若是任何分隔符相鄰,返回"?"。這個分隔的字
符串返回在變量${VAR_1},${VAR_2}等中。變量的數量返回在${VAR_n}中。自從JMeter 2.1.2之後,
一個連續的分隔符被做爲一個缺乏的變量處理,並以"?"返回。同時,容許它和ForEach控制器一塊兒工做
的更好,__split now deletes the first unused variable in case it was set by a previous
split.
例如:
Define VAR="a||c|" in the test plan.
${__split(${VAR},VAR),|}
This will return the contents of VAR, i.e. "a||c|" and set the following variables:
VAR_n=4 (3 in JMeter 2.1.1 and earlier)
VAR_1=a
VAR_2=?
VAR_3=c
VAR_4=? (null in JMeter 2.1.1 and earlier)
VAR_5=null (in JMeter 2.1.2 and later)
**
屬性 |
描述 |
是否須要 |
分隔的字符串 |
一個分隔的字符串,例如"a|b|c" |
是 |
變量名 |
A reference name for reusing the value computed by this function. |
是 |
分隔符 |
分隔符字符,例如 | 。If omitted, , is used. Note that , would need to be specified as \, . |
否 |
XPATH函數讀取一個XML文件並匹配XPath,每一個節點的匹配都是迭代遍歷,就像CVSReader。
例如:
${__XPath(/path/to/build.xml, //target/@name)}
這會匹配在build.xml文件的全部target元素,並返回name變量
參數
屬性 |
描述 |
是否須要 |
要解析的XML文件 |
要解析的XML文件 |
是 |
XPath |
在XML文件一個匹配節點的XPath表達式 |
是 |
setProperty函數設置JMeter屬性的值。來自函數的默認返回值是空字符串。因此這個函數調用能夠在任
何函數可用的地方使用。
原始值能夠經過設置第三個可選參數爲"true"來返回。
屬性對於JMeter是全局的,因此能夠用來在任何線程和線程組之間傳遞。
參數
屬性 |
描述 |
是否須要 |
Property Name |
被設置的屬性名 |
是 |
Property Value |
屬性的值 |
是 |
True/False |
原始值是否被返回 |
否 |
這個時間函數以不一樣的格式返回當前時間
參數
屬性 |
描述 |
是否須要 |
Format |
這個格式被傳遞給SimpleDateFormat。這個函數支持各類不一樣的簡寫別名,見下文 |
否 |
Variable |
要設置的變量名 |
否 |
若是這個格式字符串被刪除,那麼函數以毫秒返回當前時間。不然,當前時間被傳遞給SimpleDateFormat
。支持下列簡寫別名:
這些默認值能夠經過適當的設置JMeter屬性來改變,例如time.YMD=yyMMdd
jexl函數返回執行Commons JEXL 表達式的結果。
參數
屬性 |
描述 |
是否須要 |
表達式 |
要被計算的表達式 |
是 |
大多說變量經過函數或者測試元件例如自定義變量調用來設置;假如用戶已經徹底控制使用的變量名了。
然而一些變量經過JMeter內部定義。它們列表以下
屬性被定義在jmeter.properties文件內,或者在命令行上。一些附加屬性經過JMeter定義。以下列出。
START屬性也能夠被拷貝給使用其餘相同名字的變量。
and many other sources. These values are generated fresh for every request throughout the
course of the test.
20. 正則表達式
20.1 概述
JMeter 包含了軟件Apache Jakarta ORO模式匹配。
在Jakarta web 站點上有一些文檔,例如模式匹配字符概要信息。
還有一個是創建在OROMatcher使用手冊基礎上的文檔,它也頗有用。
這裏的模式匹配很接近Perl裏的模式匹配。一個徹底安裝的Perl包括了大量的正則表達式的文檔,能夠查找perlrequick, perlretut, perlre, perlreref。
它最值得強調的是在響應斷言上做爲測試元件使用時"包含"和"匹配"之間的不一樣:
"包含"意味着正則表達式匹配至少目標的一些部分,因此'al.t'是"匹配"'alphabet'。由於正則表達式匹配'phabe'字串。
不像Perl,正則表達式不須要嵌套在//內。 |
20.2 例子
提取單個字符串
假如你想匹配下列web頁面的一部分:
name="file" value="readme.txt" ,而且想提取readme.txt
一個合適正則表達式是:
name="file" value="(.+?)"
特定字符以下:
沒有?,+第一匹配成功以後會繼續,"直到發現最後一個可能"-可能並非想要的。 |
提取多個字符串
假如你想匹配下列web頁面的一部分:
name="file.name" value="readme.txt" ,而且想提取file.name和readme.txt
一個合適正則表達式是:
name="(.+?)" value="(.+?)"
這就建立了兩個組,它們將被JMeter正則表達式提取器模板爲$1$和$2$。
JMeter正則表達式提取器在附加變量中保存組的值。
例如,假設:
不要在//中嵌套正則表達式 |
下列變量將會被設置:
那些變量在JMeter測試計劃中稍後會談到,例如${MYREF},${MYREF_g1}等
20.3 命令行模式
模式匹配行爲表如今多種細微的不一樣的狀況,可是依賴於多行和單行修改者的設置。
會有四種能夠的組合: