NO IMAGE

寫在前面

本文主要是自己學習Jmeter工具的一個大綱,參考整理了很多網上的知識以及《Jmeter實戰》這本書,部分資訊未驗證,也有些資訊為自己理解,如有錯誤,請指正,共同提升,相關的工具、檔案指令碼會打包,方便大家下載。

一JMeter 介紹和安裝

Jmeter是一款應用很廣的開源效能測試工具,用來模擬虛擬使用者完成效能測試工作,可以對Web應用進行測試同時提供了Web的錄製功能,另外支援了多種請求,另外也支援Socket協議的測試。

安裝:

安裝配置JDK1.8,配置JDk執行環境

安裝Jmeter4.0,配置Jmeter執行環境

Badboy2.2.5

JMeter基本原理是建立一個執行緒池,多執行緒執行取樣器產生大量負載,在執行過程中通過斷言來驗證結果的正確性,通過臨聽器來記錄測試結果。如果取樣器中有引數化的需求,可以通過配置元件或者前置處理器來完成。如果有關聯需求,可以通過後置處理器來完成。如果我們想要設定執行場景,比如模擬多少使用者,執行多長時間,就設定執行緒組。如果我們想要模擬併發場景,可以利用定時器來設定; 如果我們想要控制業務的執行邏輯,比如登入只執行一次,我們可以用控制器來完成。

二、Jmeter初步認識

JMeter工具和其他效能工具在原理上完全一致,工具包含四個部分:

1)負載發生器(傳送請求):用於產生負載,通常以多執行緒或是多程序的方式模擬使用者行為。(取樣器)

2)使用者執行器(請求規則):通常是一個指令碼執行引擎 ,使用者執行器附加線上程或程序上,根據指令碼要求模擬指定的使用者行為。(使用者組)

3)資源生成器(資源資料):用於生成測試過程中伺服器、負載機的資源資料。

4)報表生成器(資料包表):根據測試中獲得的資料生成報表,提供視覺化的資料顯示方式。

2.1主要結構介紹

取樣器

取樣器Sampler(傳送請求):效能測試中向伺服器傳送請求,記錄響應資訊,記錄響應時間的最小單元,模擬使用者的操作,向伺服器傳送的請求,提供的23個取樣器原件支援絕大多數的請求

斷言

驗證結果是否正確,相當與loadrunner的檢查點,用來驗證返回結果是否正確,斷言原件有13個

監聽器

監聽器Listener用來對測試結果資料進行處理和視覺化展示的一系列元件。對測試結果的收集,有兩個作用,一個是對結果的監聽,另外一個是展示結果,如在除錯等過程

前置處理器

前置處理器Pre Processors用於在實際的請求發出之前對即將發出的請求進行特殊處理。例如,HTTP URL重寫修復符 ,可以實現URL重寫,當URL中含有sessionID一類的session資訊時,可以通過該處理器填充發出請求的實際的sessionID。

處理在請求之前的一些設定,比如連線資料庫時的配置,在前置處理器完成

配置原件

兩個作用,比如在引數化中,可能需要很多的測試資料,使用配置原件從檔案中讀取測試資料或者提供的函式生成動態資料,另外配置元件還能記錄伺服器的的返回資料,比如Http Catch Manager自動記錄伺服器返回的Catch資料,為取樣器提供預備資料,提供給取樣器下次請求使用

後置處理器

後置處理器放在取樣器之後,對響應資料處理的原件,比如說關聯就是通過該原件處理的

控制器

也叫邏輯控制器,控制執行的次數,執行的邏輯,多個控制器的組合可以完成大多數的業務需求

邏輯控制器Logic controller:有兩類

(1)用於控制Sampler節點傳送請求的邏輯順序,常用:如果(If)控制器、switch Controller、Runtime Controller、迴圈控制器等 

(2)用來組織可控制Sampler節點的,如事務控制器Transaction Controller、吞吐量控制器

 

定時器

定時器比如設定集合點等資訊,不僅僅這一個功能,定時器種類很多,可以滿足各種時間的需求

執行緒組

 比如設定併發的虛擬使用者數,還可以設定執行時長以及定時執行。

Test Fregment

         兩個作用:一個是用來備份原件

         另外一作用就是TestFregment下的元件可以被邏輯控制器呼叫,相當於是開發中把某一業務封裝在某一個模組裡,然後在其他的位置呼叫。

工作臺

         工作臺

         可以用來用來設定代理伺服器,錄製指令碼

         設定伺服器監控(不建議,會對jemeter造成壓力)

         指令碼備份和顯示jmeter資訊。

2.2學習環境搭建

1、安裝tomcat,網上找資料

2、安裝資料庫

3、新建對應名稱的資料庫

4、將下載的包解壓放到tomcat的webapps目錄下

5、啟動tomcat並訪問,按照操作安裝

遇到問題:

1、  安裝時需要在資料庫中新建一個資料庫jforum;

2、  訪問地址一定要和資料夾的路徑一致

3、  安裝配置完成後會出現找不到發帖按鈕,解決方式將在“jforum\templates\default\images”路徑下,有一個資料夾,名字是“en_US”,將這個資料夾複製貼上一份,將其命名為“zh_CN”,一定要注意資料夾名字必須寫正確

環境的搭建參照部落格:https://www.cnblogs.com/honeyhome/p/7279585.html

2.3、使用Bodboy除錯錄製指令碼並除錯

第一步:點選登入路進入到登入頁面,並登入

第二步:選擇一個板塊進入

第三部:單擊發帖按鈕,併發帖,發帖成功停止錄製,並匯出jmeter檔案

錄製過程參考《全棧效能測試參考寶典》

1、亂碼解決

替換jar包裡的檔案,參考https://blog.csdn.net/u012167045/article/details/70868306,需要的jar包已經提供。

2、請求後無法將提交請求的list轉換為字串格式

使用fiddler抓包,重新編輯請求引數

3、關聯時關聯無效

重定向的問題,修改自動重定向或者跟蹤衝定向除錯

4、使用txt檔案做為引數資料來源時,讀入資料異常

使用txt檔案作為引數化的資料來源時,檔案的開頭會有不可見的編碼,建議使用notepad 編輯文件後重新儲存

自動重定向只能重定向get和head請求,但是Jmeter不記錄重定向過程,無法進行關聯

跟隨重定向是可以記錄所有的資料,可以重定向

https請求安全,但是效率相對http低一些

Use concurrent pool 併發檢索資源,設定併發大小

2.4 基礎入門操作

新增測試計劃

測試計劃的理解相對簡單些,相當於一專案建一個測試計劃,所有的控制元件都放到測試計劃中。

在測試計劃中科設定選項:

測試計劃上可以新增使用者定義的變數。一般新增一些系統常用的配置。如果測試過程中想切換環境,切換配置,一般不建議在測試計劃上新增變數,因為不方便啟用和禁用,一般是直接新增使用者自定義變數元件獨立執行每個執行緒組:當一個測試計劃中存在多個測試計劃時是多個執行緒組同時執行的,當勾選了該選項就會一個執行緒組執行之後再執行另一個執行緒組

run teardown thread groups after shutdownof main thread:

如果沒有勾選該選項,正常情況下,如果執行緒組執行失敗,元件中包含teardown執行緒組,就不會執行了,而如果選擇該元件還會繼續執行該元件。有關teardown後續說明。

如果選中了此選項,監聽元件如“檢視結果樹”配置了儲存到一個檔案中,那麼jmeter會將每次的請求結果伺服器返回資訊都儲存到檔案中,比較影響效能,不建議勾選

設定執行緒組

執行緒組可以設定啟動多少個虛擬使用者,並設定在多少時間啟動並設定迴圈次數以及持續執行時間的一個控制元件

在新增執行緒組時可以新增三個不同的執行緒組,只是執行順序的設定不同,其他功能是一樣的。1)setup thread group:預測試(初始化)操作,在另外兩個執行緒組執行之前執行的執行緒組;2)teardown thread group:在另外兩個執行緒組執行之後執行的執行緒組;

3)thread group:虛擬使用者組。執行緒組中的每個執行緒模擬成每個虛擬使用者。

在設定執行緒組中:

 

在取樣器發生錯誤時的執行:

         繼續:當取樣器發生錯誤時,繼續執行

         StartNext ThreadLoop:設定了多次迴圈或者多個虛擬使用者,不在向下執行取樣器,跳出當前迴圈

         停止執行緒:停止當前執行緒組的執行

         停止測試:停止測試

         StoptTest Now:停止整個測試?還不確定,後續驗證

執行緒數:一個執行緒數就是一個虛擬使用者,即我們的壓力測試使用者數

Ramp-Up Period(in seconds): 設定執行緒啟動的時間間隔,如果執行緒數設定為10,這裡設定為5秒,那麼就是1秒啟動2個執行緒。這裡設定就是所有的執行緒在多少時間內全部啟動完成,如果在短時間內啟動過多數量時也會造成壓力,建議合理時間內啟動對應使用者。

迴圈次數:迴圈執行的次數

delay thread creation until needed: 與Ramp-UpPeriod配合起來使用,正好解決上面的在短時間內啟動較多使用者數,伺服器過載的問題,類似於loadrunner的思考時時間。如上面的啟動執行緒的例子,如果勾選此項,那麼每次啟動兩個執行緒執行後啟動另外2個執行緒,而如果沒有勾選,按照Ramp-Up Period(in seconds)的方式全部啟動10個執行緒,然後逐次2個的執行開始

排程器:

持續時間:測試計劃執行執行多長時間,這個選項需要與迴圈次數配合起來使用,如果迴圈次數設定為永遠,這裡的持續時間設定為300秒,那麼在5分鐘後執行緒就停止執行

啟動延遲:這裡的設定主要是為了延遲執行執行緒的時間,比如設定為10秒,點選執行按鈕後,只執行初始化配置的資訊,10秒後在執行執行緒。

新增取樣器

1協議:向目標伺服器傳送http請求時的協議,http/https,大小寫不敏感,預設http

2方法:傳送http請求的方法(連結:http://www.cnblogs.com/imyalost/p/5630940.html)

3 Content encoding:內容的編碼方式(Content-Type=application/json;charset=utf-8)

4路徑:目標的URL路徑(不包括伺服器地址和埠)

5自動重定向:如果選中該項,發出的http請求得到響應是301/302,jmeter會重定向到新的介面

6 Use keep Alive:jmeter 和目標伺服器之間使用Keep-Alive方式進行HTTP通訊(預設選中)

7 Use multipart/from-data for HTTP POST :當傳送HTTP POST 請求時,使用

8 Parameters、Body Data以及FilesUpload的區別:

   1. parameter是指函式定義中引數,而argument指的是函式呼叫時的實際引數

   2. 簡略描述為:parameter=形參(formal parameter), argument=實參(actual parameter)

  3.在不很嚴格的情況下,現在二者可以混用,一般用argument,而parameter則比較少用

   While defining method,variables passed in the method are called parameters.

   當定義方法時,傳遞到方法中的變數稱為引數.

   While using those methods,values passed to those variables are called arguments.

   當呼叫方法時,傳給變數的值稱為引數.(有時argument被翻譯為“引數“)

   4、BodyData指的是實體資料,就是請求報文裡面主體實體的內容,一般我們向伺服器傳送請求,攜帶的實體主體引數,可以寫入這裡

   5、FilesUpload指的是:從HTML檔案獲取所有有內含的資源:被選中時,發出HTTP請求並獲得響應的HTML檔案內容後還對該HTML

      進行Parse 並獲取HTML中包含的所有資源(圖片、flash等):(預設不選中)

      如果使用者只希望獲取特定資源,可以在下方的Embedded URLs must match 文字框中填入需要下載的特定資源表示式,只有能匹配指定正規表示式的URL指向資源會被下載

配置元件

配置元件Config Element用於提供對靜態資料配置的支援。

1)CSV Data Set Config:將本地資料檔案形成DataPool,拆分後儲存到變數中,適合處理多變數的場景

2)HTTP資訊頭管理器:可新增或者過載HTTP請求頭。

3)HTTP Cookie管理器:兩個功能

新增請求的預設管理工具,比如http請求的請求預設值,輸入路徑和編碼,後續的取樣器就可以不用填寫了,還有如http cookies Manager和Http header Manager,還有一些登入使用者的初始引數等

如在badboy錄製時產生的指令碼,已經自動新增

新增邏輯控制器

在badboy錄製的指令碼中,每一步其實就是一個邏輯控制器,比如一個場景,使用者登入一次後連續傳送多個帖子,那麼就可以在發帖的一步中,增加一個迴圈控制器,填寫迴圈次數,就可以完成傳送多個帖子的任務。設定如字面意思,一個是一致迴圈,一個是指定迴圈次數。

 

設定關聯

在實際有業務中,有時候一個介面使用的資料並不是來自使用者輸入或者外部檔案,來自上一個介面返回的伺服器返回的內容,而且是變化的,比如建立會話的SessionID,在我們的發帖中,發現會選擇一個板塊進行發帖,我們需要每次隨機選擇一個板塊,不是固定一個板塊發帖,那麼使用關聯進行處理。

在發帖中的介面,選擇板塊時是在請求的地址中http://localhost/jforum-2.1.9/forums/show/1.page的數字代表某一板塊,而該數字可以是登入後服務端返回的資料中獲得。在登入的後的請求新增後置處理切的正規表示式提取器

正規表示式語法在自主學習,該正規表示式就是在這個介面返回資料中按照上面的規則匹配出對應的資料。在該頁面的設定中名稱和註釋不再解釋,

Apple to:指的是應用的範圍,這個後置處理器的應用範圍

Main sample and sub-samples:匹配範圍當前父取樣器並覆蓋至子取樣器

Main sample only:匹配範圍當前父取樣器

Sub sample only:僅匹配子取樣器

Jmeter variable name to use:支援對Jmeter的變數值進行匹配

要檢查的響應欄位:主要是正規表示式需要匹配的資料來源,分為七個部分,

Body(unescaped):針對替換了轉義碼的body

Body as Docment:返回內容作為一個文件進行匹配

資訊頭:只匹配資訊頭部分

URL:只匹配URL部分

響應程式碼:匹配響應程式碼,如匹配HTTP返回碼200代表成功

響應資訊:比如響應了ok,成功資訊字樣

引用名稱:正規表示式匹配出的內容,通過此資訊訪問,使用時也是${引用名}的方式

 

正則表示式輸入表示式的語法,括號裡指的是取的值,如多個括號指多組匹配資料取值;

模板:如果是使用了多個正規表示式,那麼每個正則代表一個模板,表示使用提取到的第幾個值$1$:表示取第1組取值,$2$:表示取第二組取值;

匹配數字:0代表隨機,1代表全部;

預設值:是指在沒有找到匹配時的預設值;

而在多組情況下使用不同組資料時,在應用時需要使用${引用名_g1}這種樣式g1指的是第一組資料,g2指的是第二組資料

如上圖在請求頁面使用關聯引用名稱,執行後如果想檢視關聯的值是否正確線上程組中新增一個Dubug sampler

執行後,在結果樹中可以檢視到

引數化設定

例如在模擬登入操作時,可能需要多個使用者,那麼在傳送的請求時,登入的使用者名稱和密碼可能需要多個,那麼這些資料就可以進行引數化設定

首先給測試計劃新增資料的來源,需要配置元件,增加存放.dat檔案的路徑,檔案首行是引數名,中間的分割符在配置元件頁面設定,檔案需要無bom,建議使用notepad 進行編輯,txt自帶了bom頭,讀取異常

然後在請求引數的位置設定引數化,引數的使用格式和關聯很像,也是用${引數名}方式

新增斷言

在我們執行測試計劃時,主要用於測試結果和預期一致,如驗證是否的登入成功,我們在請求後增加了一個響應斷言,如果在響應文字中,找到使用者名稱就是登入成功

響應斷言頁面元素詳解:

Applay to:參考設定關聯的正規表示式

要測試的響應欄位:

針對響應資料的不同部分進行匹配,如

響應文字:響應伺服器的響應的文字內容,http協議排除Header資訊

響應程式碼:匹配響應程式碼,如http返回200成功

響應資訊:匹配響應資訊,如Http返回的“成功”、ok等資訊

Response Headers:匹配響應頭資訊

Request Headers:匹配請求頭資訊

URL 樣本:url

Docment(text):對文件內容進行匹配

Ingnore Status:如果一個請求裡有多個斷言,其中一個斷言響應斷言選中此選項,當第一個斷言失敗時,可以忽略第一個斷言結果,繼續進行下一個斷言,如果下一個斷言的成功還是能判斷斷言成功的(應用:如一個藉口返回的資料是隨機的幾個資料,那麼只要有一個匹配成功,都能算該介面是成功的)

Request Data:請求的data資料

 

模式匹配規則:

包括:響應的內容需要包括匹配的內容,支援正規表示式

匹配:響應內容要完全匹配需要匹配的內容,大小寫不敏感,支援正規表示式

Equals:響應內容需要完全匹配需要匹配的內容,大小敏感,需要的內容是字串非正規表示式

Substring:響應的內容包含需要匹配的內容才代表響應成功,大小寫敏感,需要匹配的內容是字串非正規表示式;

要測試的模式:需要匹配的內容

Custom failure message:新增些斷言不成功時的提示資訊,便於檢視

 

使用事務控制器

在效能測試時,我們需要關注TPS,也就是每秒事務數,Jmeter將每個請求看做一個事務,我們可以新增事務控制器,將一個操作裡的多個請求看做一個事務,事務控制器在邏輯控制器中,邏輯控制器主要是迴圈、分支等,滿足各種場景的設計,如圖

將登入的結果請求放到了“登入”事務中,如果勾選了,在結果樹中還能檢視事務下各個取樣器,事務的成功取決於事務下的各個取樣器是否成功。並且在結果樹中事務的總時間可能會大於各個子取樣器的時間和。

另一個選項“include duration…….”主要就是的是否包括定時器、處理、和後期延遲的時間

設定集合點

集合點讓虛擬使用者同一時刻傳送請求,在Jmeter中集合點通過定時器完成,我們在登入時,需要加一個同步定時器

Number of simulated User to Group by:集合使用者數

Timeout in milliseconds:超時時間,預設為0,沒有超時限制

場景設計與監控

場景的設計通常執行緒組的設計,參照執行緒組,不同的業務場景,新增邏輯控制器,以及為了達到併發等需要使用到定時器資訊,具體業務場景的需求設計一個具體的場景,有關監控首先是測試結果的觀察,在測試計劃點選新增,新增監聽器的元件,常用的檢視結果樹,另外在做效能測試過程中需要對CPU、記憶體、網路頻寬等資源進行監控,後續壓測時說明。以下選擇測試計劃新增監聽->Aggregate Report

Samples:執行了多少次取樣

Average:平均響應時間

Median:響應時間中間值

90%Line:90%事務響應時間

Min:最小響應時間

Max:最大響應時間

Error%:出錯率

Throughput:吞吐量,可以理解為Tps

KB/sec:資料傳輸量,單位KB

測試片段元素Test Fragment

是控制器上一種特殊的執行緒組。與thread group不同,只有當它是一個模組控制器或者是被控制器所引用時才會被執行。