Jmeter使用入門

  • Jmeter簡介
    • Jmeter的基本概念

      百度百科:javascript

      Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟件作壓力測試,它最初被設計用於Web應用測試,但後來擴展到其餘測試領域。 它能夠用於測試靜態和動態資源,例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、數據庫、FTP 服務器, 等等。JMeter 能夠用於對服務器、網絡或對象模擬巨大的負載,來自不一樣壓力類別下測試它們的強度和分析總體性能。另外,JMeter可以對應用程序作功能/迴歸測試,經過建立帶有斷言的腳原本驗證你的程序返回了你指望的結果。爲了最大限度的靈活性,JMeter容許使用正則表達式建立斷言html

       

    • 咱們爲何使用Jmeter
      • 開源免費,基於Java編寫,可集成到其餘系統可拓展各個功能插件
      • 支持接口測試,壓力測試等多種功能,支持錄製回放,入門簡單
      • 相較於本身編寫框架活其餘開源工具,有較爲完善的UI界面,便於接口調試
      • 多平臺支持,可在Linux,Windows,Mac上運行

       

  • Jmeter安裝配置
    • Windows下Jmeter下載安裝
    • 其餘平臺安裝Jmeter
      • 與Windows平臺一致,除入口文件不一樣,例如linux平臺下爲/bin/jmeter.sh
    • Jmeter的目錄結構

      • /bin  目錄(經常使用文件介紹)

        examples:目錄下包含Jmeter使用實例java

        ApacheJMeter.jar:JMeter源碼包mysql

        jmeter.bat:windows下啓動文件linux

        jmeter.sh:Linux下啓動文件git

        jmeter.log:Jmeter運行日誌文件正則表達式

        jmeter.properties:Jmeter配置文件sql

        jmeter-server.bat:windows下啓動負載生成器服務文件數據庫

        jmeter-server:Linux下啓動負載生成器文件apache

      • /docs目錄——Jmeter幫助文檔
      • /extras目錄——提供了對Ant的支持文件,可也用於持續集成
      • /lib目錄——存放Jmeter依賴的jar包,同時安裝插件也放於此目錄
      • /licenses目錄——軟件許可文件,不用管
      • /printable_docs目錄——Jmeter用戶手冊

         

  • Jmeter相關插件安裝:
    • 插件安裝:

      Jmeter的插件安裝很簡單,只須要下載對應插件解壓便可。

      • 下載地址:http://jmeter-plugins.org/downloads/all/
      • 下載後解壓放入:apache-jmeter-2.12\lib\ext\目錄下
      • 重啓jmeter

        ps:數據庫連接驅動若是須要須要專門下載,例如mysql須要jdbc的jar包,地址:http://dev.mysql.com/downloads/file/?id=462850

        使用注意事項:添加第三方插件並使用後保存的jmx文件在未添加該插件的運行環境下會致使沒法打開該文件並報錯,請保持環境一致性。

    • 用例生成與導出:

      Jmeter的用例格式爲jmx文件,實際爲xml格式,感興趣能夠學習下本身定製生成想要的jmx文件。

      • 生成原則:
        • 每一個功能模塊爲一個獨立的jmx文件。增長可維護性。(儘可能不要將一個jmx文件放入太多功能,後期維護成本會很高。)
        • 模塊的私有變量保存在模塊中,多模塊共有的(例如服務器ip端口等)能夠考慮存在單獨的文件中讀取。
        • 接口測試不要放太多線程,畢竟不是作壓力測試,意義也不大。
      • 導出方法:
        • 編寫測試用例
        • 文件——保存爲——肯定:

       

  • 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等)。

      函數測試模式會記錄來每一個請求到服務器的取樣結果,若是在監聽器中定義了數據寫入文件,會將這些輸入寫入到該文件中。同時,該模式會嚴重影響性能。

    • 工做臺

      控件截圖:

      理解:控件的暫存區域,在測試過程當中能夠把暫時不用的控件放入其中,待測試完成後放回原來的位置。

      注意事項:工做臺中的控件不會保存在jmx文件中,因此,若是關閉jmeter,工做臺中的控件會丟失。

      經常使用控件:

      • Property Display
        • 建立方式:右鍵點擊工做臺,添加——非測試元件——Property Display
        • 截圖:

        • 功能:查看當前測試計劃中的屬性以及系統中的屬性
    • 線程組(  Threads (Users)

      理解:一個虛擬用戶組,線程組內線程數量在運行過程當中不會發生改變。

      注意事項:線程間變量相互獨立。一個測試計劃內能夠包含多個線程組。

      可定義內容:

      取樣器錯誤後執行的操做:繼續執行,啓動下一個線程,中止線程,中止測試,馬上中止

      線程屬性:線程數量,線程啓動間隔時間(0爲馬上啓動全部線程),單線程循環次數,線程執行順序,是否使用調度器。

      調度器配置:持續時間,啓動延遲,啓動時間,結束時間

      • 線程組(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次),也可使用變量

          一、Forever選項:勾選上這一項表示一直循環下去

          二、若是同時設置了線程組的循環次數和循環控制器的循環次數,那循環控制器的子節點運行的次數爲兩個數值相乘的結果。

             

        • 僅一次控制器(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次,每次執行時會把獲取到的變量值賦值給輸出變量outNmae,其它地方能夠經過${outNmae}進行調用。

             

        • 事務控制器(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?:選中這一項時表示:判斷變量值是否等於字符串true(不區分大小寫)
          • Evaluate for all children:若是選中這一項,在每一個子結點執行前都會計算表達式 

          示例一:使用變量的方式進行判斷:

          示例二:選中Interpret Condition as Variable Expression?

             

             

             

        • Switch控制器(Switch Controller):

          做用:Switch控制器經過給該控制器中的Value賦值,來指定運行哪一個採樣器。有兩種賦值方式:

          • 第一種是數值,Switch控制器下的子節點從0開始計數,經過指定子節點所在的數值來肯定執行哪一個元素。
          • 第二種是直接指定子元素的名稱,好比採樣器的Name來進行匹配。當指定的名稱不存在時,不執行任何元素。

          當Value爲空時,默認執行第1個子節點元素。 

          示例:

          一、Switch Controller選擇的值爲login page

          二、執行結果:

             

        • 吞吐量控制器(Throughput Controller):

             做用:控制其下的子節點的執行次數與負載比例分配,也有兩種方式:

          • Total Executions:設置運行次數
          • Percent Executions:設置運行比例(1~100之間)

             

          示例:

          一、設置線程組循環5次:

          二、Throughput Controller1的子結點執行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,象瀏覽器同樣的存儲和發送Cookie。若是你請求一個站點,而後他的Response中包含Cookie,Cookie Manager就會自動地保存這些Cookie並在全部後來發送到該站點的請求中使用這些Cookie的值。(在View Results Tree的Request界面能夠看到被髮送的Cookie Data, 同時每一個線程的Cookie Manager是相互獨立的)

          接受到的Cookie的值能被存儲到JMeter 線程變量中(2.3.2版本後的JMeter不自動作這個事情)。要把Cookies保存到線程變量中,要定義屬性"CookieManager.save.cookies=true"。

          線程變量名爲COOKIE_ + Cookie名。屬性CookieManager.name.prefix= 能夠用來修改默認的COOKIE_的值。

          2,手動添加Cookie到Cookie Manager,需求注意的是這些Cookie的值被會全部線程共享

          定義:屬性"CookieManager.save.cookies=true"

          在jmeter.properties文件中增長CookieManager.save.cookies=true,而後在Debug Sampler中就能看到COOKIE_xxx這樣的變量,或者也可使用正則表達式來提取Cookie的值

          實例截圖:

          使用注意事項:

          路徑必須填寫,不然會致使nocookie

          路徑和域組成完整的訪問地址,誰訪問誰就用對應的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屬性與變量

    1、Jmeter中的屬性:

    一、JMeter屬性統必定義在jmeter.properties文件中,咱們能夠在該文件中添加自定義的屬性

    二、JMeter屬性在測試腳本的任何地方都是可見的(全局),一般被用來定義一些JMeter使用的默認值,能夠用於在線程間傳遞信息。

    三、JMeter屬性能夠在測試計劃中經過函數 _P 進行引用,可是不能做爲特定線程的變量值。

    四、JMeter屬性能夠經過_setProperty 函數來定義JMeter屬性

    五、JMeter屬性是大小寫敏感的

    六、WorkBench中的屬性查看組件:

    WorkBench右鍵--->Add--->Non Test Elements--->Property Display

       

    2、Jmeter中的變量:

    一、JMeter變量對於測試線程而言是局部變量。

    二、在不一樣測試線程中,JMeter變量既能夠是徹底相同的,也能夠是不一樣的。

    三、JMeter變量引用方法:${name} 

    四、JMeter變量是大小寫敏感的

    五、若是有某個線程更新了變量,那麼僅僅是更新了變量在該線程中複製的值

    六、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!)。
      • 在每條請求內放置正則匹配(用於應對須要返回值做爲下次請求的參數的狀況)以及斷言。

       

  • Jmeter使用注意事項
    • 變量問題

      使用過程當中,必定要注意控件的執行順序以及變量的做用域。

    • 路徑問題

      Windows下支持"/""\"並存模式,推薦使用"/",方便跨平臺使用。

      在linux格式下支持"/"格式。

    • Jmeter自身性能問題

      命令行模式:命令相同。

      UI模式:操做方式相同,但會存在windows下能打開linux下打不開的狀況,暫不知道緣由。

    • 來源:http://www.cnblogs.com/ceshisanren/p/5639895.html
相關文章
相關標籤/搜索