Jmeter_初步认识随笔
1. 簡介
Apache JMeter是100%純java桌面應用程序,被設計用來測試客戶端/服務器結構的軟件(例如web應用程序)。它可以用來測試包括基于靜態和動態資源程序的性能,例如靜態文件,Java Servlets,Java 對象,數據庫,FTP 服務器等等。JMeter可以用來在一個服務器、網絡或者對象上模擬重負載來測試它的強度或者分析在不同的負載類型下的全面性能。
另外,JMeter能夠通過讓你們用斷言創建測試腳本來驗證我們的應用程序是否返回了我們期望的結果,從而幫助我們回歸測試我們的程序。為了最大的靈活性,JMeter允許我們使用正則表達式創建斷言。
1.1 歷史
Apache軟件組織的Stefano Mazzocchi是JMeter的創始人。他編寫它起初是為了測試Apache JServ的性能(一個已經被Apache Tomcat工程所替代的工程)。我們重新設計JMeter來增強用戶界面并增加功能測試的能力。
1.2 未來
我們希望看到作為開發者利用它的可插入架構使JMeter的功能快速擴展。未來發展的主要目標是在沒有影響JMeter的負載測試能力的情況下盡可能使JMeter成為最實用的回歸測試工具。
?
2. 入門
開始使用JMeter最容易的方法是首先下載最新版并且安裝它。這個版本包含所有你在構建和運行Web,FTP,JDBC,和JNDI等測試時使用需要的所有文件。
如果你想執行JDBC測試,你當然需要從供應商得到適當的JDBC驅動。JMeter沒有提供任何JDBC驅動。
你可能需要下載的其它軟件:
- BeanShell?- BeanShell函數和測試元件需要
- Java Activation Framework?- JavaMail需要
- Java Mail?- Mail可視化,Mail Reader 和 WebService(SOAP)取樣器需要
- JMS?- JMS 取樣器需要
- General Java download page?
| ? | 詳細參見JMeter Classpath?一章安裝附加的jar包 |
- 下一步, 開始使用JMeter并且參見用戶手冊創建一個測試計劃一章使自己更加熟悉JMeter基礎 (例如,添加和刪除元件)。
最后, 參見如何構建一個明確類型的測試用例的適合章節。例如,如果你對Web應用測試感興趣,那就參見創建一個Web測試計劃。其他具體的測試計劃章節是:
- 高級Web測試計劃
- JDBC
- FTP
- JMS 點到點
- JMS 主題
- LDAP
- LADP擴展
- WebServices (SOAP)
一旦你熟練創建和執行JMeter測試計劃, 通過你的測試計劃你會觀察到給你更多幫助的各種元件的配置(定時器, 監聽器, 斷言, 和其他)。
2.1 需求
JMeter 需要最小需求的運行環境。
2.1.1 Java 版本
| ? | JMeter需要一個完全適當的JVM1.4或者更高 |
因為JMeter 僅使用Java標準API, 請不要把因為JRE實現版本而無法運行JMeter的bug報告提交。
2.1.2 操作系統
JMeter是100%純Java應用程序并且能夠正確的在任何有適當的Java實現的操作系統上運行。
JMeter 在下列環境已經被測試:
- Unix (Solaris, Linux, 等)
- Windows (98, NT, 2000, xp)
- OpenVMS Alpha 7.3+
2.2 可選
如果你計劃做JMeter開發或者想使用SUN的java標準擴展包,你將需要下列更多的可選包。
2.2.1 Java 編譯器
如果你想編譯JMeter源代碼或者開發JMeter插件,你將需要一個完整的適當的JDK1.4或者更高。
2.2.2 SAX XML解析器
JMeter 使用 Apache的 Xerces XML 解析器,你可以選擇告訴JMeter使用一個不同的XML 解析器。 這樣做,把第三方的解析器的類包包含在JMeter的classpath中, 并更新 jmeter.properties?文件里的解析器實現的全類名。
2.2.3 Email 支持
JMeter有有限的 Email 能力。 它能夠發送基于測試結果的Email,并且支持POP/IMAP 取樣器。它現在不支持 SMTP 取樣。 為了能夠支持 Email, 需要添加Sun 的JavaMail包和activation包到JMeter classpath?。
2.2.4 SSL 加密
為了測試一個使用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)。 |
2.2.5 JDBC 驅動
如果你需要JDBC測試,需要添加廠商的JDBC驅動到classpath。確認文件是一個jar文件,而不是zip。
2.2.6 Apache SOAP
Apache SOAP 需要 mail.jar 和 activation.jar. 你需要下載并拷貝這兩個jar文件到你jmeter/lib 目錄.一旦文件放到那里,JMeter 會自動找到它們。
2.2.7 BeanShell
為了運行BeanShell函數或者任何BeanShell測試元件(取樣器,定時器等),你需要從http://www.beanshell.org/下載beanshell的jar文件并拷貝jar文件到jmeter/lib目錄,JMeter會自動找到它。
2.2.8 ActiveMQ 3.0類庫
詳細參見 http://activemq.apache.org/initial-configuration.html
| ? | 詳細參見JMeter Classpath?一章安裝附加的jar包 |
2.3 安裝
| ? | 避免在一個有空格的路徑安裝 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) ,但是不要改變任何子目錄命。父目錄路徑中不能包含任何空格;如果包含,你運行客戶端-服務器模式會有問題。
2.4 運行 JMeter
要運行JMeter, 運行 jmeter.bat (for Windows) 或者 jmeter (for Unix) 文件。那些文件在bin目錄下。稍微暫停后,JMeter GUI會顯示出來。
在bin目錄你會發現有些附加腳本很有用。Windows腳本文件(CMD文件需要Win2K或者更新):
- jmeter.bat - 運行JMeter(默認在GUI模式)
- jmeter-n.cmd - 使用一個JMX文件運行非GUI測試
- jmeter-n-r.cmd - 使用一個JMX文件遠程運行一個非GUI測試
- jmeter-t.cmd - 在GUI模式使用一個JMX文件
- jmeter-server.bat - 以服務器模式啟動JMeter
注意: LAST可以在jmeter-n.cmd, jmeter-t.cmd 和 jmeter-n-r.cmd中使用,意味著最后一次測試會運行.
Unix腳本文件; 可以運行在大多 Linux/Unix 系統.
- jmeter - 運行JMeter(默認在GUI模式)
- jmeter-server - 以服務器模式啟動JMeter
2.4.1 JMeter Classpath
JMeter 自動從下列目錄中的jar文件發現類。
- JMETER_HOME/lib - 用來放使用的jar文件
- JMETER_HOME/lib/ext - 用來放JMeter組件和擴展
如果你開發新的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。]
2.4.2 使用代理服務器
如果你從防火墻/代理服務器后測試,你需要提供給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請求時使用的。 |
2.4.3 非用戶界面模式 (命令行模式)
為了不相互影響測試, 你可以選擇運行沒有用戶界面的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
2.4.4 服務器模式
為了分布測試 ,在服務器模式運行JMeter,并且通過用戶界面控制每一臺服務器。
| ? | jmeter-server/jmeter-server.bat 腳本使用適當的classpath為你開始遠程注冊。如果失敗,參見關于JMeter服務器啟動細節。 |
運行jmeter-server/jmeter-server.bat,加上下列選項命令:
這個腳本也允許我們指定可選的防火墻/代理服務器信息:
-H [代理服務器主機名或者ip地址]
-P [代理服務器端口]
例如 : jmeter-server -H my.proxy.server -P 8000
2.4.5 通過命令行覆蓋屬性
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
| ? | 注意 |
2.4.6 日志和錯誤信息
如果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不會打斷一個測試來顯示一個錯誤對話框。
2.4.7 命令行選項目錄
調用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目錄
2.5 配置 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正在運行你的測試計劃(或者,至少, 它認為它是)。
有兩個類型的停止命令:
- 停止 (Control + '.') - 立刻停止所有的線程
- 關閉 (Control + ',')- 請求所有線程在當前任務結束后停止
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
- 設置執行測試的次數
每個線程會作為一個整體執行測試計劃并完全獨立于他測試線程。多線程用來模擬到達服務器程序的同步連接。
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取樣器包括:
- FTP 請求
- HTTP 請求
- JDBC 請求
- Java object 請求
- LDAP 請求
- SOAP/XML-RPC 請求
- WebService (SOAP) 請求
每個取樣器有一些你可以設置的屬性。你可以通過添加一個或多個配置元件到取樣器來進一步定制它。注意JMeter發送請求按照取樣器出現在樹中的順序。
如果你想發送多個相同類型的請求(例如,HTTP Request)到相同的服務器,可以考慮使用一個默認配置元件。每個控制器有一個或者多個默認配置元件(見下)。
記得添加一個監聽器到線程組來查看/保存你的請求結果到磁盤。
如果你對使用JMeter平臺的基礎驗證器到你的請求響應感興趣,添加一個斷言到請求控制器。例如, 在壓力測試一個web程序時,服務器會返回一個成功的HTTP響應代碼,但是這個頁面有錯誤或者被忽略部分。你可以添加斷言來檢查某個HTML標簽,一些 錯誤字符串,等等。JMeter允許你使用正則表達式創建斷言。
JMeter 內建取樣器
4.2.2 邏輯控制器
保持
邏輯控制器讓你定制當發送請求時JMeter使用的判斷邏輯。邏輯控制器還可以作為下列任何元件的子元件:取樣器(請求)、配置元件、和其他邏輯控制器。邏輯控制器可以改變來自它們的子元件的請求順序。它們可以修改請求本身,導致JMeter重復請求,等。
理解邏輯控制器在測試計劃中的效果,考慮下列測試樹:
- 測試計劃
- 線程組
- 僅一次控制器
- 登錄請求(一個HTTP請求)
- 加載搜索頁面(HTTP取樣器)
- Interleave Controller
- 搜索"A"(HTTP取樣器)
- 搜索"B"(HTTP取樣器)
- HTTP默認請求(配置元件)
- HTTP默認請求(配置元件)
- Cookie管理器(配置元件)
- 僅一次控制器
- 線程組
這個測試的第一件事就是登錄請求僅在第一次經過時被執行。隨后的迭代會忽略它。這應使用僅一次控制器。
登陸后,下一個取樣器加載搜索頁面( 假設一個用登錄的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沒有找到這個文本,它會標記這個為一個失敗的請求。
為了查看斷言結果,添加一個斷言監聽器到線程組。
Assertion--斷言,通常是用于對每一個request sampler進行額外驗證的工具。下面通過一個例子來介紹一下常用的幾個Assertions。
假設現在要進行一個登陸的壓力測試,下面是對pass的幾個定義:
1.正確login后,必須收到返回的身份驗證和用戶個人信息下載的完成信息;
2.響應時間不能超過150毫秒
3.返回的結果大小不能小于750bytes
根據以上的要求,我們在對應的request sampler下面添加了以下的Assertions。
?
A.Response Assertion
?
?Response Field to Test -- 標示被檢查對象是什么?
?Pattern Matching Rules -- 標明被檢查對象與驗證內容之間的關系,Contains(包含關系);Matches(匹配關系);Equals(相等關系);Not(非關系)
?Pattern to Test -- 需要驗證的內容列表
B.Duration Assertion
?
?Duration to Assert -- 允許的響應時間的最大值
C.Size Assertion
?
?Size to Assert -- 對于返回結果文件大小的標準定義
?
二、結果分析
添加了以上的Assertions后,我運行了一次腳本。以下是存放結果的.jtl文件的內容:
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,Latency
11/04/08 13:22:03,172,Do Login,200,OK,Thread Group 1-1,text,false,The operation lasted too long: It took 172 milliseconds, but should not have lasted longer than 150 milliseconds.,835,172
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-2,text,false,Test failed: text expected to contain /loginMsg="OK"/,633,156
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-3,text,false,The operation lasted too long: It took 156 milliseconds, but should not have lasted longer than 150 milliseconds.,839,156
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-4,text,false,The operation lasted too long: It took 156 milliseconds, but should not have lasted longer than 150 milliseconds.,836,156
11/04/08 13:22:03,78,Do Login,200,OK,Thread Group 1-5,text,true,,779,78
11/04/08 13:22:03,63,Do Login,200,OK,Thread Group 1-7,text,false,Test failed: text expected to contain /loginMsg="OK"/,570,63
11/04/08 13:22:03,141,Do Login,200,OK,Thread Group 1-6,text,false,The result was the wrong size: It was 721 bytes, but should have been greater than 750 bytes.,721,141
11/04/08 13:22:03,78,Do Login,200,OK,Thread Group 1-9,text,false,The result was the wrong size: It was 724 bytes, but should have been greater than 750 bytes.,724,78
11/04/08 13:22:03,204,Do Login,200,OK,Thread Group 1-10,text,false,The operation lasted too long: It took 204 milliseconds, but should not have lasted longer than 150 milliseconds.,1137,204
11/04/08 13:22:03,2985,Do Login,200,OK,Thread Group 1-8,text,false,Test failed: text expected to contain /loginMsg="OK"/,570,2985
我們可以看到,每一個Sampler都會經過Assertions的判斷,只要有一個不符合條件的都會標示為False。
?
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:
- Controller
- Post-Processor 1
- Sampler 1
- Sampler 2
- Timer 1
- Assertion 1
- Pre-Processor 1
- Timer 2
- Post-Processor 2
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)
- 更改名稱域為"Home Page"。
- 設置路徑域為 "/"。記得你不必設置服務器名域,因為你已經在HTTP默認請求元件中指定了這個值。
圖 5.5. Jakarta首頁的HTTP請求
下一步,添加每二個HTTP請求并修改下列屬性(見圖5.6):
- 更改名稱域為"Project Guidelines"。
- 設置路徑域為 "/site/guidelines.html"。
圖 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
?
?
?
?
6. 創建一個高級web測試計劃
在這章,你將學到如何創建高級測試計劃來測試web站點。
如果需要一個基礎的測試計劃例子,見創建一個web測試計劃 。
6.1 用URL重寫處理用戶會話
如果你的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 - 請求參數
6.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數據庫)。
- 綁定到池變量。 這需要能夠唯一標識這個配置。這是用來被JDBC取樣器識別這個配置來使用.
- 數據庫URL: jdbc: mysql://localhost:3306/test
- JDBC驅動類: com.mysql.jdbc.Driver
- 用戶名: guest
- 密碼: guest的密碼
剩下的域保留默認值。
圖 7.3. JDBC配置
再次選擇JDBC用戶元件。點擊鼠標右鍵,得到添加菜單,然后選擇添加-->Sampler-->JDBC請求。然后,選擇這個新元件來顯示其控制面板(見圖7.4)。
圖 7.4. JDBC請求
在我們這個測試計劃中,我們將發送2個JDBC請求。第一個是向Eastman Kodak stock,第二個是向Pfizer stock(很顯然需要改變這些例子來適合你的特殊的數據庫)。下面有插圖文字說明。
| ? | JMeter發送請求的次序就是你向樹中添加它們的次序。 |
開始編輯下列的屬性(見圖7.5):
- 修改名稱為"Kodak"
- 輸入池名:MySQL(在配置元件里面一樣)
- 輸入SQL查詢字符串域
圖 7.5. Eastman Kodak stock的JDBC請求
下一步,添加第二個JDBC請求并編輯下列的屬性(見圖7.6):
- 修改名字為"Pfizer"
- 輸入SQL查詢字符域
圖 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:JMS(Java Messaging Service)是Java平臺上有關面向消息中間件(MOM)的技術規范,它便于消息系統中的Java應用程序進行消息交換,并且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,翻譯為Java消息服務。
在本節中,你將學會如何創建一個測試計劃來測試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,通過運行 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。可能需要改變它。為了這樣工作成功,所有下列需要保持一致:
- 在服務器,使用新的端口數啟動rmiregistry
- 在服務器,啟動JMeter時指定server_port
- 在客戶端,更新remote_hosts屬性包含新的遠程主機:端口設置
自從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.
- mode - sample sending mode - default is Standard
- Standard - send samples as soon as they are generated
- Hold - hold samples in an array until the end of a run. This may use a lot of memory on the server.
- Batch - send saved samples when either the count or time exceeds a threshold
- Statistical - send a summary sample when either the count or time exceeds a threshold. The samples are summarised by thread group name and sample label. The following fields are accumulated:
- elapsed time
- latency
- bytes
- sample count
- error count
Other fields that vary between samples are lost.
The following properties apply to the Batch and Statistical modes:
- num_sample_threshold - number of samples in a batch (default 100)
- time_threshold - number of milliseconds to wait (default 60 seconds)
16.最佳實踐
16.1 限制線程數
你的硬件能力會限制你有效運行JMeter的線程數。它也會依賴于你服務器的速度(一個更快的服務器因為它更加快速的返回一個請求所以會使 JMeter工作更加努力)。JMeter工作越多,它的時間信息就越不準確。JMeter做越多的動作,每個線程必須等待訪問CPU的時間越長,定時信 息越長。如果你需要大規模的負載測試,考慮在多個機器上運行多個非用戶界面的JMeter。
16.2 何處放置Cookie 管理器
見構建一個Web測試
16.3 何處放置授權管理器
見構建一個高級的Web測試
16.4 使用代理服務器
詳細參見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}"。
16.5 用戶變量
一些測試計劃需要為不同的用戶/線程使用不同的值。例如,你可能想要測試一個為每個用戶指定一個唯一的登錄序列。這通過JMeter提供的設備很容易完成。
例如:
- 創建一個包含用戶名和密碼的文本文件,以逗號分隔。把這個文件放到你的測試計劃的相同目錄
- 添加一個CSV數據集配置元件到測試計劃。創建USER和PASS變量
- 在設當的取樣器使用${USER}替代登錄名,使用${PASS}替代密碼
CSV數據集元件會為每個線程讀取一個新行。
16.6 減少資源需求
減少資源使用的一些建議:
- 使用非用戶界面模式:jmeter -n -t test.jmx -l test.jtl
- 盡可能少的使用監聽器;如果使用-l標志
- 不要使用函數模式
- 使用CSV輸出而不是XML
- 僅保存你需要的數據
- 盡可能少的使用斷言
16.7 BeanShell 服務器
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
16.8 BeanShell scripting
16.8.1 Overview
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)
16.8.2 Sharing Variables
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.
?
17.求助!我的老板讓我負擔測試我們的web應用程序
這是一個相當開放的命題。首先有很多問題要問,另外還有一些必須的資源。你會需要一些硬件運行基準/負載測試。許多工具證明是有用的。可以考慮一些產品。最后,為什么Java是實現負載測試/基準產品的一個好選擇。
17.1 要問的問題
我們預期的平均用戶數(正常負載)是多少?
我們預期的峰值用戶數是多少?
什么時候壓力測試你應用程序是個好時間(例如,下班時間或者每個周末),記住這可能徹底崩潰你們一個或多個服務器?
我們側應用程序是否有狀態?如果是這樣,你的應用程序如何管理它(cookies,session重寫,或者其他方法)?
17.2 資源
下列資源會非常有用。記住如果你不定位這些資源,你將成為這些資源。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.
17.2.1 網絡
誰熟悉我們的網絡技術?如果你遇到任何防火墻或者代理問題,這會變的很重要。一個專用測試網絡(那會有一個非常低的網絡延遲)是非常好的事情。知道誰可以為你設立一個是非常有用的(如果你感覺這是必須的)。如果應用程序不能預期測量,誰可以添加額外的硬件?
17.2.2 應用程序
誰知道應用程序的功能如何?正常順序是
- 測試(低尺度--我們可以基準測試我們應用程序?)
- 基準測試(平均用戶數)
- 負載測試(最大用戶數)
- 破壞測試(最大極限是多少?)
測試過程可以從黑盒測試到白盒測試(不同點是第一個不需要應用程序知識[所以稱為"黑河"],然而第二個需要應用程序知識)進行。在這個過程不難發現應用程序的問題,所以它準備否定你的工作。
17.3 我應該使用什么平臺運行基準測試/負載測試?
這應該是一塊普遍使用的有一個標準的(例如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輸出和輸入數據到電子 表格。
17.4 工具
下列工具會都很有用。熟悉它們將會很有用的。這應該包括實驗它們,并閱讀適當的文檔(man-pages, info-files, application --help messages和任何提供的文檔)。
17.4.1 ping
它常用來確定你是否你個到達目標站點。Options can be specified so that 'ping' provides the same type of route reporting as 'traceroute'.
17.4.2 nslookup/dig
當用戶通常會使用一個人們易讀的網絡地址,但是你可能希望當執行基準測試/壓力測試時避免DNS查找的開銷。這就用來確定你目標站點的唯一地址(IP地址)。
17.4.3 traceroute
如果你不能"ping"通你的目標站點,這個命令多半可以用來確定問題(可能是防火墻或者代理)。它也可以用來估算整個網絡延時(本地運行應該給出最小可能網絡延遲-記住你的用戶運行的將會是一個繁忙的Internet)。通常,跳躍越少越好。
17.5 其他產品還有什么?
有很多商業的產品,但都有相當高的價格。如果你可以適應它,這或許也是可以走的路線。如果那些產品不能做你想要的,或者你限制在一個預算,下列工具就值得一看。事實上,你或許應該開始試試Apache ab工具,如果你的需求不是特別的復雜它可以很好的工作。
17.5.1 Apache 'ab'工具
你應該明確從使用這個開始。它很好的處理HTTP 'get'請求,做一點工作也可以處理HTTP 'post'請求。它用'C'語言寫的,它運行的非常好,并且提供很好的性能報告(if basic)。
17.5.2 HttpUnit
這個工具值得一看。它是一個用來執行HTTP測試/基準測試的類庫(因此更值得開發人員關注)。它想要用來連同JUnit代替web瀏覽器(因此是非GUI的)。
17.5.3 微軟WAS
這個工具也很值得一看。它有一個優秀的用戶界面,但是它也許不能完全做你想做的。If this is the case, be aware that the functionality of this product is not likely to change.
17.5.4 JMeter
如果你有非標準的需求,那么這個解決方案提供了以開源社區來提供它們(當然,如果你正在閱讀這個文檔,你可能已經熱衷于這個工具)。這個產品免費和你的需求一起進行。
17.6 為什么是Java?
為什么不是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?組件參考
18.1 Samplers
- FTP Request
- HTTP Request
- JDBC Request
- Java Request
- SOAP/XML-RPC Request
- WebService(SOAP) Request
- LDAP Request
- LDAP Extended Request
- Access Log Sampler
- BeanShell Sampler
- BSF Sampler
- TCP Sampler
- JMS Publisher
- JMS Subscriber
- JMS Point-to-Point
- JUnit Request
- Mail Reader Sampler
- Test Action
- 18.2 Logic Controllers
- Simple Controller
- Loop Controller
- Once Only Controller
- Interleave Controller
- Random Controller
- Random Order Controller
- Throughput Controller
- Runtime Controller
- If Controller
- While Controller
- Switch Controller
- ForEach Controller
- Module Controller
- Include Controller
- Transaction Controller
- Recording Controller
- 18.3 Listeners
- Sample Result Save Configuration
- Graph Full Results
- Graph Results
- Spline Visualizer
- Assertion Results
- View Results Tree
- Aggregate ReportO
- View Results in Table
- Simple Data Writer
- Monitor Results
- Distribution Graph (alpha)
- Aggregate Graph
- Mailer Visualizer
- BeanShell Listener
- Summary Report
- 18.4 Configuration Elements
- CSV Data Set Config
- FTP Request Defaults
- HTTP Authorization Manager
- HTTP Cache Manager
- HTTP Cookie Manager
- HTTP Request Defaults
- HTTP Header Manager
- Java Request Defaults
- JDBC Connection Configuration
- Login Config Element
- LDAP Request Defaults
- LDAP Extended Request Defaults
- TCP Sampler Config
- User Defined Variables
- Simple Config Element
- 18.5 Assertions
- Response Assertion
- Duration Assertion
- Size Assertion
- XML Assertion
- BeanShell Assertion
- MD5Hex Assertion
- HTML Assertion
- XPath Assertion
- XML Schema Assertion
- BSF Assertion
- 18.6 Timers
- Constant Timer
- Gaussian Random Timer
- Uniform Random Timer
- Constant Throughput Timer
- Synchronizing Timer
- BeanShell Timer
- 18.7 Pre Processors
- HTML Link Parser
- HTTP URL Re-writing Modifier
- HTML Parameter Mask
- HTTP User Parameter Modifier
- User Parameters
- Counter
- BeanShell PreProcessor
- BSF PreProcessor
- 18.8 Post-Processors
- Regular Expression Extractor
- XPath Extractor
- Result Status Action Handler
- Save Responses to a file
- Generate Summary Results
- BeanShell PostProcessor
- BSF PostProcessor
- 18.9 Miscellaneous Features
- Test Plan
- Thread Group
- WorkBench
- SSL Manager
- HTTP Proxy Server
- HTTP Mirror Server
- Property Display
- Debug Sampler
- Debug PostProcessor
- 18.10 Reports
- Report Plan
- Report Table
- HTML Report Writer
- Report Page
- Line Graph
- Bar Chart
?
?
19. 函數
JMeter函數是一些能夠轉化在測試樹中取樣器或者其他配置元件的域的特殊值。一個函數調用就像這樣:
${__functionName(var1,var2,var3)}
"__functionName"匹配函數名。
圓括號周圍設置函數的參數,例如${__time(YMD)}實際參數因函數而不同。不需要參數的函數使圓括號內
為空,例如${__threadNum}。
函數列表:
- regexFunction - 正則表達式計數器
- counter
- threadNum - 得到線程數
- intSum - 添加變量
- StringFromFile - 從文件讀取一行
- machineName - 得到本地計算機名
- JavaScript (Apache Rhino)
- random number
- CSVRead - 從CSV文件讀取
- 讀取一個屬性
- P - 讀取一個屬性
- setProperty - 設置一個屬性
- log - 記錄一個日志
- logn - 記錄一個日志
- BeanShell - 運行BeanShell
- split - 分隔一個字符串為變量
- XPath - 使用一個xpath表達式
- time - 返回一些格式的當前時間
- jexl - 執行一個jexl表達式
19.1 函數可以做什么
有兩類函數:自定義靜態值(或者變量),和內置函數。
自定義靜態值允許當一個測試樹編譯并且提交運行時自定義變量被它們的靜態值代替。這個替代在測試運行開始時發生一次。這可以用來替換所有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.
| ? | 函數在線程之間是共享的。在測試計劃中每個函數調用是被一個單獨函數實例調用的。 |
19.2 函數被用來做什么
一個用戶自定義函數可以寫在任何測試組件的任何域中。一些域不允許隨機字符串,因為他們期望數字,然而不期望一個函數。 然而,大多數域會允許函數。內建的函數允許寫進任何非控制器測試組件的任何域。 這包含取樣器,定時器,監聽器,修改器,斷言,前置處理器,后置處理器和配置元件。
| ? | 當使用變量/函數When using variable/function references in SQL code (etc), remember to include any |
19.3 書寫函數字符串
自定義函數使用這種格式: ${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.
| ? | * 如果你使用和內建函數同樣的名字定義一個自定義變量,你的靜態變量會覆蓋內建函數。 |
19.4 函數助手對話框
函數助手對話框從JMeter工具菜單中是可用的。
函數助手對話框
使用函數助手,你可以從下拉中選擇一個函數,并賦予值。
對于它的參數,表格的左列提供了簡短的參數描述,右邊的列是你為那個參數填寫的值。不同的函數使用不同的參數。
當你完成這些,點擊"生成"按鈕,適當的字符串就生成出來了,你可以拷貝粘貼到你喜歡的測試計劃中。
19.5 函數
19.5.1__regexFunction
正則函數用來解析使用任何正則表達式的前響應(通過用戶提供)。這個函數返回使用填充的變量值的模板字符串。
__regexFunction存儲值以備以后使用。在第六個參數中,你可以指定一個參考名。在以后這個函數執行時,同樣的值會在稍后使用自定義值規則時被得到。例如,如果你輸入"refName"作為第六個參數,你將可以這樣使用:
- ${refName} to refer to the computed result of the second parameter ("Template for the replacement string") parsed by this function
- ${refName_g0} to refer to the entire match parsed by this function.
- ${refName_g1} to refer to the first group parsed by this function.
- ${refName_g#} to refer to the n th group parsed by this function.
- ${refName_matchNr} to refer to the number of groups found by this function.
參數
| 屬性 | 描述 | 是否需要 |
| 第一個參數 | 第一個參數使用應用于響應數據的正則表達式。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 |
19.5.2__counter
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 |
19.5.3__threadNum
thread number函數簡單返回當前執行的線程數量。那些數字是單獨的線程組,意味著從函數的視角來看線程組1的線程 #1和在另一個線程組的線程#1是不可區分的。
這個函數沒有參數。
| ? | 這個函數不可以運行在那些任何運行在一個單獨線程的配置元件中(例如 自定義變量)。 Nor does it make sense to use it on the Test Plan. |
19.5.4a__intSum
intSum函數用來計算兩個或者更多int值的和。
| ? | JMeter2.3.1或者更早版本需要被表現的參考名,這個參考名現在是可選的,但是它必須不是一個非法的整數 |
屬性
| 屬性 | 描述 | 是否需要 |
| 第一個參數 | 第一個int值。 | 是 |
| 第二個參數 | 第二個int值。 | 是 |
| 第n個參數 | 第n個int值。 | 否 |
| 最后一個參數 | 為通過這個函數計算的值重用的參考名。如果指定,參考名必須包含至少一個非數字字符,否則它將被作為另一個int值對待添加進去。 | 否 |
19.5.4b__longSum
longSum函數用來計算兩個或者更多long值的和。
屬性
| 屬性 | 描述 | 是否需要 |
| 第一個參數 | 第一個long值。 | 是 |
| 第二個參數 | 第二個long值。 | 是 |
| 第n個參數 | 第n個long值。 | 否 |
| 最后一個參數 | 為通過這個函數計算的值重用的參考名。如果指定,參考名必須包含至少一個非數字字符,否則它將被作為另一個long值對待添加進去。 | No |
19.5.5 __StringFromFile
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:
000 - insert the number packed out to 3 digits with leading zeros if necessary
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.
19.5.6 __machineName
machineName函數返回本地主機名。
屬性
| 屬性 | 描述 | 是否需要 |
| 變量名 | 為重用通過這個函數計算的這個值的一個參考名 | 否 |
19.5.7 __javaScript
javaScript函數執行一個JavaScript代碼片段,并返回它的值。
JMeter的Javascript函數調用一個單獨的JavaScript解析器。Javascript是一種腳本語言,所以你可以做計算等。
語言詳細,請參考Mozilla Rhino概述
下列變量對于腳本是可用的:
- ctx - JMeterContext 對象
- vars - JMeterVariables 對象
- threadName - 字符串
- sampler - 當前取樣器對象 (如果有的話)
- sampleResult - 前一個 SampleResult 對象 (如果有的話)
- props - JMeter Properties 對象
| ? | 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: |
19.5.8__Random
random函數返回在最小值和最大值之間的一個隨機數。
屬性
| 屬性 | 描述 | 是否需要 |
| 最小值 | 一個數字 | 是 |
| 最大值 | 一個更大的數 | 是 |
| 變量名 | A reference name for reusing the value computed by this function. | 否 |
19.5.9__CSVRead
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:
- COL1a ${__CSVRead(random.txt,0)}
- COL2a ${_CSVRead(random.txt,1)}${_CSVRead(random.txt,next)}
- COL1b ${__CSVRead(random.txt,0)}
- COL2b ${_CSVRead(random.txt,1)}${_CSVRead(random.txt,next)}
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 . |
19.5.9__property
property返回JMeter的屬性的值。如果這個屬性值沒找到,沒有默認值提供,它會返回屬性名。當提供一個默認值時,就不需要提供一個函數名 - 參數可以為空,并它被忽略。
For example:
- ${__property(user.dir)} - 返回user.dir值
- ${__property(user.dir,UDIR)} - 返回user.dir值并保存在UDIR中
- ${__property(abcd,ABCD,atod)} - 返回屬性abcd的值(如果未定義,返回"atod") 并保存在ABCD中
- ${__property(abcd,,atod)} - 返回屬性abcd的值 (如果未定義,返回"atod")但并不保存它
屬性
| 屬性 | 描述 | 是否需要 |
| 屬性名 | 要得到的屬性名 | 是 |
| 變量名 | A reference name for reusing the value computed by this function. | 否 |
| 默認值 | 這個屬性的默認值 | 否 |
19.5.10_P
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 |
19.5.11__log
log函數把一條信息記入日志,并返回空字符串
參數
| 屬性 | 描述 | 是否需要 |
| 被記錄的字符串 | 一個字符串 | 是 |
| 日志等級 | OUT, ERR, DEBUG, INFO (默認), WARN or ERROR | 否 |
| Throwable文本 | 如果非空,創建一個Throwable傳遞到 logger | 否 |
OUT和ERR日志等級用來直接輸出到System.out和System.err
相應的,既然這樣,輸出總是被打印 - 它不依賴當前的日志等級
19.5.12__logn
logn函數把一條信息記入日志,并返回空字符串
參數
| 屬性 | 描述 | 是否需要 |
| 被記錄的字符串 | 一個字符串 | 是 |
| 日志等級 | OUT, ERR, DEBUG, INFO (默認), WARN or ERROR | 否 |
| Throwable文本 | 如果非空,創建一個Throwable傳遞到 logger | 否 |
相應的,既然這樣,輸出總是被打印 - 它不依賴當前的日志等級
19.5.13__BeanShell
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:
- log - the logger for the BeanShell function
- ctx - the current JMeter context variable
- vars - the current JMeter variables
- threadName - the threadName
- Sampler the current Sampler, if any
- SampleResult - the current SampleResult, if any
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
19.5.14_split
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 \, . | 否 |
19.5.15_XPATH
XPATH函數讀取一個XML文件并匹配XPath,每個節點的匹配都是迭代遍歷,就像CVSReader。
例如:
${__XPath(/path/to/build.xml, //target/@name)}
這會匹配在build.xml文件的所有target元素,并返回name變量
參數
| 屬性 | 描述 | 是否需要 |
| 要解析的XML文件 | 要解析的XML文件 | 是 |
| XPath | 在XML文件一個匹配節點的XPath表達式 | 是 |
19.5.16_setProperty
setProperty函數設置JMeter屬性的值。來自函數的默認返回值是空字符串。所以這個函數調用可以在任
何函數可用的地方使用。
原始值可以通過設置第三個可選參數為"true"來返回。
屬性對于JMeter是全局的,所以可以用來在任何線程和線程組之間傳遞。
參數
| 屬性 | 描述 | 是否需要 |
| Property Name | 被設置的屬性名 | 是 |
| Property Value | 屬性的值 | 是 |
| True/False | 原始值是否被返回 | 否 |
19.5.17_time
這個時間函數以不同的格式返回當前時間
參數
| 屬性 | 描述 | 是否需要 |
| Format | 這個格式被傳遞給SimpleDateFormat。這個函數支持各種不同的簡寫別名,見下文 | 否 |
| Variable | 要設置的變量名 | 否 |
如果這個格式字符串被刪除,那么函數以毫秒返回當前時間。否則,當前時間被傳遞給SimpleDateFormat
。支持下列簡寫別名:
- YMD = yyyyMMdd
- HMS = HHmmss
- YMDHMS = yyyyMMdd-HHmmss
- USER1 = whatever is in the Jmeter property time.USER1
- USER2 = whatever is in the Jmeter property time.USER2
這些默認值可以通過適當的設置JMeter屬性來改變,例如time.YMD=yyMMdd
19.5.18_jexl
jexl函數返回執行Commons JEXL 表達式的結果。
參數
| 屬性 | 描述 | 是否需要 |
| 表達式 | 要被計算的表達式 | 是 |
19.6預先定義變量
大多說變量通過函數或者測試元件例如自定義變量調用來設置;假如用戶已經完全控制使用的變量名了。
然而一些變量通過JMeter內部定義。它們列表如下
- cookiename - 包含cookie的值
- JMeterThread.last_sample_ok - 最后一個取樣是否正確 - 正確/不正確
19.7預先定義屬性
屬性被定義在jmeter.properties文件內,或者在命令行上。一些附加屬性通過JMeter定義。如下列出。
START屬性也可以被拷貝給使用其他相同名字的變量。
- START.MS-開始時間,使用ms為單位
- START.YMD-開始時間,使用yyyyMMdd格式
- START.HMS-開始時間,使用HHmmssnctions
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="(.+?)"
特定字符如下:
- (and)-它們會嵌套到被返回的匹配字符串部分
- .-匹配任何字符。+-一次或者多次。?-不是貪婪的,例如:當第一次匹配成功后停止
| ? | 沒有?,+第一匹配成功之后會繼續,"直到發現最后一個可能"-可能并不是想要的。 |
提取多個字符串
假如你想匹配下列web頁面的一部分:
name="file.name" value="readme.txt" ,并且想提取file.name和readme.txt
一個合適正則表達式是:
name="(.+?)" value="(.+?)"
這就創建了兩個組,它們將被JMeter正則表達式提取器模板為$1$和$2$。
JMeter正則表達式提取器在附加變量中保存組的值。
例如,假設:
- 參考名:MYREF
- 表達式:name="(.+?)" value="(.+?)"
- 模板:$1$$2$
| ? | 不要在//中嵌套正則表達式 |
下列變量將會被設置:
- MYREF: file.namereadme.txt
- MYREF_g0: name="file.name" value="readme.txt"
- MYREF_g1: file.name
- MYREF_g2: readme.txt
那些變量在JMeter測試計劃中稍后會談到,例如${MYREF},${MYREF_g1}等
20.3 命令行模式
模式匹配行為表現在多種細微的不同的情況,但是依賴于多行和單行修改者的設置。
會有四種可以的組合:
- 默認行為:'.'匹配任何字符除了"\n",^匹配僅這個字符串開始的,$匹配僅在結尾的或者一個新行的結尾。
- 單行修改者(?s):視字符串為一個單獨行。'.'匹配任何字符,甚至"\n",^匹配僅這個字符串開始的,$匹配僅在結尾的或者一個新行的結尾。
- 多行修改者(?m):視字符串為一個多行集。'.'匹配任何字符除了"\n",$能夠匹配在字符串內開始或者結束的任何行。
- 雙修改者(?sm):視字符串為一個單獨行,但是探測多行。'.'匹配任何字符,甚至"\n"。然而,^和$能夠匹配在字符串內開始或者結束的任何行。
21. 測試結果分析
一、Listener的使用
用過LoadRunner的人應該都知道,LoadRunner會為我們提供一大堆圖標和曲線。但是在Jmeter里,我們只能找到幾個可憐的 Listener來方便我們查看測試結果。但是,對于初學者來說,一些簡單的結果分析工具可以使我們更容易理解性能測試結果的分析原理。所以,千萬別小看 這幾個簡單的Listener啊。
A.Aggregate Report 聚合報告
?
我們可以看到,通過這份報告我們就可以得到通常意義上性能測試所最關心的幾個結果了。
Samples -- 本次場景中一共完成了多少個Transaction
Average -- 平均響應時間
Median -- 統計意義上面的響應時間的中值
90% Line -- 所有transaction中90%的transaction的響應時間都小于xx
Min -- 最小響應時間
Max -- 最大響應時間
PS: 以上時間的單位均為ms
Error -- 出錯率
Troughput -- 吞吐量,單位:transaction/sec
KB/sec -- 以流量做衡量的吞吐量
B.View Results Tree 以樹狀列表查看結果
?
通過這個Listener,我們可以看到很詳細的每個transaction它所返回的結果,其中紅色是指出錯的transaction,綠色則為通過的。
如果你測試的場景會有很多的transaction完成,建議在這個Listener中僅記錄出錯的transaction就可以了。要做到這樣,你只需要將Log/Display:中的Errors勾中就可以了。
二、.jtl文件的分析
在性能測試過程中,我們往往需要將測試結果保存在一個文件當中,這樣既可以保存測試結果,也可以為日后的性能測試報告提供更多的素材。
Jmeter中,結果都存放在.jtl文件。這個.jtl文件可以提供多種格式的編寫,而一般我們都是將其以csv文件格式記錄,這樣做是因為csv文件格式看起來比較方便,更重要的是這樣做可以為二次分析提供很多便利。
我這里所說的二次分析是指除了使用Listener之外,我們還可以對.jtl文件進行再次分析。
a.設置jtl文件格式
我們從jmeter官方網站中下載下來的Jmeter解壓后是可以直接使用的。但是,使用默認配置生成的jtl文件內容并不能滿足我們的需要。于是 我們必須進行必要的設置。在2.2版本中,如果要修改jtl設置必須要到jmeter.properties文件中設置;但是在2.3版本中,我們只需要 在界面上設置就可以了。你只需要選擇某個Listener,點擊頁面中的configure按鈕。此時,一個設置界面就會彈出來,建議多勾選如下 項:Save Field Name,Save Assertion Failure Message。
b.jtl文件中的各項
經過了以上設置,此時保存下來的jtl文件會有如下項:
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,Latency
請求發出的絕對時間,響應時間,請求的標簽,返回碼,返回消息,請求所屬的線程,數據類型,是否成功,失敗信息,字節,響應時間
其中聚合報告中的,吞吐量=完成的transaction數/完成這些transaction數所需要的時間;平均響應時間=所有響應時間的總和/完成的transaction數;失敗率=失敗的個數/transaction數
溫馨提示:在jmeter2.2和2.3版本中,都存在的一個問題是當我們重新打開jmeter,使用某個Listener來查看jtl文件 時,jmeter是會報錯的。因此當你使用命令行方式完成了一個場景的測試后,你得到的只是一堆保存在jtl文件中的原始數據。所以知道聚合報告中的各項 的來源是可以方便大家擺脫測試工具來進行結果的分析。
?
?
posted on 2017-01-09 10:35?Lyonjiayou 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/Lyonjiayou/p/6264290.html
總結
以上是生活随笔為你收集整理的Jmeter_初步认识随笔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 模拟微信登录,实例详解PHP实现
- 下一篇: 简易listview与adapter实现