Jmeter概述
Jmerter簡介
Apache Jmeter是Apache組織的開源項目,是一個純Java桌面應用,用於壓力測試和性能測試。它最初設計用於Web應用測試后來擴展到其他測試領域。
Jmeter功能
能夠對HTTP和FTP服務器進行壓力和性能測試,也可以對任何數據庫進行同樣的測試(通過JDBC)。
- 完全的可移植性和100%純java。
- 完全Swing(java設計的GUI工具包)和輕量組建支持。
- 完全多線程框架允許通過多個線程並發取樣和通過單獨的線程組對不同的功能同時取樣
- 精心的GUI設計允許快捷操作和更精確的計時
- 緩存和離線分析/回訪測試結果
Jmeter接口測試
jmeter接口測試的簡單操作包括做Http腳本編輯(發get/post請求,cookie設置、header設置,權限認證)、參數化、斷言、關聯和數據驅動等。
Jmeter初級實踐
Jmeter腳本編寫一般分五個步驟:
- 添加線程組
- 添加http請求
- 在http請求中寫入接入url、路徑、請求方式和參數
- 添加查看結果樹
- 調用接口、查看返回值
測試接口:
httpbin.org 這個網站能測試 HTTP 請求和響應的各種信息,比如 cookie、ip、headers 和登錄驗證等,且支持 GET、POST 等多種方法,對 web 開發和測試很有幫助。
發送GET請求
請求URL如下:
http://httpbin.org/get
在jmeter配置如下圖所示:

在查看結果樹選擇Json path Tester 如下圖所示可以看到返回結果:

發送POST請求
請求URL如下:
http://httpbin.org/post
Jmeter配置如下圖所示:

響應結果:

HTTP請求默認值
Web服務器中的協議和服務器名稱或IP這兩個值是一樣的,每次重復輸入起始比較麻煩,英雌可以試用HTTP請求默認值來管理這樣的公共配置數據。
添加步驟:線程組——添加——配置元件——HTTP請求默認值 然后進行如下配置, 並吧元件防止在請求前面。

經過請求默認值的配置后,后續我么年增加新的請求,如果這兩項是一樣的話則無需重復填入該值

斷言設置
斷言設置步驟如圖:

Jmeter可以針對每一個請求響應進行斷言。常用斷言模式匹配規則如下:
- 包括:響應內容包括需要匹配的內容即代表響應成功,支持正則表達式
- 匹配:效應內容要完全匹配需要匹配的內容即代表響應成功,大小寫不敏感,支持正則表達式
- Equals:響應內容要完全等於匹配的內容才代表成功,大小寫敏感,需要匹配的內容是字符串正則表達式
- Substring:返回結果包含指定結果的字串,但是不支持正則字符串
- 否:不進行匹配
測試:如下圖所示,斷言返回的字符串是否包含 “”httpbin.org/get“”

如果斷言成功,結果樹顯示為綠色標志,失敗則為紅色標志,下圖中將post請求故意斷言失敗:


參數設置
Jmeter支持通過Query String Parameters 或者 Request body 請求體來傳遞數據
Query String Parameters
如果希望在請求URL中添加參數,則可以在HTTP請求界面的Paeameters選項里面添加參數。該參數會通過Query String Parmeters方式傳遞給服務器,也就是在URL中傳遞參數。如下圖所示設置參數:

Request body
在Post請求中參數一般在body中傳遞,Jmeter也支持在body中傳遞數據。如傳遞Json格式的參數,在Body Data 編輯框輸入參數,另外還需要指定參數的格式,因此需要添加HTTP信息頭管理器。並在管理器里添加參數類型 Content-Type:appication/json 如下圖所示:



變量
Jmeter支持以下類型變量
- 用戶自定義變量
- 函數生成變量
- BeanShell變量
- csv數據文件變量
用戶自定義變量
設置步驟:

Tips:
每次迭代更新一次:如果有多個用戶/使用變量時勾選,如果不勾選,所有線程用的是同一個值,需要不同的線程用不同的值,需要勾選此選項

在請求時變量引用格式為:${heroname} 如下圖所示:

請求數據:

函數生成變量
Jmeter由許多內置的函數,可以生成隨機數。
創建步驟:|
生成變量:

請求結果:

BeanShell變量
什么是Bean Shell?
- Beanshell是一種完全符合java語法規范的腳本語言,並且由用由自己的一些語法和方法;
- Beanshell是一種松散類型的腳本語言(與JavaScript類似);
- Beanshell是用Java寫成的,一個小型的、免費的、嵌入式的Java源代碼解釋器,具有對象腳本語言特性,非常精簡;
- Beanshell實行標准Java語句和表達式,另外包括一些腳本命令和語法;
Jmeter有哪些BeanShell
- 定時器:BeanShell TIme
- 前置處理器:BeanShell PreProcessor
- 采樣器:BeanShell Sampler
- 后置處理器:BeanShell Postprocessor
- 斷言:BeanShell 斷言
- 監聽器:BeanShell Listener
Bean Shell 常用內置變量
Jmeter在它的BeanShell中內置了變量,用戶可以通過這些變量與Jmeter進行交互,其中主要的變量及其使用方法如下:
vars - (JmeterVariables):操作Jmeter變量,這個變量試劑引用了Jmeter線程中的局部變量容器(本質上是Map),它是測試用例與BeanShell交互的橋梁,常用方法:
//定義Jmeter變量 var.put(String key,string value); //從Jmeter中獲取變量 vars.get(String key);
BeanShell實踐案例
1、創建一個Http請求,請求地址為:http://httpbin.org/get同時設置傳遞的參數為beanshell_user

2、創建BeanShell PreProcessor 變量設置如下所示:

3、變量已經生效

csv數據文件變量
csv數據文件變量是指從外部csv文件讀取數據來作為變量。
1、添加步驟:

2、創建csv文件
文件名:user_data.csv
文件內數據:leesin,6666
3、csv文件設置:

返回數據如下:
POST http://httpbin.org/post POST data: user=leesin&passwd=6666 [no cookies] Request Headers: Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 23 Host: httpbin.org User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_191)
csv參數化
針對剛剛POST接口進行如下參數遍歷測試:
接口如下:
http://httpbin.org/post
發送參數:user_data.csv
leesin,6666 zed,3333 jawen,rrrr
1、在之前的csv數據文件設置更改配置如下:此操作表示把所用數據讀取一遍,且不重復

2、在請求名稱后面加上變量可以方便我們后期擦好看數據遍歷情況:

3、將線程組的數量更改,比如csv文件中有3組數據,線程數就更改為3。最后運行結果如下:

正則匹配
在接口測試過程中經常需要接口之間關聯調用,比如獲取上一個接口的返回值,作為另一個接口的請求參數。此時就需要使用jmeter的正則表達式提取器,通過對響應的數據來提取指定的數據。的
操作案例
從請求Http-get的響應數據中匹配隨機數num的值,然后創建請求get-num來引用num的作為請求參數
操作步驟
1、在函數助手中設置一個1-100的隨機數,待會提取使用:

2、創建正則表達式提取器

3、配置正則表達式提取器

4、新建請求get-num,在新的請求中將http-get返回的數據作為傳遞參數:

此時發送請求,兩個HTTP請求的請求數據是一樣的
正則表達式配置表:
- 引用名稱:請求要引用的變量名稱,如填寫result_num,則可用${result_num}引用它;
- 正則表達式:匹配需要的內容;
- 模板:用$num$引用起來,如果在正則表達式中有多個匹配數據,num表示匹配到的第幾個值給變量。如:$1$表示匹配到的第1個值儲存在變量中;
- 匹配數字:0代表隨機取值,1代表取全部值;
- 缺省值:如果參數沒有取得到值,那默認給一個值讓他取;
案例中正則表達式說明:
- ()括起來的部分代表要提取的值;
- .匹配任何字符;
- +匹配一次或多次
- ?在找到的第一個匹配項后停止
相關資料:正則表達式教程
用例數據分離
之前用例數據都是配置在Jmeter Http請求中,每次需要增加,修改用例都需要打開Jmeter重新編輯,當用例越來越多的時候,用例維護起來就越來越麻煩。那么我們就可以將用例的數據存放在csv文件中,然后通過csv文件配置來讀取用例中的數據,執行測試。用例數據如下圖所示:

用例名稱變量含義:
- ${caseSeq}:用例編號
- ${apiType}:api類型
- ${apiSeq}:api版本號
- ${apiName}:api名稱
- ${priority}:優先級
- ${url}:api路徑
- ${methids}:請求方法
- ${parameter}:請求參數
- ${expectValue}:期望值,用於斷言
案例演示:
1、新建一個線程組,命名:數據驅動
2、創建一個Http請求默認值,設置如下:

3、添加一個循環控制器,位置:線程組--添加--邏輯控制器--循環控制器。()循環控制器可以控制整個用例循環執行的次數)默認值是1根據用例數量修改為4.

4、在循環控制器節點系阿創建csv文件設置,配置內容如下:

5、創建一個if控制器,位置:線程組--添加--邏輯運算器--if控制器
if控制器的作用為根據不同條件執行不同的用例,例如這里根據不同的接口請求類型,分別創建了GET和POST控制器。
GET設置的條件語句如下:
"${methods}"=="GET" 其中${methods}表示引用csv的methods中的值
參數:
- interpret Condition as Variable Expression?:如果這項被選中,將不會使用js解析;條件表達式的值必須是true(忽略大小寫),這里我們取消勾選狀態
- Evaluate for all children:如果心中這一項,在每個子節點執行前都會計算表達式

Post條件語句設置為:“${methods}”=="POST"

6、創建GET請求類型用例如下:
用例名稱格式:${caseSeq}_${apiSeq}_${apiName}

斷言設置:

添加查看結果樹,運行后看到的結果如下:

通過數據驅動當面臨大量用例時其Jmeter設置和用例后期維護工作就會非常高效
Cookie設置
HTTP Cookie 管理器
如果你有一個HTTP請求,其返回值結果包含一個cookie,那么使用Jmeter Cookie管理器會自動將該Cookie保存起來,而且以后所有對該網站的請求都是用同一個Cookie。每個Jmeter線程都有自己獨立的“cookie保存區域”
案例實踐:
發送兩個請求,將第一個請求的cookie值保存,第二個請求進行復用
請求URL:http://httpbin.org/cookies/set
設置的cookie內容:hero/leesin
1、添加HTTP Cookie 管理器:

2、新增一個HTTP請求,名稱為:set-cookie,方法為:GET,路徑為:/cookies/set/hero/leesin

3、添加查看結果樹,運行可以看到cookie數據

4,、新增一個HTTP請求,名稱為:get-cookie,方法為:GET,路徑為:/cookies,運行后可以看到get-cookie也包含的cookie數據

授權設置
上一個學習Postman的文章中,使用過對各種授權協議的接口進行測試,在Jmeter中同樣也支持對授權的接口進行測試。關於各個授權協議的內容請參考Postman內容中的介紹
Basic Auth
案例實踐:
接口:http://httpbin.org/basic-auth/{username}/{passwd}
用戶名:hero
密碼:leesin
1、新建http請求名稱為:basic-auth
2、添加HTTP授權管理器,添加路徑:選中請求--添加--配置元件--HTTP授權管理器

執行結果如下:

請求內容:
GET http://httpbin.org/basic-auth/hero/leesin GET data: [no cookies] Request Headers: Connection: keep-alive Host: httpbin.org User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_191) Authorization: Basic aGVybzpsZWVzaW4=
請求內容中帶有授權信息Authorization:BasicaGVybzpsZWVzaW4=,而aGVybzpsZWVzaW4=這個數值就是將 “用戶名:密碼” 經過Base64編碼后計算出來的。
Digest Auth
案例實踐:
接口:http://httpbin.org/digest-auth/{qop}/{username}/{passwd}
{qop}這個參數規定server支持保護方案。client能從列表中(auth,auth-int)選擇一個。
- auth表示僅僅進行身份驗證;
- auth-int表示進行驗證外,另一些完整性保護;
用戶名:hero
密碼:leesin
測試報告
批量執行完接口測試之后,我們需要查看測試報道,之前單個接口調試是通過 “查看結果樹”來查看結果,但是當大批量執行接口測試后依舊這樣查看坑定會很低效。
聚合報告
聚合報告是一個比較精簡的報告元件,可以查看每個接口的性能情況與執行結果。
添加路徑:

運行結果:

各個參數含義如下:
- Label----每個請求的名稱,比如HTTP請求等
- Samples----發給服務器的請求數量
- Average----單個請求的平均響應時間 毫秒ms
- Median----50%請求的響應時間 毫秒ms
- 90%Line----90%請求響應時間 毫秒ms
- 95%Line----95%請求響應時間 毫秒ms
- 99%Line----99%請求的響應時間 毫秒ms
- Min----最小的響應時間 毫秒ms
- Max----最大的響應時間 毫秒ms
- Error%----錯誤率=錯誤的請求的數量/請求的總數
- Throughput----吞吐量即表示每秒完成的請求數
- Received KB/sec----每秒從服務器端接收到的數據量
- Sent KB/sec----每秒從客戶端發送的請求的數量
HTML報告
工作中會碰到將測試報告以HTML附件的方式發送給各個項目成員,那么需要生成測試報告。Jmeter3.0以后引入了Dashboard Report,用於生成HTML頁面格式圖形化報告的擴展模塊。
生成步驟:
打開cmd進入jmeter目錄bin目錄
執行命令:
jmeter -n -t C:\Users\ccl\Desktop\data_driver.jmx -l httpbin.jtl -e -o C:\Users\ccl\Desktop\report
命令參數:
- -n:以非GUI形式運行Jmeter
- -t:Jmeter腳本路徑
- -l:result.jtl 運行結果保存路徑(.jtl)此文件必須不存在
- -e:在腳本運行結束后生成html報告
- -o:用於存放html報告的目錄,不加改參數默認生成到bin\report-output
生成的測試報告樣式如下:


