2020/04/08更新部分描述
-
Jmeter簡介
-
Jmeter的基本概念
百度百科:
Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟件做壓力測試,它最初被設計用於Web應用測試,但后來擴展到其他測試領域。 它可以用於測試靜態和動態資源,例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、數據庫、FTP 服務器, 等等。JMeter 可以用於對服務器、網絡或對象模擬巨大的負載,來自不同壓力類別下測試它們的強度和分析整體性能。另外,JMeter能夠對應用程序做功能/回歸測試,通過創建帶有斷言的腳本來驗證你的程序返回了你期望的結果。為了最大限度的靈活性,JMeter允許使用正則表達式創建斷言
-
我們為什么使用Jmeter
- 開源免費,基於Java編寫,可集成到其他系統可拓展各個功能插件
- 支持接口測試,壓力測試等多種功能,支持錄制回放,入門簡單
- 相較於自己編寫框架或其他開源工具,有較為完善的UI界面,便於接口調試
- 多平台支持,可在Linux,Windows,Mac上運行
-
-
Jmeter安裝配置
-
Windows下Jmeter下載安裝
-
登錄 http://jmeter.apache.org/download_jmeter.cgi ,根據自己平台,下載對應文件(要求Java8+版本,牆裂建議下載英文原版,中文的翻譯很爛)
- 安裝JDK,配置環境變量(具體步驟不做介紹)
-
將下載Jmeter文件解壓,打開/bin/jmeter.bat
-
-
其他平台安裝Jmeter
- 與Windows平台一致,除入口文件不同,例如linux平台下為/bin/jmeter.sh
-
Jmeter的目錄結構
-
/bin 目錄(常用文件介紹)
examples:目錄下包含Jmeter使用實例
ApacheJMeter.jar:JMeter源碼包
jmeter.bat:windows下啟動文件
jmeter.sh:Linux下啟動文件
jmeter.log:Jmeter運行日志文件
jmeter.properties:Jmeter配置文件
jmeter-server.bat:windows下啟動負載生成器服務文件
jmeter-server:Linux下啟動負載生成器文件
- /docs目錄——Jmeter幫助文檔
- /extras目錄——提供了對Ant的支持文件,可也用於持續集成
- /lib目錄——存放Jmeter依賴的jar包,同時安裝插件也放於此目錄
- /licenses目錄——軟件許可文件,不用管
- /printable_docs目錄——Jmeter用戶手冊
-
-
-
Jmeter相關插件安裝:
-
插件安裝:
Jmeter的插件安裝很簡單,只需要下載對應插件解壓即可。
-
-
- 下載地址:http://jmeter-plugins.org/downloads/all/
- 下載后解壓放入:apache-jmeter-5.2.1\lib\ext\目錄下
-
重啟jmeter
ps:數據庫鏈接驅動如果需要需要專門下載,例如mysql需要jdbc的jar包,地址:http://dev.mysql.com/downloads/file/?id=462850
使用注意事項:添加第三方插件並使用后保存的jmx文件在未添加該插件的運行環境下會導致無法打開該文件並報錯,請保持環境一致性。
-
用例生成與導出:
Jmeter的用例格式為jmx文件,實際為xml格式,感興趣可以學習下自己定制生成想要的jmx文件。
-
生成原則:
- 每個功能模塊為一個獨立的jmx文件。增加可維護性。(盡量不要將一個jmx文件放入太多功能,后期維護成本會很高。)
- 模塊的私有變量保存在模塊中,多模塊共有的(例如服務器ip端口等)可以考慮存在單獨的文件中讀取。
- 接口測試不要放太多線程,畢竟不是做壓力測試,意義也不大。
-
導出方法:
- 編寫測試用例
-
文件——保存為——確定:(快捷鍵:保存ctrl+s or 保存為ctrl+shift+s)
-
-
Jmeter常用文件類型
-
Jmx文件
- 文件的實際類型:xml
- 文件樣本:
-

<jmeterTestPlan version="1.2" properties="1.8"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test" enabled="true"> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <stringProp name="TestPlan.comments">Sample test for demonstrating JMeter Ant build script and Schematic stylesheet</stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <longProp name="ThreadGroup.start_time">1143889321000</longProp> <stringProp name="ThreadGroup.delay"></stringProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.num_threads">3</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <stringProp name="LoopController.loops">5</stringProp> <boolProp name="LoopController.continue_forever">false</boolProp> </elementProp> <longProp name="ThreadGroup.end_time">1143889321000</longProp> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> </ThreadGroup> <hashTree> <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true"> <stringProp name="CounterConfig.start">1</stringProp> <stringProp name="CounterConfig.incr">1000</stringProp> <stringProp name="CounterConfig.name">C</stringProp> <boolProp name="CounterConfig.per_user">false</boolProp> <stringProp name="CounterConfig.end">1000000</stringProp> </CounterConfig> <hashTree/> <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Sample 1" enabled="true"> <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="Sleep_Time" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">100</stringProp> <stringProp name="Argument.name">Sleep_Time</stringProp> </elementProp> <elementProp name="Sleep_Mask" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">0xFF</stringProp> <stringProp name="Argument.name">Sleep_Mask</stringProp> </elementProp> <elementProp name="Label" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.name">Label</stringProp> </elementProp> <elementProp name="ResponseCode" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">200</stringProp> <stringProp name="Argument.name">ResponseCode</stringProp> </elementProp> <elementProp name="ResponseMessage" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">ResponseMessage</stringProp> </elementProp> <elementProp name="Status" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">Status</stringProp> </elementProp> <elementProp name="SamplerData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Request</stringProp> <stringProp name="Argument.name">SamplerData</stringProp> </elementProp> <elementProp name="ResultData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Response C=${C}</stringProp> <stringProp name="Argument.name">ResultData</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp> </JavaSampler> <hashTree> <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> <collectionProp name="Asserion.test_strings"> <stringProp name="51">3</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <intProp name="Assertion.test_type">6</intProp> <stringProp name="Assertion.assume_success">false</stringProp> </ResponseAssertion> <hashTree/> </hashTree> <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Sample 2" enabled="true"> <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="Sleep_Time" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">100</stringProp> <stringProp name="Argument.name">Sleep_Time</stringProp> </elementProp> <elementProp name="Sleep_Mask" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">0xFF</stringProp> <stringProp name="Argument.name">Sleep_Mask</stringProp> </elementProp> <elementProp name="Label" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.name">Label</stringProp> </elementProp> <elementProp name="ResponseCode" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">200</stringProp> <stringProp name="Argument.name">ResponseCode</stringProp> </elementProp> <elementProp name="ResponseMessage" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">ResponseMessage</stringProp> </elementProp> <elementProp name="Status" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">OK</stringProp> <stringProp name="Argument.name">Status</stringProp> </elementProp> <elementProp name="SamplerData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Request</stringProp> <stringProp name="Argument.name">SamplerData</stringProp> </elementProp> <elementProp name="ResultData" elementType="Argument"> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.value">Response C=${C} Tn=${__threadNum}</stringProp> <stringProp name="Argument.name">ResultData</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp> </JavaSampler> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
-
Jtl文件
- 文件的實際類型:自定義
-
定義方法:
修改{jmeterhome}/bin/jmeter.profile,可選擇格式:csv,xml,db
# legitimate values: xml, csv, db. Only xml and csv are currently supported.
#jmeter.save.saveservice.output_format=csv
-
Jmeter運行模式及參數
-
GUI模式
打開已有的jmx文件(文件——打開)
點擊啟動按鈕運行
由於GUI模式本身就是帶界面的,也有中文版,就不在此詳細介紹了。
-
命令行模式
-
依賴:
- 配置jmeter環境變量(windows下為將${jmeterhome}/bin加入Path變量)
- 如果未加入環境變量,在執行的時候可以直接給出全路徑或在${jmeterhome}/bin下執行
-
命令:
jmeter -n -t <testplan filename> -l <listener filename>
-
參數:
- -h 幫助 -> 打印出有用的信息並退出
- -n 非 GUI 模式 -> 在非 GUI 模式下運行 JMeter
- -t 測試文件 -> 要運行的 JMeter 測試腳本文件
- -l jtl文件 -> 記錄結果的文件
- -r 遠程執行 -> 啟動遠程服務
- -H 代理主機 -> 設置 JMeter 使用的代理主機
- -P 代理端口 -> 設置 JMeter 使用的代理主機的端口號
- -j 日志文件->設置JMeter日志文件的名稱
-
實例:
JMeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000
-
執行步驟:
JMeter 默認去當前目錄尋找腳本文件,並把日志記錄在當前目錄。比如你在 C:\tools\apache-jmeter-2.11\bin 目錄下執行以上命令,JMeter 會去該目錄下尋找 test.jmx 腳本並把執行結果放在該目錄。如果你的腳本在其他目錄,而且想要把執行結果放在另外文件夾,可以使用絕對路徑告訴 JMeter。
- 執行過程查看:
-
-
D:\apache-jmeter-3.0\bin>jmeter -n -t D:\共享\bpintocpin.jmx -l D:\共享\test.jtl Writing log file to: D:\apache-jmeter-3.0\bin\jmeter.log Creating summariser <summary> Created the tree successfully using D:\共享\bpintocpin.jmx Starting the test @ Fri Jun 17 15:12:21 CST 2016 (1466147541295) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary = 1 in 00:00:01 = 0.8/s Avg: 1178 Min: 1178 Max: 1178 Err: 0 (0.00%) Tidying up ... @ Fri Jun 17 15:12:22 CST 2016 (1466147542649) ... end of run
-
執行結果查看:
-
GUI界面打開聚合報告
- 在GUI界面創建一個聚合報告
-
聚合報告界面點擊瀏覽,選中生成的.jtl文件,打開
- 執行過程中查看
summary = 1 in 00:00:01 = 0.8/s Avg: 1178 Min: 1178 Max: 1178 Err: 0 (0.00%)
-
-
jtl文件轉化成html格式查看
- 通過xslt工具轉化成html格式(保存格式必須為xml格式)
-
-
Jmeter常用控件
-
測試計划(Test Plan)
控件截圖:
理解:包含一個測試的所有內容,包含所有的控件,屬性,變量。所以一個jmx文件中只有有一個測試計划。測試計划中可以定義變量,引入jar包,編輯測試模式等。
注意事項:
可將一些不常變化的數據存入測試計划的變量,方便在測試計划內調用(例如服務器ip,端口,數據庫ip等)。
函數測試模式會記錄來每個請求到服務器的取樣結果,如果在監聽器中定義了數據寫入文件,會將這些輸入寫入到該文件中。同時,該模式會嚴重影響性能。
-
工作台(5的版本中是沒有工作台的概念了,都整合到測試計划中,可以直接右鍵添加‘非測試元件’)
控件截圖:
理解:控件的暫存區域,在測試過程中可以把暫時不用的控件放入其中,待測試完成后放回原來的位置。
注意事項:工作台中的控件不會保存在jmx文件中,所以,如果關閉jmeter,工作台中的控件會丟失。
常用控件:
-
Property Display(屬性顯示)
- 創建方式:右鍵,添加——非測試元件——Property Display(屬性顯示)
-
截圖:
- 功能:查看當前測試計划中的屬性以及系統中的屬性
-
-
線程組( Threads (Users) )
理解:一個虛擬用戶組,線程組內線程數量在運行過程中不會發生改變。
注意事項:線程間變量相互獨立。一個測試計划內可以包含多個線程組。
可定義內容:
取樣器錯誤后執行的操作:繼續執行,啟動下一個線程,停止線程,停止測試,立刻停止
線程屬性:線程數量,線程啟動間隔時間(0為立刻啟動所有線程),單線程循環次數,每次迭代使用相同的用戶,線程執行順序,是否使用調度器。
調度器配置:持續時間,啟動延遲,啟動時間,結束時間(5版沒有)
-
線程組(Thread Group):
控件截圖:
理解:常規意義上的線程組,即虛擬用戶組。
-
SetUp Thread Group:
控件截圖:
理解:測試初始化操作,即線程組開始之前執行的內容。
實際使用:可用於初始化測試環境,測試數據准備等。
-
TearDown Thread Group:
控件截圖:
理解:測試執行后操作,即線程組執行完成后執行的內容。
實際使用:可用於清理測試環境,清空測試數據等。
-
-
測試片段(Test Fragment)
- 理解:與線程組同級別,但是默認不會執行。只有當他被模塊控制器引用的時候才會被執行。
-
控件截圖:
-
邏輯控制器(Logic Controller)
- 理解:用來控制采樣器的執行順序
-
分類:
- 控制采樣器的邏輯執行順序,如Loop Controller、If Controller等
- 對采樣器進行分組,方便控制的,如Throughput Controller、Transaction Controller
-
控件截圖:
-
常用控件:
-
簡單控制器(Simple Controller):
作用:這是Jmeter里最簡單的一個控制器,它可以讓我們組織我們的采樣器和其它的邏輯控制器(分組功能),提供一個塊的結構和控制,並不具有任何的邏輯控制或運行時的功能。
-
循環控制器(Loop Controller):
作用:指定其子節點運行的次數,可以使用具體的數值(如下圖,設置為5次),也可以使用變量
1、Forever選項:勾選上這一項表示一直循環下去
2、如果同時設置了線程組的循環次數和循環控制器的循環次數,那循環控制器的子節點運行的次數為兩個數值相乘的結果。
-
僅一次控制器(Once Only Controller):
作用:在測試計划執行期間,該控制器下的子結點對每個線程只執行一次,登錄場景經常會使用到這個控制器。
注意:將Once Only Controller作為Loop Controller的子節點,Once Only Controller在每次循環的第一次迭代時均會被執行。
-
ForEach控制器(ForEach Controller):
作用:ForEach控制器一般和用戶自定義變量一起使用,其在用戶自定義變量中讀取一系列相關的變量。該控制器下的采樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。如下圖:
參數:
- Input Variable Prefix:輸入變量前綴
- Output variable name:輸出變量名稱
- Start index for loop(exclusive):循環開始的索引(這里如果不填寫,默認從1開始,如果沒有1開始的變量,執行時會報錯)
- End index for loop(inclusive):循環結束的索引
- Add"_"before number:輸入變量名稱中是否使用"_"進行間隔。
用戶自定義變量:
變量名前綴為ForEach Controller中Input variable prefix定義的name + 下划線(上圖中我們勾選了下划線)+數字編號
執行結果:
總共執行了3次,每次執行時會把獲取到的變量值賦值給輸出變量outName,其它地方可以通過${outName}進行調用。
-
事務控制器(Transaction Controller):
作用: 事務控制器會生產一個額外的采樣器,用來統計該控制器子結點的所有時間。
參數:
- Generate parent sample:(生成父樣本-選中這個參數結果展示如下圖紅框,否則顯示為下圖藍框)
- Include duration of timer and pre-post processors in generated sample(在生成的樣本中包括定時器和預處理程序的持續時間):選中這一項會統計定時器(timer)的時間,否則只統計采樣器(sample)的時間
-
If 控制器(If Controller):
作用:根據給定表達式的值決定是否執行該節點下的子節點,默認使用javascript的語法進行判斷(如下圖紅框內的文字)。
標紅字體的意思大概是,如果勾選了 下面的 interpret condition as variable expression 則要用_jexl3或者_groovy 轉換成true或者false;參數:
- Interpret Condition as Variable Expression?:選中這一項時表示:判斷變量值是否等於字符串true(不區分大小寫),如果是true就輸出結果;
- Evaluate for all children:如果選中這一項,在每個子結點執行前都會計算表達式
假設定義的變量是介個樣子滴
示例一:使用變量的方式進行判斷:因為這個等式的結果是true,所以可以將結果正常輸出
示例二:選中Interpret Condition as Variable Expression?如果這個變量是存儲的ture或者false,可以直接引用,勾不勾 inerpret condition as varilable expression 都沒有關系示例三:我們用官方提供的函數來試一下:其結果也是一樣可行的。(如果'||'換成‘,’,那后邊的a==1會變成true的結果輸出的)
-
Switch控制器(Switch Controller):
作用:Switch控制器通過給該控制器中的Value賦值,來指定運行哪個采樣器。有兩種賦值方式:
- 第一種是數值,Switch控制器下的子節點從0開始計數,通過指定子節點所在的數值來確定執行哪個元素。
- 第二種是直接指定子元素的名稱,比如采樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。
當Value為空時,默認執行第1個子節點元素。
示例:
1、Switch Controller選擇的值為login page
2、執行結果:
-
吞吐量控制器(Throughput Controller):
作用:控制其下的子節點的執行次數與負載比例分配,也有兩種方式:
- Total Executions:設置運行次數
- Percent Executions:設置運行比例(1~100之間)
示例:
1、設置線程組循環5次:
2、Throughput Controller1的子結點執行3次:
3、Throughput Controller2的子結點執行(40% * 線程組循環次數5)= 2次:
執行結果:
-
隨機控制器(Random Controller):
作用:隨機執行其下的所某個子結點
-
隨機順序控制器(Random Order Controller):
作用:隨機執行其下的所有子結點
-
-
配置元件(Config Element)
- 理解:為測試提供數據支持的控件
-
控件截圖:
-
常用控件:
-
CSV Data Set Config
理解:讀取txt,csv格式的測試數據
使用說明:
-
新建一個txt文件
-
設置CVS 配置參數
-
CSV Data Set Config各個參數的簡要說明:
FileName:csv文件或txt文件路徑,可用相對路徑
File Encoding: 文件編碼格式設置
Varible Names: 定義文本文件中的參數名,可設置多個參數,參數之間逗號分隔.定義后可在腳本中引用,引用方式${name}
Delimiter(use "\t" for tab):指定參數分隔符號
Allow Quoated data: 是否允許引用數據
Recycle on EOF: 是否循環取值
Stop Thread on EOF: 當Recycle on EOF為false並且Stop Thread on EOF為true,則讀完csv文件中的記錄后,停止運行
Sharing Mode: 設置是否線程共享
使用場景:可用於多個jmx模塊情況下讀取服務器配置,或存儲id,賬號等測試數據。
-
-
HTTP Cookie管理器
特性:
1,首先,它像Web瀏覽器一樣存儲和發送Cookie。如果您有HTTP請求並且響應包含cookie,則Cookie管理器會自動存儲該cookie,並將其用於將來對該特定網站的所有請求。每個JMeter線程都有自己的“cookie存儲區”。因此,如果您正在測試使用cookie存儲會話信息的網站,則每個JMeter線程都將擁有自己的會話。請注意,此類Cookie不會顯示在Cookie管理器顯示屏上,但可以使用“ 查看結果樹監聽器” 查看它們。
2, JMeter檢查收到的cookie是否對URL有效。這意味着不存儲跨域cookie。如果您有行為錯誤或希望使用跨域cookie,請定義JMeter屬性“ CookieManager.check.cookies = false ”。
3,到的Cookie可以存儲為JMeter線程變量。要將cookie保存為變量,請定義屬性“ CookieManager.save.cookies = true ”(2.3.2之后的版本默認不支持)。此外,cookie名稱在存儲之前以“ COOKIE_ ” 為前綴(這可以避免意外損壞局部變量)要恢復原始行為,請定義屬性“ CookieManager.name.prefix = ”(一個或多個空格)。如果啟用,名稱為TEST的cookie的值可以稱為$ {COOKIE_TEST}。
4,其次,您可以手動將Cookie添加到Cookie管理器。但是,如果這樣做,cookie將由所有JMeter線程共享。
5,默認情況下,將忽略 具有空值的Cookie 。這可以通過設置JMeter屬性來更改:CookieManager.delete_null_cookies = false。請注意,這也適用於手動定義的cookie - 任何此類cookie將在更新時從顯示中刪除。另請注意,cookie名稱必須是唯一的 - 如果第二個cookie使用相同的名稱定義,則它將替換第一個cookie。
以上需要修改參數的地方,是在JMeter.property的文件中————————————————
原文鏈接:https://blog.csdn.net/baidu_39372836/java/article/details/91442231
實例截圖:
請求結果(忽略error,只是示范~)
使用注意事項:
路徑必須填寫,否則會導致nocookies
路徑和域組成完整的訪問地址,誰訪問誰就用對應的cookie
Cookie不是跨域的
不同的邏輯控制器中要分別放cookie管理器,或放在該cookie邏輯控制器同級,否則會不生效
-
HTTP信息頭管理器
理解:定義信息頭,在其覆蓋下的所有元件都會使用該信息頭。例如定義在測試計划中的信息頭,即該測試計划所有請求的信息頭。
實例截圖:
-
JDBC Connection Configuration
理解:數據庫連接控件,不會進行的具體的數據庫操作。
實例截圖:(圖中參數都是假的)
注意事項:
需要和JDBC Request配合使用
需要安裝jdbc驅動,否則無法連接數據庫
-
用戶定義的變量
理解:用戶自定義的變量,可用於存儲接口路徑等信息
實例截圖:
注意事項:
注意變量的作用域,不同線程間變量不共享
-
-
定時器(Timer)
理解:sampler(采樣器)之前執行;如果只想應用於部分sampler,需要將定時器加入子節點;簡單理解類似於loadrunner中的思考時間,控制sampler的間隔時間。
控件截圖:
常用控件:
-
Constant Throughput Timer
理解:設置目標吞吐量,限定QPS的控件
實例截圖:
配置選項:
Target throughput(in samples per minute):目標吞吐量。注意這里是每分鍾發送的請求數,因此,對應測試需求中所要求的20 QPS ,這里的值應該是1200 。
Calculate Throughput based on :有5個選項,分別是:
This thread only :控制每個線程的吞吐量,選擇這種模式時,總的吞吐量為設置的 target Throughput 乘以矣線程的數量。
All active threads : 設置的target Throughput 將分配在每個活躍線程上,每個活躍線程在上一次運行結束后等待合理的時間后再次運行。活躍線程指同一時刻同時運行的線程。
All active threads in current thread group :設置的target Throughput將分配在當前線程組的每一個活躍線程上,當測試計划中只有一個線程組時,該選項和All active threads選項的效果完全相同。
All active threads (shared ):與All active threads 的選項基本相同,唯一的區別是,每個活躍線程都會在所有活躍線程上一次運行結束后等待合理的時間后再次運行。
All cative threads in current thread group (shared ):與All active threads in current thread group 基本相同,唯一的區別是,每個活躍線程都會在所有活躍線程的上一次運行結束后等待合理的時間后再次運行。
注意事項:
Constant Throughput Timer只有在線程組中的線程產生足夠多的request 的情況下才有意義,因此,即使設置了Constant Throughput Timer的值,也可能由於線程組中的線程數量不夠,或是定時器設置不合理等原因導致總體的QPS不能達到預期目標。
-
固定定時器
理解:請求間隔時間
實例截圖:
注意事項:
需要注意的是,固定定時器的延時不會計入單個sampler的響應時間,但會計入事務控制器的時間。
對於一個sampler來說,定時器相當於loadrunner中的pacing(理解就是一組請求操作的等待時間);對於"事務控制器"來說,定時器相當於loadrunner中的think time(單次操作的等待時間或間隔時間)
-
-
高斯隨機定時器
理解:與固定定時器差不多,只不過時間范圍可以設置一個指定范圍隨機。
實例截圖:
-
Synchronizing Timer
理解:LR中的集合點,也就是說,sampler到這里會暫停,達到指定線程數后並發
實例截圖:
配置參數:
Number of Simulated Users to Group by:線程數量設置
Timeout in milliseconds:響應時間設置,單位毫秒
注意事項:
集合點需要設置在Sampler前,否則不會生效
-
前置處理器(Per Processors)
理解:sampler請求前執行的操作,可以是獲取測試數據,修改參數等
控件截圖:
常用控件:
-
Bean Shell PreProcessor
理解:Bean Shell編程設置
實例截圖:
-
-
-
Simpler Timeout:
理解:設置simple的最大響應時間,與直接在Sampler中設置的區別就是,作用域不同
控件截圖:
-
-
-
Sampler
理解:請求,設置不同的request
控件截圖:
常用控件:
-
HTTP請求
理解:就是一次HTTP請求
實例截圖:
-
Test Action
理解:請求的執行動作,可放在Sampler后定義,即執行某一個請求后暫停等操作
控件截圖:
-
-
后置處理器(Post Processors)
理解:請求執行后的處理,與前置處理器相反
控件截圖:
常用控件:
-
正則表達式提取器
理解:當一個Sampler的Reponse中包含我們需要的參數的時候,我們可以通過該控件將參數提取出來
實例截圖:
參數含義:
引用名稱:將提取的參數轉化為變量,該字段定義變量名稱
正則表達式:匹配的正則,測試可用搜索引擎搜索在線正則驗證測試結果
-
-
斷言(Assertions)
理解:判斷請求響應值的正確性的控件
控件截圖:
常用控件:
-
響應斷言:
理解:判斷Reponse是否正確
實例截圖:
注意事項:
斷言要放在請求內
-
-
監聽器(Listener)
理解:查看請求執行結果的控件
控件截圖:
常用控件:
-
圖形結果
控件截圖:
參數含義:
樣本數目:總共發送到服務器的請求數。
最新樣本:代表時間的數字,是服務器響應最后一個請求的時間。
吞吐量:服務器每分鍾處理的請求數。
平均值:總運行時間除以發送到服務器的請求數。
中間值:代表時間的數字,有一半的服務器響應時間低於該值而另一半高於該值。
偏離:服務器響應時間變化、離散程度測量值的大小,或者,換句話說,就是數據的分布。
注意事項:圖形結果本身會影響Jmeter的性能
-
查看結果樹
應用:可用於調試,查看請求響應的數據,測試的結果,請求的內容。
控件截圖:
參數含義:
取樣器結果實例:
請求實例截圖:
響應數據實例截圖:
-
聚合報告
理解:
控件截圖:
參數含義:
Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這里顯示的就是 Name 屬性的值
#Samples:表示你這次測試中一共發出了多少個請求,如果模擬10個用戶,每個用戶迭代10次,那么這里顯示100
Average:平均響應時間——默認情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間
Median:中位數,也就是 50% 用戶的響應時間
90% Line:90% 用戶的響應時間
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——默認情況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以表示類似 LoadRunner 的 Transaction per Second 數
KB/Sec:每秒從服務器端接收到的數據量,相當於LoadRunner中的Throughput/Sec
-
-
-
Jmeter函數
-
函數助手
打開位置:選項——函數助手
控件截圖:
函數實例:
${__time(YMD)}:當前日期函數
${__time(YMDHMS)}:當前四件函數
${__MD5(${fkeystr_no_register})}:MD5加密函數
更多可查看函數助手的幫助頁面
-
函數調用
選擇想要使用的函數
輸入想要使用函數的值
點擊生成
將所得字符串復制到要使用的位置
-
-
Jmeter屬性與變量
一、Jmeter中的屬性:
1、JMeter屬性統一定義在jmeter.properties文件中,我們可以在該文件中添加自定義的屬性
2、JMeter屬性在測試腳本的任何地方都是可見的(全局),通常被用來定義一些JMeter使用的默認值,可以用於在線程間傳遞信息。
3、JMeter屬性可以在測試計划中通過函數 _P 進行引用,但是不能作為特定線程的變量值。
4、JMeter屬性可以通過_setProperty 函數來定義JMeter屬性
5、JMeter屬性是大小寫敏感的
6、WorkBench中的屬性查看組件:
WorkBench右鍵--->Add--->Non Test Elements--->Property Display
二、Jmeter中的變量:
1、JMeter變量對於測試線程而言是局部變量。
2、在不同測試線程中,JMeter變量既可以是完全相同的,也可以是不同的。
3、JMeter變量引用方法:${name}
4、JMeter變量是大小寫敏感的
5、如果有某個線程更新了變量,那么僅僅是更新了變量在該線程中復制的值
6、Jmeter中定義變量的地方:
a) 測試計划(Test plan),在右邊的面板上添加User Defined Variables
b) 線程組,右鍵選擇 配置元件( config element)-->User Defined Variables
c) 通過前置或后置處理器生成的變量
d)使用csv參數化的變量
注意:通過 a 和 b 兩種方式定義的變量,在JMeter啟動時對這個測試計划都是可見的。如果同一個變量在多個 b 中被定義,那么只有最后一個定義會生效。一旦某個線程啟動后,那么整個變量集合的初始值就會被復制到該線程中。其他測試元件,例如 c 或者 d 可以被用來重新定義變量,這些重定義僅僅影響當前線程
-
Jmeter錄制回放
-
BadBoy錄制回放
-
打開badboy,點擊錄制按鈕
- 輸入網址,在網頁中操作
-
導出腳本(File——Export to Jmeter)
- 用Jmeter打開對應腳本
-
-
-
Jmeter使用(建議&推薦)
-
Jmeter創建接口測試計划實例
測試用例應該作為測試的基礎內容,而用例的結構可能划分,則是用例的基礎(忽然在這里想說一下,用例僅僅是一項測試活動的綱要,有最好,沒有的話能保證質量也OK。更不用說用例的格式問題,無論是表格還是導圖,其實都無所謂!本文的用例是指jmx文件中的控件結構)。
筆者在網上並沒有找到這方面的相關資料,所以沒有准確的定義說筆者的划分是否是正確的或者合適的。筆者會闡明如此划分的理由,但是大家實際使用過程中,僅僅作為拋磚引玉的一個磚頭而已。
- 模塊名稱(測試計划):每個模塊獨立划分為一個jmx文件(例如登陸模塊),最好與接口類一一對應。對應的服務器信息,數據庫信息等可存在這里。
- 數據准備:用於測試數據的准備(例如賬號信息)。
- 結果查看:用於放置需要查看結果的控件(例如結果樹)。
- 線程組:所有的接口測試用例放在線程組下,集中定義線程等信息
- 獲取線程對應測試數據:用於獲取針對獨立線程的測試數據,例如在數據准備里面獲得了賬號信息,在這里根據賬號信息去數據庫獲取對應的名稱,ID等信息。
- 請求名稱:用簡單控制器為文件夾,內有不同的請求。簡單控制器為一個獨立的接口,不同請求對應不同的代碼路徑(例如成功請求,失敗請求等)。建議請求名稱最好用英文形式,否則后期持續集成或許會出現問題(no zuo no die!)。
- 在每條請求內放置正則匹配(用於應對需要返回值作為下次請求的參數的情況)以及斷言
- Fiddler錄制抓取,Jmeter來運行和優化
- 錄制的腳本更完善(可以百度一下 黑夜小怪 的干貨分享,很好用的~)
- 錄制的腳本更完善(可以百度一下 黑夜小怪 的干貨分享,很好用的~)
-
-
Jmeter使用注意事項
-
變量問題
使用過程中,一定要注意控件的執行順序以及變量的作用域。
-
路徑問題
Windows下支持"/""\"並存模式,推薦使用"/",方便跨平台使用。
在linux格式下支持"/"格式。
-
Jmeter自身性能問題
命令行模式:命令相同。
UI模式:操作方式相同,但會存在windows下能打開linux下打不開的情況,暫不知道原因。
-
-
致謝
本文部分內容引用自互聯網上的優秀文章,感謝網絡中願意分享的作者。可能本文中還涉及其他作者的文章未在下邊列出,如果有請聯系我。
-
原文出自:博客(測試散人:http://www.cnblogs.com/ceshisanren/p/5639895.html)