JMeter基礎學習

2020-08-11 23:51:37

JMeter是什麼

JMeter也稱爲「Apache JMeter」,它是一個開源的,100%基於Java的應用程式,帶有圖形介面。 它旨在分析和衡量Web應用程式和各種服務的效能和負載功能行爲。

JMeter主要用於測試Web應用程式或FTP應用程式,它適用於功能測試,JDBC數據庫連線,Web服務,通用TCP連線和OS本機進程。 可以執行各種測試活動,如效能,負載,壓力,迴歸和功能測試等。

JMeter有哪些特性

  • 開源
  • 友好的GUI
  • 支援各種測試方法:JMeter支援各種測試方法,如負載測試,分佈式測試和功能測試等。
    Web: HTTP, HTTPS, SOAP
    數據庫: JDBC, LDAP, JMS
    Mail: POP3
  • 支援多協定:JMeter支援HTTP,JDBC,LDAP,SOAP,JMS和FTP等協定。
  • 模擬:JMeter可以使用虛擬使用者或唯一使用者模擬多個使用者,以便對正在測試的Web應用程式產生大量負載。
  • 框架:JMeter是一個多執行緒框架,允許許多或單獨的執行緒組同時和同時採樣不同的函數。
  • 遠端分佈式測試:JMeter具有用於分佈式測試的主從概念,其中主伺服器將在所有從伺服器之間分配測試,而從伺服器將針對伺服器執行指令碼。
  • 測試結果視覺化:測試結果可以以不同的格式檢視,如圖形,表格,樹型和報告等。

JMeter的工作原理

JMeter以建立多個執行緒的方式來模擬多個使用者執行操作,一個執行緒代表一個虛擬使用者。當JMeter執行測試時,測試計劃會發送到負載機,並向負載機發送命令以CLI方式執行測試,產生多個執行緒向被測系統發送請求,生成負載。
在这里插入图片描述

JMeter安裝目錄相關檔案

bin目錄

  • jmeter.bat ——windows的啓動檔案
  • jmeter.log——jmeter的執行日誌檔案
  • jmeter.sh——linux的啓動檔案
  • jmeter.properties——系統組態檔
  • jmeter-server.bat——windows 分佈式測試用例要用到的伺服器設定
  • jmeter-server——linux 分佈式測試要用到的伺服器設定

lib目錄

  • lib——存放所有外掛jar包
  • lib\ext——存放JMeter依賴的核心jar包
  • lib\junit——存放Junit測試指令碼

licenses目錄

  • JMeter 相關證書

printable_docs目錄

  • JMeter 使用者手冊文件,其中usermanual下的component_reference.html是最常用到的核心元件幫助文件。

構建入門指令碼

測試計劃由測試元素組成,例如執行緒組,邏輯控制器,樣本生成控制器,監聽器,定時器,斷言和設定元素。

  • 建立測試計劃:JMeter預設生成了測試計劃
  • 新增執行緒組:滑鼠選中測試計劃-滑鼠右鍵-新增-執行緒-執行緒組
    • Number of Thread(user): 設定執行緒數,可以在測試計劃的使用者自定義變數中設定變數,在這裏參照測試計劃的變數 ${uesr}
    • ramp-up period:設定啓動所有執行緒需要的時間
    • same user on each iteration:每次迭代使用相同的執行緒
  • 新增HTTP請求:滑鼠選中執行緒組-新增取樣器-HTTP請求
  • 設定HTTP請求:滑鼠選中執行緒組-修改請求名稱、新增協定、輸入伺服器名稱或IP、埠號、新增請求方式、新增路徑
  • 新增察看結果樹:滑鼠選中執行緒組-新增監聽器-察看結果樹
  • 執行測試計劃

JMeter測試計劃四要素

  • 測試計劃
  • 測試計劃中只有有一個執行緒組
  • 執行緒組中至少有一個取樣器
  • 測試計劃中必須有監聽器

介面三要素

  • 請求地址/請求方式
  • 參數
  • 返回值

錄製指令碼

使用badboy錄製web端指令碼

  • 下載安裝badboy
  • 輸入網址回車(預設是錄製狀態)
  • 開始操作web網頁
  • 操作完成後點選停止錄製
  • 導出爲jmeter指令碼:file->export to jmeter
  • 在jmeter中開啓指令碼檔案.jmx
  • 在jmeter中新增一個監聽器後執行指令碼

使用jmeter自身代理錄製行動端指令碼

  • 在測試計劃右鍵->非測試元件->新增HTTP代理伺服器
  • 設定HTTP的代理伺服器:
    預設埠8888、HTTPS Domains代理伺服器IP(電腦本機IP或localhost)、目標控制器選擇測試計劃/執行緒組
  • 點選HTTP代理伺服器內的啓動按鈕(證書彈窗點選確定)
  • 設定行動端:修改網路設定代理
  • 開啓app錄製指令碼
  • 在jmeter中新增一個監聽器後執行指令碼

修改JMeter預設語言

在bin\jmeter.properties檔案中修改language=zh_CN(由於當前行被註釋掉了,需要另起一行或者去掉#),儲存後需要重新啓動JMeter生效
錄製指令碼中存在中文亂碼的話,需要修改jmeter原始碼來處理,對jar包進行反編譯較麻煩

HTTP取樣器

HTTP管理器

  • 位置:設定元件
  • HTTP資訊頭管理-HTTP請求頭:
    主要是使用Content-Type,請求參數的數據型別
  • POST請求需要新增HTTP請求頭,Content-Type值爲application/json
  • POST請求返回值中包含中文時,察看結果樹中顯示會亂碼,需要在POST請求中將內容編碼設定爲utf-8

HTTP請求設定
http協定預設80、https協定預設443

  • 協定名稱:http或https
  • 伺服器名稱或IP 介面的域名
  • 有埠號就填寫對應值,沒有就不填
  • 方法:http請求方式,如GET、POST
  • 路徑:介面地址
  • 內容編碼:utf-8
  • 參數(鍵值對)/訊息體數據(文字:json/text…)/檔案上傳

HTTP請求預設值

  • 將同一執行緒組下所有HTTP請求協定和伺服器地址統一管理
  • 如果HTTP請求中填寫了自己的請求協定和伺服器地址,則使用本身設定的

JMeter應用變數方法

參照變數:${變數名}

CSV數據控制元件實現參數化

  • 建立測試計劃
  • 建立執行緒組
  • 線上程組新增設定元件->CSV數據檔案設定
  • 準備csv數據:
    建立一個excel表格,填寫數據,另存爲csv檔案(若有中文則用notepad++開啓檔案將檔案編碼改爲utf-8)
  • 選中jmeter中的設定元件-CSV數據檔案設定:
    • 檔案:瀏覽,將剛剛數據檔案上傳過來
    • 檔案編碼:utf-8
    • 變數名稱:填寫數據表中的列名或者另取名稱,jmeter中填的變數名是這個值(若有多列可用逗號隔開)
    • 忽略首行:True
      (若數據檔案中首行是標題,則選擇True,若沒有標題都是數據,則選擇False)
    • 分隔符:,
    • 其他設定項預設不修改
  • 在取樣器HTTP請求中將數據的值改爲:"${變數名}"(需要帶上雙引號)
  • 如果使用csv中的所有數據,則需要設定執行緒組的執行緒數或者回圈次數
  • 若暫時不想使用該csv數據檔案,可以在jmeter中選中這個設定元件右鍵,設定爲禁用,預設是啓用
  • 隨機取參:我們只需將參數化數據在csv中橫向排列,然後用隨機函數__Random()指定檔案序列號即可。${__CSVRead(D:\t.txt,${__Random(1,6,)})}

使用者參數

  • 位置:前置處理器->使用者參數
  • 使用方式:針對哪個請求就在哪個請求下新增
  • 設定:新增變數、新增使用者(一個使用者就是一組數據)
  • 使用:在請求中參照變數、線上程組中設定執行緒數(值和使用者數一致)

使用者定義的變數

  • 位置:測試計劃頁面、設定元件中->使用者定義的變數
  • 設定:新增變數(鍵-值)
  • 使用:凡是可以輸入的位置都可以參照變數

總結jmeter參數化的區別

  • CSV數據參數化,在設定元件中,適用於大量測試數據
  • 使用者參數,在前置處理器中,適用於少量測試數據
  • 使用者定義的變數,在測試計劃頁面和設定元件中,適用於常數的設定,包括:數據庫地址、測試環境地址、登錄數據等

連線數據庫–mysql爲例

  • 在測試計劃中匯入數據庫驅動Jar包
  • 線上程組中新增JDBC Connection Configration
  • 設定JDBC Connection Configration:
    • 在variable Name for create pool中填寫數據庫名稱
    • 在Database Connection Configration中填寫數據:
      • 數據庫URL:jdbc:mysql://伺服器地址:數據庫埠號(預設3306)/數據庫名稱(真實存在的數據庫名稱)
      • 驅動:com.mysql.jdbc_Driver
      • 數據庫帳號
      • 數據庫密碼
  • 線上程組新增JDBC request:
    • 在Variable Name Bound of Pool中填寫數據庫名稱(唯一,與JDBC Connection Configration中填寫的要一致)
    • 在Query中填寫sql語句
      變數參照:"${變數名}"(需要帶上雙引號)
      可以儲存查詢結果,填寫變數名稱

關聯

從上一條請求中獲取數據,在下一個請求中使用該數據

xpath關聯

使用場景:介面返回值爲html或xml格式時,使用xpath提取器

  • 在需要獲取數據的請求下新增後置處理器->xpath提取器
  • 設定xpath提取器:
    • 勾選Use Tidy(Tolerant parser)
    • 參照變數名稱:變數名
    • xpath query:xpath表達式,//標籤名
      (可以用表達式在結果樹中用xpath Tester測試一下)
    • 匹配數位:
      0表示在匹配結果中隨機取值、-1表示獲取匹配結果的所有值,其他值表示獲取匹配結果中對應位置的值
    • 預設值:遇到錯誤時的提示內容
  • 在要使用該變數的請求中參照變數

JSON關聯

使用場景:介面返回值爲json格式時使用

  • 在要獲取請求數據的請求下新增後置處理器->JSON提取器
  • 設定JSON提取器:
    • 參照變數名稱:變數名
    • json path expressions:json表達式,$..key
    • 匹配數位
    • 預設值
  • 新增取樣器->Debug Sampler(報錯資訊、取值資訊會顯示出來)
  • 在要使用該變數的請求中參照變數

正則表達式關聯

使用場景:適用於任何返回格式的介面

  • 在要獲取請求數據的請求下新增後置處理器->正則表達式提取器
  • 設定正則表達式提取器:
    • 參照變數名稱:變數名
    • 正則表達式
    • 模板:$數位$,數位表示取匹配值中的第幾組
    • 匹配數位
    • 預設值
  • 在要使用該變數的請求中參照變數

斷言

斷言就是讓程式代替人工去判斷介面響應數據是否達到預期

響應斷言

  • 在對應請求新增斷言->響應斷言
  • 斷言狀態碼:
    • 測試欄位:響應程式碼
    • 匹配規則:Substring(預設)
    • 響應模式:200
  • 斷言文字值:
    • 新增後置處理器->bean shell postprocessor,將返回值中的中文解碼
    • 測試欄位:響應文字
    • 測試模式:填寫要斷言的欄位和值

JSON斷言

  • 作用範圍:返回值格式爲JSON的請求
  • 在對應請求新增斷言->JSON斷言
  • JSON斷言設定:
    • Assert JSON Path exists:斷言的JSON表達式,$…key
    • Excepted Value:預期的值,參照變數${key}

長度斷言

  • 在對於請求新增斷言->大小斷言
  • 設定位元組大小:斷言返回值所佔位元組數

持續時間斷言

  • 在對於請求新增斷言->斷言持續時間
  • 設定持續時間ms:斷言介面響應時間

集合點–併發

  • 在對於請求新增集合點Snychronyzing Timer->集合點

  • 新增聚合報告

  • 設定集合點:

    • 每次集合的使用者數
    • 集合使用者數所用時間ms:
      時間設定爲0表示無限等待,直到執行緒數量等於集合數量
    • 設定時長表示在規定時間內啓動所有集合,不管有沒有集合到預期數量
  • 注意事項:

    • 集合數最好能被執行緒數整除
    • 集合時間最好是大於等於執行緒組的一個啓動時間

函數

使用步驟

  • 在大圖示選單欄點選函數助手對話方塊
  • 選擇需要使用的函數
  • 設定函數相關參數
  • 點選生成
  • 複製生成的函數位符串
  • 貼上到需要使用的位置

計數函數
__conuter計數

跨執行緒組關聯

  • 作用:實現多個執行緒組間的數據傳遞
  • 操作步驟:
    • 線上程組1中將原來的參數提升作用域:使用函數__setProperty
    • 設定__setProperty函數:
      • 屬性名稱:提升作用域之後的名稱pname1
      • value of Property:需要提升作用域的變數值key,寫入:${key}
    • 線上程組1中新增新的取樣器Bean shell取樣器
    • 將設定好的__setProperty函數複製貼上到Bean shell取樣器中
    • 設定__property函數:
      • 屬性名稱:新的變數名稱,提升作用域後的變數名稱pname1
      • 將設定好的__property函數複製貼上到執行緒組2中
    • 設定執行緒組請求的先後順序:
      線上程組2中勾選排程器,設定持續時間和啓動時間

分佈式

由多臺電腦共同完成同一個任務(請求)的部署,這種部署叫分佈式部署

步驟

執行機Slave:(就是肉雞)

  • 獲取本機IP,將IP寫在組態檔jmeter.properties中,remote_hosts=ip:1099
  • 執行機需要關閉防火牆和其他網絡卡
  • 執行機開啓jmeter-server.bat

控制機Master:

  • 將執行機的IP寫入到組態檔中remote_hosts=ip:1099,如果有多個用英文逗號隔開
  • 如果控制機需要執行指令碼那麼需要開啓jmeter-server.bat
  • 執行指令碼:執行->遠端啓動,選單中包含剛剛在組態檔中設定的remote_hosts

注意事項:

  1. Master與各Slave使用的Java版本保持一致;
  2. Master與各Slave使用的JMeter版本保持一致;
  3. 若測試計劃中參照了某外掛,則Master與各Slave與要包含該外掛;
  4. 測試計劃只需要放在Master上,執行時會自動分發到各Slave,不需要每台Slave複製一份;
  5. 若測試計劃中參照到了參數化檔案,需要將參數化檔案複製到各台Slave上,並且存放的目錄路徑需要保持一致;
  6. 分佈式執行的執行緒數=假定單機部署執行的執行緒數Slave數。
    比如:單機部署時執行50個執行緒,先以分佈式執行,有4台Slave,則總共執行的執行緒數爲:50
    4=200。
  7. Master與各Slave要在同一網段下

非GUI模式執行

CLI命令列模式,執行命令:jmeter -n -t 測試指令碼路徑.jmx -l 報告路徑 -e -o tableresult

  • 執行命令列時,要在jmeter的bin目錄下執行
  • 在命令列模式下執行jmeter指令碼,預設是在jmeter/bin目錄下查詢測試指令碼,將執行結果和測試報告存放在bin目錄下
  • 如果想執行其他目錄的指令碼,或將報告存放在其他路徑下,需要指定絕對路徑

常用邏輯控制器

IF控制器

  • 位置:執行緒組->新增->邏輯控制器->IF控制器
  • 設定IF控制器:
    • 不勾選任何選項的使用方法:

      • 字串比較:參數和值都需要加雙引號,例如:"${key}"="中文值"
      • 數位比較:例如:${key}=數位
      • 布爾值比較:${key},參數值必須小寫,true/false
    • 勾選將條件解釋爲變數表達式的使用方法:

      • 藉助函數_jexl3或_groovy直接輸出的是true或false
    • 全部勾選:

      • 藉助函數$JMeterThread.last_sample_ok}
        返回的是上一個取樣器的執行結果,執行通過返回true那麼下一個取樣器纔可以正常執行;反之,下一個取樣器就不執行

foreach控制器

  • 位置:執行緒組->新增->邏輯控制器->foreach控制器
  • foreach控制器要和使用者定義的變數配合使用
  • 線上程組下新增設定元件->使用者定義的變數
    • 變數名:字首_數位,如:name_1
    • 要求後綴數位一定是連續的
  • 在foreach控制器內部新增取樣器(不是平級,取樣器屬於foreach控制器層內)
  • 設定foreach控制器:
    • 輸入變數名字首,如:name
    • 開始回圈欄位(不包含)
    • 結束回圈欄位(含)
    • 輸出變數名稱:在使用者定義的變數通過foreach控制器後生成的新名稱,如new_name
  • 在取樣器內參照變數,使用foreach控制器輸出的新名稱new_name

回圈控制器

回圈控制器只控制內部的取樣器,在控制器外部的取樣器只由執行緒組的回圈次數控制

  • 如:執行緒組回圈次數5次,回圈控制器3次;
    控制器內部取樣器執行5*3次,控制器外部取樣器執行5次;

元件元件總結

元件的作用範圍

具有層次結構的元素的作用域規則如下:

(1)若其父節點爲取樣器,則其只對該取樣器起作用;
(2)若其父節點爲邏輯控制器,則會影響邏輯控制器下的所有取樣器;
(3)若其父節點爲執行緒組,則會影響執行緒組下的所有取樣器;
(4)若其父節點爲測試計劃,則會影響測試計劃下的所有取樣器。

元件的執行順序

在同一作用域範圍內,測試計劃的元件按以下順序執行:

  • 設定元件
  • 前置處理器
  • 定時器
  • 取樣器
  • 後置處理器
  • 斷言
  • 監聽器

備註:元件不會因爲在指令碼中的放置順序而改變其執行順序,如果在一個指令碼中有多個同類型的元件,他們的執行順序是按照在指令碼中的排序執行的。

Cookie管理器

新增設定元件-Cookie管理器,增加session鍵值,模擬已登錄狀態
在这里插入图片描述

效能測試

效能測試指通過自動化測試工具模擬多種正常、峯值以及異常負載條件來對系統各項指標進行測試。屬於軟體的非功能測試,在功能測試之後執行。

  • 負載
    模擬業務操作對伺服器造成壓力的過程,如100個使用者發帖
  • 基準測試
    在給系統施加較低壓力時,檢視系統的執行狀況並記錄相關數據作爲基礎參考
  • 負載測試load test
    指對系統不斷地增加壓力或者增加一定壓力的情況下持續一段時間,知道系統的某項或多項效能指標達到安全臨界值,例如某種資源已經達到飽和狀態。
  • 壓力測試stress test
    壓力測試是評估系統處於或超過預期負載時系統的執行情況,關注點在於系統在峯值負載或超出最大負荷情況下的處理能力,即響應時間可以慢一點但不能出現錯誤。
  • 穩定性測試
    在給系統增加一定壓力的情況下,執行一段時間(如7*24),看系統是否能穩定執行。
  • 併發測試
    測試多個使用者同時存取一個應用、同一個模組或數據記錄時是否存在死鎖或其他效能問題

效能測試指標

系統指標

  • 響應時間
  • 吞吐量:
    • QPS(query per second)
    • TPS(transaction per second)

資源指標

  • 資源利用率
    • CPU
    • 記憶體
    • 硬碟
    • 網路

參考文件: