Jmeter接口測試、性能測試詳細介紹
下面主要就是講一下Jmeter工具的用法,用法非常簡單,比起loadrunner不知道簡單多少,並且開源免費~~
1、接口簡介
接口定義
接口:
就是數據交互的入口和出口,是一套標準規範。
接口(硬件類接口)
是指同一計算機不同功能層之間的通信規則稱為接口。比如USB接口。
接口(軟件類接口)
前後端共同遵守的一套數據交互的規範
接口優點:
前後端開發相對獨立,都遵循文檔規範就可以了,提高了效率。
擴展性靈活,人員變動不受太大影響。
2、接口測試簡介
接口測試,就是測試後端的實現是否符合接口規範。
測試都測什麼?
一是程序的功能、安全性
二是效率(性能)
怎麼測?
模擬客戶端向服務器發送數據,然後查看響應。
比如說:登錄功能的接口,一般情況是發送一個帶有用戶名和密碼數據的請求到後台,後台再返回一個json格式數據,比如前端需要顯示用戶名,那麼後台就要返回一個用戶名。接口測試就是要測返回的這個數據是否符合接口文檔的格式,內容是否正確等。
接口測試分類:
web接口測試(B\S架構)
一種是服務器接口測試(公司自己的程序)
一種是第三方接口測試(別的公司的接口,比如微信支付接口)
模塊接口測試(C\S架構)
3、環境搭建
測試接口的插件/工具:
火狐瀏覽器:RESTClient
谷歌瀏覽器:POSTman
Java實現的測試工具:Jmeter
安裝好這些工具,方便後期使用,下面簡單說了一下RESTClient、Postman如何安裝,Jmeter會在後面重點說明。
一、火狐插件RESTClient安裝
- 打開火狐瀏覽器,點擊右側的選項按鈕,選擇附加組件
2.搜索RESTClient
3.搜索到後點擊進去,點擊添加到firefox
二、postman工具
chrome瀏覽器被屏蔽了,可能搜不到postman,直接去網上下載一個插件rar包,解壓。點擊擴展程序,加載已解壓的擴展程序。
這種方式的話,一定要注意chrome瀏覽器版本和postman版本有對應關係,比如:
chrome的65.0.3311.4版本對應postman插件的4.1.3版本。
再或者可以下載一個postman.exe文件,安裝到電腦中。
使用postman做簡單的接口測試:
get方法:
打開postman,比如查詢功能,像下面這個截圖,默認是GET方法,後面輸入鏈接,點擊send,下面就返回了數據,檢查返回的數據和狀態字,都是正確的。
POST方法:
示例是參考這個api文檔:
裏面有一個接口為:
用postman測試,就選擇POST,輸入鏈接://cnodejs.org/api/v1/accesstoken
然後點擊下面的key,輸入accesstoken,再點擊value,輸入你的accesstoken,就可以查詢到結果:
點擊下圖標紅的地方,可以切換輸入post數據的風格:
4、RESTful風格
開發測試時,大家的都會遵守的一些默認的規範,這些約定俗成的,大家習慣的作法,非強制性的。RESTful風格也是這樣一種規範。
RESTful具體規範內容:URL實現方式、提交數據的實現方式、響應的數據的實現方式等。
接口一般就是和後台交互數據的,針對數據常用的就是增刪改查操作,RESTful針對增刪改查都有哪些規則呢?
增加數據(比如註冊,向後台新增數據):
- URL:應該使用POST方式
- 提交數據方式:
方式1:URL?key=value&key1=value1
方式2:json格式
3.響應的數據:
狀態碼200/201+剛才添加的記錄
查詢數據(比如搜索):
- 一般是GET方式
- 提交數據方式:
常用方式1:URL?key=value&key1=value1
3. 響應的數據:
狀態碼200/201+查詢到的數據
修改數據:
1. 一般是POST/PUT方式
2. 提交數據方式:
方式1:URL?key=value&key1=value1
方式2:json格式
3. 響應的數據:
狀態碼200/201+修改後的數據
刪除數據:
1. 一般是GET/DELETE方式
2. 提交數據方式:
方式1:URL?key=value&key1=value1(常用)
方式2:json格式
3. 響應的數據:
狀態碼200/204+無
5、Json說明
Json是一種數據載體,是一種輕量級的數據交換格式。常見的還有html、xml等,而互聯網本質就是各種數據傳輸,數據傳輸的數據載體就可以用json、html、xml等。
相比較來說,json描述更簡潔,如果數據量小的話,用json很方便,效率更高。
json語法:
- 鍵值對格式:{『key1』:』value1』, 『key2』:』value2』, 『key3』:』value3』}
- 數組/列表格式:[』value1』, 』value2』, 』value3』]
- 組合格式:{『key1』:[1,2,3], 『key2』:[4,5,6], 『key3』:』value3』}
[{『key1』:』value1』, 『key2』:』value2』, 『key3』:』value3』}]
6、Jmeter簡介
Jmeter是Apache組織開發的基於Java的開源的壓力測試工具。可以模擬高並發和多次循環的測試場景,能夠對HTTP和FTP服務器進行壓力和性能測試, 也可以對任何數據庫進行同樣的測試(通過JDBC),可移植性
Jmeter的作用:
- 接口測試
- 性能測試:內在算法,執行效率(響應時間)等
- 壓力測試:外在的壓力(最多並發用戶數,負載測試)
- web自動化測試
- 數據庫測試
- java程序測試
Jmeter優點:
- 支持多協議:http、https、ftp、ftps等
- 開源、免費
- 小巧並且功能強大
Jmeter缺點:
- 不支持IP欺騙
- 不支持前端測試
7、Jmeter環境搭建
Jmeter是基於java開發的,所以要運行Jmeter,必須要先安裝java環境(百度一下就知道怎麼安裝了),然後下載Jmeter,去apache官網下載:
//downloads.apache.org/jmeter/binaries/
下載的時候要注意看這句話:Apache JMeter 5.2.1 requires Java 8+,Apache Jmeter版本和java版本的對應關係
Jmeter下載下來後,解壓,長這樣:
雙擊進入bin文件夾,找到ApacheJMeter.jar文件,雙擊打開就啟動了Jmeter工具。
能啟動起來看到類似下面這個圖的界面,環境就ok了。
安裝好之後,配置環境變量,win7:計算機右鍵->屬性->高級系統設置->環境變量->下面的系統變量中,新建一個變量,變量名:JMETER_HOME,變量值:你的Jmeter安裝路徑比如:D:\Jmeter\apache-jmeter-3.1
然後修改Path,後面新增一個%JMETER_HOME%\bin;注意如果前面有別的環境變量,要有分號隔開。再增加幾個環境變量,都是後續會用到的:
%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar
8、Jmeter使用
8.1 Jmeter發GET請求
用一個簡單的小例子,說明一下使用Jmeter發送一個get請求的操作步驟:
第一步:打開Jmeter後,輸入一個測試用例的名字,比如測試名稱輸入「測試計劃1_helloworld」,然後ctrl+s保存:
第二步:右鍵點擊左側的「測試計劃1_helloworld」,選擇「添加」–Threads–線程組,輸入一個名字,比如「線程組01」,保存。
第三步:右鍵點擊「線程組01」,點擊添加–Sampler–HTTP請求
第四步:上面添加了一個http請求,接下來就是構建http請求了,輸入一個http請求的名字,比如「HTTP請求01_查詢最新新聞」,下面主要填寫如圖圈紅部分,服務器名稱或者IP,端口號,協議,方法,編碼,以及路徑。
注意:這裡的服務器名稱或者IP,端口號是你要測試的網站的IP地址和端口,一般是公司的某台服務器,公司會提供。協議,一般就是HTTP和HTTPS,方法常用的get、post等,編碼一般寫utf-8就可以,路徑就是你的測試路徑,我這裡直接寫的知乎的一個開放API路徑,如果上面有寫了服務器和端口,下面這個路徑是可以省略前半部分的。根據實際情況寫即可。
比如測試這個接口://news-at.zhihu.com/api/4/news/latest,下面這兩種寫法都可以:
第五步:上面構建好了要發送的請求,接下來要添加一個監聽器,在發送請求的時候會把結果記錄下來。右鍵測試計劃—添加—監聽器—察看結果樹
第六步:點擊工具欄裏面的綠色倒三角,就執行了HTTP01請求,察看結果樹裏面可以看到響應結果。
8.2線程組
進程概念:正在執行的程序
線程概念:線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位。一個進程有多個線程。比如迅雷下載,每一個下載任務就是一個線程。
線程組:按照線程性質被線程執行的分組。
並發執行:多個線程同時執行,每個線程結束的順序和開始的順序不一定一致。
順序執行:按照線程的啟動順序挨個執行,一個線程執行結束再開始另一個線程。
8.2.1 並發執行
在Jmeter中,如何設置並發執行?
拿8.1講過的例子來說,如下圖:
進程可以認為是測試計劃,線程組就是線程組01,打開線程組,可以看到下圖所示的線程屬性,可以設置線程數,加入改成2,再執行一次:
執行結果就會看到兩個線程結果:
結果1:
結果2:
這樣設置就等同於兩個用戶並發執行了~
8.2.2 順序執行
那麼順序執行呢?
右鍵點擊測試計劃,可以看到有一個「獨立運行每個線程組」複選框,勾選上,然後我再添加一個線程組,這樣運行後,就可以看到是挨個線程組運行了:
運行結果:
8.2.3 線程組–Ramp-Up Period(in senconds)
上面講了線程數,表示用戶數。線程屬性中還有一些其他值,點擊線程組03,如下圖:
Ramp-Up Period(in senconds):這個值的意思是在多少時間之內執行完全部線程。單位是秒。比如這裡寫10,線程數改為3,那就是10s之內運行3個線程,平均3秒鐘執行一個。
8.2.4 線程組–循環次數
循環次數:單個用戶循環的次數。如果改成2,線程數為3,那就是3個用戶將這個線程組中的請求分別執行2次。循環次數勾選永遠的話,就是一直執行,直到點擊停止按鈕:
8.2.5 線程組–調度器
調度器有兩種用法:
第一種:
勾選調度器,輸入持續時間和啟動時間,點運行。
持續時間意思是持續發送請求的時間,6秒鐘之內一直發。
啟動延遲:意思是點擊運行後,延遲幾秒中再發請求。
第二種:
就是下面的啟動時間和結束時間。可以輸入具體的啟動時間值和結束時間值。
ps:使用調度器的時候,上面的循環次數勾選「永遠」。
8.2.6 setUp和tearDown
前面講順序執行的時候,勾選「獨立運行每個線程組」,線程組就會按照順序依次執行,但是這裡還有兩個特殊的線程組,setUp和tearDown。setUP線程組會在所有線程組執行前執行,tearDown線程組在所有的線程組執行完畢後執行。
如何添加?
右鍵單擊測試計劃—添加–Threads–setUp Thread Group/tearDown Thread Group
setUp線程組:一般可以用來加載程序運行時需要的資源
tearDown線程組:可以用來放一些保存運行結果的代碼
8.3POST請求
如何用Jmeter實現用戶註冊?
大體步驟和上面的類似,創建一個線程組,線程組中添加一個取樣器sample–http請求,然後修改服務器名稱或IP,修改方法為POST,修改路徑,接下來就是修改body內容,一般是json數據、Form表單、xml或者JavaScript等。
如果測試註冊功能呢?拿下面這個例子來說:
前三步和發GET請求是一樣的,第四步,點擊Parameters中的添加按鈕,輸入鍵值對即可:
第四步也可以點擊Body Data,直接輸入內容:
如果查看結果樹裏面的內容過多需要清除的話,可以使用工具欄中的:
這裡還需說明一個HTTP請求頭裏面的概念:Content-Type。
應該都知道,發post請求是需要有數據的,但是數據的格式是什麼,要怎麼告訴瀏覽器呢?就是請求頭裏面的「Content-Type」鍵。
之前用Jmeter,沒有修改Content-Type,但是也都正常執行了,那是因為Jmeter會有默認的Content-Type,那就是:x-www-form-urlencoded,如果你的接口剛好使用的是這種格式,就沒問題。但是如果你的接口只能接受json數據,這樣就會出問題。
當Content-Type為默認x-www-form-urlencoded時:
如果是get請求,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2…),然後把這個字串append到url後面,用?分割,加載這個新的url;如果是post請求,瀏覽器把form數據封裝到http body中,然後發送到server。
比如圖:
如果你的接口是需要其他格式的:比如:」application/json」、」application/xml」、「application/javascript」,Jmeter中應該怎麼去修改呢?
選中「測試計劃」,右鍵,選擇「添加」—「配置元件」—「HTTP信息頭管理器」,點擊「添加」,輸入鍵值對即可,如下圖:
需要注意的是:注釋可以不寫,Content-Tpye的值為:
application/json;charset=utf-8。這裏面的分號必須是英文的。
charset=utf-8的作用是為了保證瀏覽器各種字符都可以識別。
json也可以修改為xml或者JavaScript,看自己的需求到底是什麼。
請求頭如果寫的是json,那麼你對應的請求中的Body Data就需要是json格式。
8.4 HTTP請求默認值
我們測試的時候,如下圖的服務器名稱或者IP,以及端口號,HTTP請求的協議,編碼格式等一般都是一樣的,此時我們可以將這些數據抽離出來,放到HTTP請求默認值中,這樣你新建HTTP請求的時候可以不用寫這些重複的值了。
如何抽離?
在測試計劃1_helloworld這裡右鍵點擊添加—配置元件–HTTP請求默認值,將相同的內容添加到這個頁面中保存即可。
8.5 Jmeter參數化
參數化的概念和其他的自動化測試中的參數化概念一樣,就是為了執行批量操作,比如批量註冊,批量登錄,用戶名和密碼需要很多不同的值,此時就可以用到參數化。
8.5.1方式一:CSV DATA Set Config
CSV DATA Set Config是Jmeter的一個參數化組件,通過這個組件可以動態獲取並設置數據,實現類似批量操作。
拿登錄來說,假如要測試同時5人登錄,那麼就需要5個賬號密碼。如何實現參數化?
1.首先要編寫登錄測試用例,設置循環次數為5次,post需要發送的賬號和密碼先填空。
2.編寫一個外部文本文件,存儲要登錄的5個人的賬號密碼
3.Jmeter添加一個參數化組件CSV Data Set Config,每次循環時都讀取文本文件的一行數據,將數據的賬號密碼字段分別填入post數據中。
步驟:
1、新建一個線程組,循環次數為5
2、添加HTTP請求,寫上路徑、方法以及BodyData,BodyData只需要寫鍵
3、添加一個CSV組件:右鍵單擊「線程組」->添加->配置元件->CSV Data Set Config。
filename:參數文件的路徑
file encoding:編碼格式,要注意你的參數文件必須是utf-8無BOM格式。
Variable Names:這項內容,可以認為是列名,或者給參數起的名字,多個名字用逗號隔開。
Delimiter:這裡默認有一個逗號,表示你的參數文件裏面的參數用逗號分隔的。
我的dataLogin.txt的內容是這樣:
我需要用到兩個參數,所以Variable Names我寫兩個變量名;dataLogin.txt中參數用逗號分隔的,所以Delimiter中寫逗號。根據實際情況改即可。
4、去修改HTTP請求中的Body Data:name=${username}&passwd=${pwd}
要注意格式必須是${變量名}
如果你的Body Data需要是json數據,大概寫法是這樣:
{
」name」:」${username}」,
「passwd」:」${pwd}」
}
之後運行試試吧,應該是會出來5個結果,每個結果對應的是一個參數對應的返回信息。
ps:循環次數也可以大於5次,大於5次的時候,就是把參數用完後再從頭開始使用。
ps:除了可以修改循環次數為5次,線程數改為5,也會依次執行每組參數。
8.5.2方式二:不用外部文件
步驟:
1、再新建一個線程組,此時線程數設置為3,添加一個HTTP請求,和上面的第2步一樣。
2、右鍵點擊線程組->添加->前置處理器->用戶參數。
輸入名稱,名稱就是變量名,用戶是代表每個用戶的變量值。下面四個按鈕可以添加變量、刪除變量、添加用戶、刪除用戶。
目前我這裡寫了3個用戶。
3、第三步和CSV的方法的最後一步一樣,去修改POST的Body Data。
name=${username}&passwd=${pwd}
8.5.3方式三:用戶自定義變量
還是直接舉例來說吧,例如如下接口:
以下 api 路徑均以 //cnodejs.org/api/v1 為前綴
1、get /topics 主題首頁
接收 get 參數
- page Number 頁數
- tab String 主題分類。目前有 ask share job good
- limit Number 每一頁的主題數量
- mdrender String 當為 false 時,不渲染。默認為 true,渲染出現的所有 markdown 格式文本。
2、get /topic/:id 主題詳情
接收 get 參數
- mdrender String 當為 false 時,不渲染。默認為 true,渲染出現的所有 markdown 格式文本。
- accesstoken String 當需要知道一個主題是否被特定用戶收藏以及對應評論是否被特定用戶點贊時,才需要帶此參數。會影響返回值中的 is_collect 以及 replies 列表中的 is_uped 值。
示例:/api/v1/topic/5433d5e4e737cbe96dcef312
步驟一:新建一個線程組:線程組03_用戶自定義變量,添加兩個HTTP請求,第一個請求測試主題首頁,服務器名稱或者IP應該是:cnodejs.org,路徑:/api/v1/topics;第二個詳情測試主題詳情,服務器名稱或者IP是:cnodejs.org,路徑:/api/v1/topic/5433d5e4e737cbe96dcef312;
步驟二:可以看出來,步驟一中的路徑「/api/v1」這一部分是重複的,不只是這兩個請求是這樣,所有的請求都是以/api/v1開頭,針對這個重複部分,可以提取出變量,以後可以不用重複寫這部分,如果這部分需要修改,那麼也只需要改一個地方即可。所以第二步就是添加一個用戶變量來保存這部分內容,在測試計劃的地方右鍵->添加->配置元件->用戶自定義的變量,點擊添加按鈕,輸入變量名和值。如圖:
第三步就是使用這個變量替代HTTP請求中的重複部分:
改好之後運行就可以看到結果了,和不使用全局變量是一樣的結果只是這樣的話更方便,如果路徑長的話,也不用擔心路徑寫錯。
運行的時候,以前的線程組可以先禁用,禁用後再運行就只會運行沒有被禁用的。在線程組或者HTTP請求上右鍵,點擊禁用即可。
另外還有一點,就是查看結果樹中,響應數據默認的是顯示text形式的結果,這個示例的結果是json,用text顯示就非常不好看,可以修改一下顯示的方式:
第三種方法就說完了,這個方法用的地方不是很多,一般只用來存儲全局使用的變量,了解下即可。
8.5.4方式四:使用函數參數化
比如
獲取網易新聞API
請求方式:POST
請求地址://api.apiopen.top/getWangYiNews
如果要查詢多頁,那麼就需要每次只修改page即可,像這樣:
//api.apiopen.top/getWangYiNews?page=1&count=5
//api.apiopen.top/getWangYiNews?page=2&count=5
//api.apiopen.top/getWangYiNews?page=3&count=5
此時就可以使用一個函數來代替頁碼。步驟:
1、依然是新建一個線程組,新建一個HTTP請求,將各項內容填好,Body Data的內容是:page=1&count=5
2、然後在菜單欄的「選項」裏面有一個「函數助手對話框」,點擊它,或者點擊工具欄的倒數第二個按鈕,或者是快捷鍵Ctrl+Shift+F1
3、彈出函數生成對話框後,選擇一個功能,我們選__counter,函數參數,第一個參數可以寫FLASE,表示這個計數器是所有的線程共用一個,如果是True,表示每一個線程使用一個計數器。然後我們點擊生成,就會在左側的框中生成一個字符串,複製這個字符串:
4、將上面的字符串粘貼到Body Data中:page=${__counter(FLASE,)}&count=5
5、然後我們將這個線程數設置為2,循環次數設置為3,運行測試下,測試結果看到請求中的POST數據的page值是從1-6變化的
如果__counter()函數的第一個參數設置為True,結果應該是page會從1-3變化,2個用戶,所以會有2個1-3.
這裡還有很多其他的函數可以使用,甚至可以自定義函數,後期再繼續學了。總體來說,使用函數參數化的用法就是:${函數名(參數)}
8.6直連數據庫
jmeter本身沒有提供連接數據庫的功能,需要使用第三方jar包。這裡使用mysql數據庫舉例,使用方式:
1、在測試計劃的屬性下面有一個Add directory or jar to classpath(添加文件夾或jar包),點擊添加,選擇mysql連接java的jar包。
我的放到了:D:\Jmeter\apache-jmeter-3.1\self\mysql-connector-java-5.1.35-bin.jar
2、配置數據庫連接信息:在測試計劃處右鍵->添加->-配置元件->JDBC Connection Configuration
Variable Name:自定義參數名字,在JDBC Request中會用到;
Database URL:jdbc:mysql:// 數據庫IP地址:數據庫端口/數據庫名稱;
(jdbc:mysql:相當於一個協議,類似http:一樣,固定這樣寫,就是告訴Jmeter是mysql數據庫,如果是別的數據庫,mysql改一下即可,比如jdbc:sqlite:)
(數據庫名稱後面可以加參數:?useUnicode=true&characterEncoding=utf-8)
JDBC Driver Class:com.mysql.jdbc.Driver;mysql數據庫的驅動
Username:數據庫用戶名;
Password:數據庫密碼;
3、然後在線程組中添加一個JDBC請求:右鍵線程組->添加->Sampler->JDBC Request
這裡要注意添加的是JDBC Request,不是HTTP請求,JDBC Request屬性中:
Variable Name:是第二步裏面的Variable Name,必須寫一樣。
Query Type: 目前常用的就是Select Statement(sql語句是select的時候選擇這個);sql語句是刪除、修改、添加的時候選擇Update Statement
下面的文本框中寫你的sql語句。
這樣3步完成,運行就可以在察看結果樹中看到select的結果了。
查到了數據庫的內容,接下來就是使用這些內容了。
還用之前參數化時用的接口api.apiopen.top/developerLogin
4、先去修改一下JDBC Request裏面的查詢語句為select name,pwd form login,然後在下面變量名的位置,寫上兩個變量
Variable name:就是存儲的數據庫取出來的值,username對應name,pwd對應pwd。
5、然後添加一個HTTP請求:api.apiopen.top/developerLogin,將上面保存的值傳給HTTP請求的name和pwd
Body Data中寫:name=${username_1}&passwd=${pwd_1}
需要注意的是,username保存的是查出來的所有符合條件的name值,想要取其中的某一個值,需要後面跟下劃線+數字的形式表示你想使用第幾條數據。
運行就可以看到結果了。
8.7 Debug用法
還是接着上面的來說明Debug的功能,在我們的HTTP請求或者JDBC Request請求上右鍵,添加->後置處理器,選擇Debug PostProcessor
然後運行,可以看到運行結果多了一個Debug PostProcessor
從結果看,可以看到密碼都被存到了pwd_1、pwd_2、pwd_3中,並且pwd_#可以用來表示總共有幾條記錄。
8.8 Jmeter關聯_xpath提取器
關聯,意思是兩個請求有關聯性,比如一個請求的結果需要用到另一個請求中。上面講到的從數據庫取出數據給HTTP請求就是一種關聯。
現在我們新建兩個HTTP請求,一個請求百度首頁,一個請求搜狗首頁,將百度首頁響應回來的title中的內容提取出來,去搜狗裏面搜索,這裡我們使用xpath提取器,步驟:
1、新建兩個HTTP請求,如下圖:
2、在HTTP請求_訪問百度那右鍵,選擇添加->後置處理器->XPath Extractor,
一般在HTTP請求結束後需要做的操作都放到了後置處理器中,我們現在需要把訪問百度的請求發送完之後,利用xpath拿到響應中的內容,所以去後置處理器中添加XPath Extractor控件,這個控件主要需要注意3個點:
Use Tidy:因為是返回的是html,必須勾選Use Tidy。
引用名稱:就是變量名,你取出你想要的值後放到變量中。
XPath query:寫xpath表達式
缺省值:意思是沒有找到xpath就用這個值替代。
3、將HTTP請求_訪問搜狗的請求的路徑改成:/?query=${queryText},這個是第2步中的xpath變量名。
然後運行,可以看到結果:
8.9 Jmeter關聯_正則表達式
上面8.8節是使用xpath提取器提取信息使用,事實上也可以使用正則表達式,上面的第2步,改成:在HTTP請求_訪問百度那右鍵,選擇添加->後置處理器->正則表達式提取器
引用名稱:依舊是變量名
正則表達式:就是你需要提取的內容,()括號表示提取字符串中的部分值,()前後是提取的邊界內容。正則表達式如果不懂,需要單獨學習一下。
模板:正則表達式的提取模式。這裡是固定格式:$數字$,
如果正則表達式有多個提取結果,則結果是數組形式,模板$1$,$2$等等,表示把解析到的第幾個值賦給變量;從1開始匹配,以此類推。
若只有一個結果,則只能是$1$;
匹配數字:
正則表達式匹配數據的結果可以看做一個數組,表示如何取值:0代表隨機取值,正數n則表示取第n個值(比如1代表取第一個值),負數則表示提取所有符合條件的值。
示例2:
比如我先拿到網易新聞的熱點新聞標題,然後到搜狗中去搜索。
1、添加HTTP請求,網易新聞API請求,服務器名稱:api.apiopen.top,路徑:/getWangYiNews
2、添加正則表達式提取器,
引用名稱為:queryText;
正則表達式為:“title”:”(.*?)”
模板:$1$
匹配數字:1
3、添加HTTP請求,搜狗或者百度等,路徑為:/?query=${queryText}
運行即可。
如果從標籤語言中,比如html或者xml,一般用xpath提取器即可,如果是文本的話,用正則表達式。
Jmeter添加聚合報告:
聚合報告可以看到發送請求的響應時間、吞吐量、錯誤率等
添加方法:右鍵測試計劃->添加->監聽器->聚合報告
8.10 Jmeter斷言
斷言意思就是判斷你程序響應結果是否正確。請求成功並不代表結果正確,所以增加斷言機制提高正確性。類似於LR中的檢查點。
HTTP請求中斷言主要包括:
- 斷言狀態的響應碼
- 斷言響應的內容
- 斷言響應內容的長度
- 斷言響應的時間
下面挨個講解如何添加斷言
8.10.1 響應碼和返回內容斷言
前面有添加一個搜狗首頁的HTTP請求,繼續拿這個請求舉例,或者拿百度請求舉例都一樣。在請求上點右鍵,添加->斷言->響應斷言:
出來如下圖,下圖我添加了一個要測試的模式,寫了一串字符串「搜狗搜索引擎 – 上網從搜狗開始」,Apply to選擇「Main Sample only」,要測試的響應字段選擇「響應文本」,模式匹配規則選擇「Substring」。這樣意思就是說我想判斷我的響應文本是否包含「搜狗搜索引擎 – 上網從搜狗開始」字符串。
詳細說明每一項內容:
響應斷言頁面,第一塊內容是名稱和注釋,跟其他頁面一樣,起個名字,寫個注釋。
Apply to(斷言應用的範圍):
- Main sample and sub-samples – 可以同時應用到主取樣器和子取樣器。
- Main sample only – 只能應用到主取樣器。
- Sub-samples only – 只能應用到子取樣器
- JMeter Variable Name to use –應用到指定名稱的變量(對指定的變量的值進行提取)
取樣器就是sampler,在線程組右鍵->添加->sampler->HTTP請求,這裡的sampler除了包含HTTP請求還包含很多其他的請求,FTP、JDBC等等,這些都叫取樣器。
我們這裡只添加了一個取樣器,沒有添加子取樣器,那就默認選中的Main sample only就可以了,不需要修改。
要測試的響應字段:
- 響應文本:察看結果樹中的響應數據,不包括Response Headers
- Document(text)和URL樣本不常用,暫不關心。
- 響應代碼:就是返回的響應碼,比如200、404
- 響應信息:即Response message: OK,在察看結果樹中可以看到。
- Response Headers:響應頭部。
- Ignore Status:一個請求有多項響應斷言時,忽略某一項斷言的響應結果,而繼續下一項斷言。即在某個斷言檢查前,先將取樣器的狀態設置為成功。注意,因為改設置會清除任何之前的斷言失敗的影響。所以,請確認只在第一個斷言設置該選項。
要測試的模式:
模式匹配規則在下面講,這裡先說要測試的模式,點擊下面的添加,就可以添加一個模式,這個模式可以是一個正則表達式,也可以是純文本,比如想要測試返回的信息是否包含「搜狗搜索引擎 – 上網從搜狗開始」,就寫「搜狗搜索引擎 – 上網從搜狗開始」這段文本即可。想測試返回的響應數據是否符合<html></html>格式,中間的內容是什麼不重要,那麼可以寫<html>.*</html>
模式匹配規則:
上面說了要測試的模式可以是正則表達式,也可以是純文本,那怎麼區分你寫的<html>.*</html>是正則表達式還是純文本呢,就是在模式匹配規則選擇。
- 包括:表示你用的是正則表達式,只要返回的響應內容包括你寫的測試模式即可。
- 匹配:表示你用到是正則表達式,需要返回的內容完全匹配你寫的測試模式。
- Equals:表示你寫的是文本,需要響應的內容和你寫的測試模式完全一樣。
- Substring:表示你寫的是文本,響應的內容包含你寫的測試模式的內容就可以。
否:就是不包含、不匹配的意思了。
在運行之前,先添加一個斷言結果:
HTTP請求的地方右鍵->添加->監聽器->斷言結果
ps:這個斷言結果也可以拉到線程組同級,運行的時候就會保存所有的線程組的斷言結果。
添加後,運行,查看結果。
下面我們改一下響應斷言的內容:改成判斷響應信息,要測試的模式寫小寫的ok。再看斷言結果:
這裡提示:Test failed: message expected to contain /ok/
就是說返回的內容不包含ok。
然後我們看察看結果樹裏面,也會有報錯信息,並且Response message就是OK呀,為什麼報錯說不包含ok呢,這就說明了「要測試的模式」是區分大小寫的,改成大寫的OK,再測試就可以了。
8.10.2 斷言返回內容的長度
在HTTP請求的地方右鍵->添加->斷言->Size Assertion
名稱和注釋不用說了,apply to在上面的斷言響應內容也說過了,「Response Size Field to Test」類似於上面講的「要測試的響應字段」
size to assert:這裡想要判斷返回的全部響應內容大於100位元組,就如圖那樣寫,想要判斷響應信息(不包含頭)等於1000位元組,就將比較類型選擇第一個,位元組大小改成1000即可。很簡單。
8.10.3 斷言響應時間
在HTTP請求的地方右鍵->添加->斷言->斷言響應時間
修改持續時間的值即可,注意單位是毫秒。
8.11Jmeter集合點
集合點:Jmeter內置組件之一,可以啟動多個用戶,讓多個用戶在同一刻去訪問服務器。模擬高並發,測試服務器性能。
比如我還是在訪問搜狗的HTTP請求中添加集合點,右鍵HTTP請求->添加->定時器->Synchronizing Timer
設置集合點的前提是要有多個線程數,我們把線程數設置為10。
Number of simulated Users to Group by:這個意思是幾個為一組,比如說我寫的3,那就是3個一組並發執行,先執行3個再執行3個再執行3個,最後剩下1個了,沒辦法組成3個,就會一直等待,到了超時時間自動退出。所以這裡我們盡量寫成和線程數一樣或者能被線程數整除的數字。
Timeout in milliseconds:就是超時時間,單位毫秒。默認寫的0,表示無限等待,不設置超時。
8.12 Jmeter函數
函數是Jmeter中封裝的最小單元,是一些功能實現,前面用過__counter(),就是一個函數。
參數使用的操作步驟還是1、打開函數助手;2、選擇函數;3、修改參數;4、生成並拷貝結果去使用。
下面是常用的函數以及用法:
__counter():計數器
__time():獲取時間的函數
__random():生成隨機數的函數
__CSVRead():讀取CSV文件的數據,和CSV DATA Set Config類似。
__setProperty():設置屬性
__property():獲取屬性
__time()函數:
${__time(yyyy/MM/dd HH/mm/ss,)}:取當前的年月日 時分秒
__time()的第一個參數可以:yyyy/MM/dd HH:mm:ss(年/月/日 時/分/秒)
也可以只有年月日,yyyy/MM/dd
或者只有時分秒,HH/mm/ss
格式也可以變化,比如yyyy.MM.dd,注意大小寫敏感。
第二個參數就是將當前的時間值存到哪個變量名中。
__Random()函數:
Random()函數是取一個隨機數的意思,有三個參數,前兩個參數是隨機數的取值範圍,第三個參數是變量名,將取到的隨機數放到哪個變量中。
__CSVRead()函數:
從CSV文件讀取一些數據,進行批量操作
上面講參數化的時候,說過多用戶同時登錄的操作,用__CSVRead()函數如果實現呢?
接口鏈接://api.apiopen.top/developerLogin
1、添加一個HTTP請求,線程數設置為3,新建一個文件保存接口需要的參數:
2、然後使用函數生成工具,找到__CSVRead()函數,
兩個參數,第一個參數是參數文本文件的路徑(必須是絕對路徑),第二個參數是列號,從0開始。
3、HTTP請求的Body Data改為:name=${__CSVRead(F:\jmeter\練習\參數\dataLogin.txt,0)}&passwd=${__CSVRead(F:\jmeter\練習\參數\dataLogin.txt,1)}
即可。
__CSVRead()函數和CSV DATA Set Config的區別:
一個是設置的線程組的屬性有區別,CSV DATA Set Config要設置循環次數,才會依次去找參數。__CSVRead()設置的是線程數
另外路徑,__CSVRead()可以寫相對路徑,CSV DATA Set Config只能寫絕對路徑。
__setProperty() 、__property() 屬性相關函數:
__setProperty() :設置屬性
__property():屬性獲取
前面講到關聯的地方,講了同一個線程組中,兩個HTTP請求有關聯的情況,比如第一個請求是請求百度首頁,第二個請求是在搜狗首頁,搜索第一個請求返回的title。
之前講的關聯的步驟大致是這樣的:
1、新建一個線程組,在該線程組新建HTTP請求,請求百度首頁,然後在該請求添加一個後置處理器,xpath提取器或者正則表達式提取器,提取出title。賦值給變量myTitle
2、在線程組內再新建一個HTTP請求,請求搜狗首頁,參數設置query=${myTitle}
這樣運行就可以了,不會報錯,但是如果這兩個HTTP請求是在不同的線程組內,這樣就不行了。會報如下錯誤:
myTitle參數沒有找到。如何改一下就可以了呢。
可以使用__setProperty()和__property()
步驟:
接着上面的步驟,第三步:
3、點擊函數助手,找到__setProperty(),第一個參數是屬性名稱,起個名字,第二個參數是你要把哪個參數設置為全局參數
4、右鍵「線程組_setProperty」,添加->Sampler->BeanShell Sampler,將上面生成的__setProperty()函數粘貼到這裡。
5、點擊函數助手,找到__property()函數,填寫屬性名稱,和setProperty()方法中的一致。
6、修改「線程組_setProperty2」中的「HTTP請求_搜狗」,將原來的${myTitle}修改為:${__property(out,,)},運行就不會報錯了。
共享數據(全局變量):
用上面的BeanShell的方式可以設置共享數據,運行完以後可以到工作台中去看到,右鍵工作台->添加->非測試元件->Property Display
運行完畢後,就可以看到這個值了。
雖然可以這樣設置全局變量,但是盡量少用,畢竟它是在你整個運行期間一直佔用內存的,即使這個線程組不用了,也不會釋放。
8.13 Jmeter分佈式
多台測試機協助完成測試任務,就稱為分佈式。
比如我現在需要測試1500個用戶的並發,用一台電腦測試,電腦可能會卡死,這時我就可以使用分佈式,分到3台電腦上,每台電腦測試500個。
分佈式實現思想:控制機分配任務->執行機,執行測試->將結果給控制機->控制機匯總結果。
8.13.1 Jmeter分佈式環境搭建
下面說明一下使用一台控制機,兩台執行機來測試,如何搭建環境。
首先要有3台電腦,如果沒有,可以暫時使用一台電腦模擬3台,模擬方式:
1、將Jmeter的環境複製3份出來(如果是真實的3台電腦就不需要這樣)
2、因為需要聯網進行數據交互,所以修改一下執行機的端口號(如果是真實的3台電腦也不需要修改端口號了,因為IP地址肯定不一樣)
修改方式:找到執行機A->bin目錄->jmeter.properties文件,用記事本打開它。往下拉找到「#server_port=1099」,將#去掉,修改端口號為5553(盡量大一些,省得跟其它衝突),執行機B的也同樣方式修改。
3、修改控制機的remote_hosts的值,告訴控制機需要控制哪台機器:
remote_hosts=127.0.0.1:5553,127.0.0.1:5554
(如果使用的是真實電腦測試,將電腦的IP放過來就可以)
ps:環境搭建完畢,注意重啟。
8.13.2 Jmeter分佈式測試
1、在控制機下編寫腳本
這裡我們就拿前面的關聯那個章節的腳本用吧,將線程數設置為20,添加聚合報告
2、啟動所有的執行機,執行機可以不需要界面,只啟動Jmeter服務即可(bin目錄下的jmeter-server.bat文件)
3、將測試任務分配給執行機(運行->遠程全部啟動)
測試結果在我們的控制機上就有了,點開聚合報告可以看到請求數剛好40,兩台機器,每台20.
8.14 Jmeter控制器
邏輯控制器:
實現取樣器的實現順序(分支或者循環,類似if或者for)
8.14.1 if控制器
比如測試計劃有三個請求,分別請求百度,京東,淘寶。定義一個變量,如果變量的值為百度,就請求百度,如果值為京東就訪問京東
操作步驟:
1、新建測試計劃,右鍵添加察看結果樹,添加用戶自定義變量(變量名為name,變量值為百度)
2、右鍵測試計劃->添加->Threads->線程組。
3、右鍵線程組->添加->邏輯控制器->如果(if)控制器,在條件一欄輸入:“${name}” == “百度“
4、右鍵點擊「如果(if)控制器」->添加->sampler->HTTP請求,輸入請求百度的信息。
5、運行,查看結果(會訪問百度首頁),修改自定義變量的名字,再次運行,查看結果(不會訪問百度首頁)
配置如圖:
8.14.2 循環控制器
比如要把百度請求循環5次:
步驟:
1、新建線程組->右鍵->添加->邏輯控制器->循環控制器
2、修改循環控制器的次數為5
3、右鍵循環控制器->添加->sampler->HTTP請求,填入百度信息。運行即可
線程組也可以直接設置循環次數,但是線程組設置的話,該線程組內所有的HTTP請求都會循環,循環控制器就比較靈活,可以單獨控制某一個請求。
8.14.3 forEach控制器
需求:在百度搜索中依次搜索」hello」,」python」,」測試」
可以用參數化,也可以用forEach控制器
步驟:
1、測試計劃右鍵->添加->配置元件->用戶自定義變量
這裡要注意變量名必須是一個變量名加下劃線的方式,forEach控制器會用到。
2、新建線程組,右鍵線程組->添加->邏輯控制器->ForEach控制器
變量前綴輸入自定義變量中的前綴,循環的開始結束範圍,我們有三個變量,所以寫[0,3),輸出變量名稱隨便寫,下面的勾選是默認的。
3、然後添加一個請求,請求百度首頁,上一步的輸出變量名稱,放到get方法的參數中。
8.15 Jmeter組件QPS
QPS:Query Per Second:吞吐量,每秒查詢率,每秒訪問服務器資源多少次。
10QPS=每秒訪問10次。
需求:一個用戶以10QPS的頻率訪問服務器,持續5s,查看服務器的平均響應時間。(一個用戶以每秒10次訪問服務器,持續訪問5s,查看響應時間)
操作步驟:
1、新建測試計劃,添加聚合報告,添加線程組,需求是一個用戶每秒訪問10次,訪問5秒,那麼總共就是訪問了50次,所以線程組的循環次數設置為50.
2、線程組添加HTTP請求,任意一個請求都可以。
3、右鍵HTTP請求->添加->定時器->Constant Throughput Timer。填寫Target throughput(in samples per minute),這個是填寫目標吞吐量,需求是10 QPS,單位是秒,這裡需要換算成每分鐘多少次,每秒10次也就是每分鐘600次。
Calculate Throughput base on:默認選中僅用在本線程組即可。
4、運行之後,查看聚合報告,聚合報告如下:
聚合報告各項意思:
Label:請求的名稱,就是我們在進行測試的http request sampler的名稱
Samples:總共發給服務器的請求數量,線程組中有一個用戶,循環50次,總共就50個請求
Average:默認情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,以Transaction 為單位顯示平均響應時間 ,單位是毫秒
Median: 50%用戶的請求的響應時間,中位數
90%Line:90%的請求的響應時間
95%Line:95%的請求的響應時間
99%Line:99%的請求的響應時間
Min:最小的響應時間
Max:最大的響應時間
Error%:錯誤率=錯誤的請求的數量/請求的總數
Throughput: 默認情況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以表示類似 LoadRunner 的 Transaction per Second 數 (這個就是QPS,我們設置的雖然是10,但是這裡顯示9.1,這樣也沒關係的,會有一點上下浮動)
Received KB/sec: 每秒從服務器端接收到的數據量
Send KB/sec:每秒發送的請求數
8.16 Jmeter其他組件
Test Fragment:可以封裝一些常用請求,當做函數來調用(調用方式可以通過模塊控制器調用,也可以通過include Controller)
HTTP mirror server:Jmeter內置服務器(幾乎不需要用到)
8.17 Jmeter各組件的執行順序
1、配置元件:配置一些全局參數
2、前置處理器:運行前需要處理的數據
3、定時器
4、取樣器(sampler)
5、後置處理器 :處理響應結果
6、斷言
7、監聽器
8.18 Jmeter 擴展組件–圖形監視器
不是Jmeter官方的,第三方開發的組件,即擴展組件
圖形監視器:監視服務器的內存、硬盤、CPU、網絡等。模擬生產狀態下,服務器狀態的測試。
客戶端,右鍵點擊線程組->添加->監聽器->jp@gc – PerfMon Metrics Collector
然後點擊Add Row,可以選擇監控CPU、IO、內存等,將前面的IP地址改為服務器IP地址,端口一般默認是4444.
如果監聽器中找不到「jp@gc – PerfMon Metrics Collector」,那去下面這個鏈接下載一下:JMeterPlugins-Standard、JMeterPlugins-Extras,然後解壓到這個路徑下:…\apache-jmeter-3.1\lib\ext
插件下載鏈接://jmeter-plugins.org/install/Install/
服務器端需要安裝ServerAgent,下載後將ServerAgent-2.2.1.jar上傳到被測服務器,解壓,進入目錄。如果是Windows環境,雙擊ServerAgent.bat啟動;linux環境執ServerAgent.sh啟動,默認使用4444端口,出現如下情況即服務端成功:
另外,
添加監控響應時間:右鍵點擊線程組->添加->監聽器->jp@gc – Response Times Over Time
監聽吞吐率即每秒的事務數:右鍵點擊線程組->添加->監聽器->jp@gc – Transactions per Second
都添加好之後,點擊運行,查看結果即可。
8.19 Jmeter組件:FTP
FTP:文件上傳和下載,即將文件上傳到服務器或者將服務器資源下載到本地。
首先保證服務器有上傳下載文件的功能,即有FTP服務器。
Jmeter中內置了FTP請求,可以通過此請求實現文件傳輸測試。
操作步驟:
1、右鍵線程組->添加->Sampler->FTP請求
2、填寫服務器名稱或IP,IP一般默認為21
3、 Local File:本地的文件路徑以及名稱;
Remote File:上傳後的文件名
Local File Contents:上傳的文件的內容,一般不用寫
get(RETR):下載文件
put(STOR):上傳文件
use Binary mode:使用二進制形式(如果是圖片、視頻等,就要勾選)
Save File in Response:是否保存文件
4、登錄配置:輸入FTP服務器的用戶名和密碼即可。
9 Jmeter項目實戰
9.1項目準備
從API文檔中提取出接口清單,接口清單包含:URL、提交的數據、響應的數據。
比如測試如下幾個接口:
1、開發者註冊
請求方式:POST
連接地址://api.apiopen.top/developerRegister
參數名 |
類型 |
必需 |
描述 |
示例 |
name |
string |
是 |
用戶名 |
peakchao |
passwd |
string |
是 |
密碼 |
123456 |
|
string |
否 |
郵箱,用戶反饋相關郵件通知。 |
|
示例: { “code”: 200, “message”: “成功!”, “result”: { “apikey”: “b9b3a96f7554e3bead2eccf16506c13e” } }
|
2、開發者登陸
請求方式:POST
鏈接地址://api.apiopen.top/developerLogin
參數名 |
類型 |
必需 |
描述 |
示例 |
name |
string |
是 |
用戶名 |
peakchao |
passwd |
string |
是 |
密碼 |
123456 |
返回示例: { “code”: 200, “message”: “成功!”, “result”: { “apikey”: “b9b3a96f7554e3bead2eccf16506c13e” } }
|
3、查看反饋
請求方式:POST
請求鏈接://api.apiopen.top/getFeedback
參數名 |
類型 |
必需 |
描述 |
示例 |
apikey |
string |
是 |
開發者key |
9648872f9aa08da137ce45fe1dda8279 |
page |
string |
否 |
頁碼 |
1 |
count |
string |
否 |
每頁返回數量 |
10 |
返回示例: { “code”: 200, “message”: “成功!”, “result”: [ { “id”: 2, “text”: “我覺得應該再增加個版本更新功能。“, “contact”: “[email protected]” } ] } |
9.2功能測試
功能測試就是測試各接口的基本功能是否正常運行,包括發送正確數據和錯誤數據。模擬用戶多樣性操作,檢測程序響應是否合理。
首先我們需要搭建功能測試框架,其次設計測試用例,再次參數化覆蓋測試用例。
1、搭建測試框架
1-1、新建測試計劃、添加線程組、添加察看結果樹
1-2、添加HTTP請求默認值,服務器名稱或IP填寫:api.apiopen.top;協議:https;encoding:utf-8
1-3、添加HTTP請求
{“code”:200,”message”:”成功!”,”result”:{“apikey”:”84ed5f753c3243acf59f1fa16ba02dc8″,”email”:null}}
2、設計測試用例
比如註冊功能,我們設計測試用例如下圖:
3、參數化覆蓋
新建一個txt文件,將用例對應的參數寫入。線程組右鍵添加->配置元件->CSV Date,填寫參數txt的路徑等信息。設置循環次數,運行查看結果即可。
9.3自動化測試
上面講到的是功能測試,功能測試就需要自己手動去寫參數,檢查結果。自動化就簡單很多,自動化測試盡量遵循以下原則:
- 只測試程序的主要功能以及一些經常被複用的功能,並不是所有用例都自動化。(自動化一般是在功能測試之後測試,比如後期升級了一些新功能,原來的功能不需要都測試,執行自動化測試即可)
- 自動化測試只考慮正向數據(逆向數據太多並且各種組合複雜,程序自動生成有些困難,在功能測試中測試到即可)
- 自動化測試完畢,數據庫必須恢復到測試之前的狀態(否則會出現問題,比如註冊過的用戶,再次跑自動化腳本,就不能再註冊了)
- 線程組之間盡量不要有關聯(即某個請求的輸入需要另外一個請求的輸出),這樣可以單獨測試某一個功能。
操作步驟:
1、搭建框架:添加查看結果樹、http請求默認值、添加setup線程組和teardown線程組。setup中添加http請求,請求註冊。tearDown中刪除註冊的數據。
2、HTTP請求中的bodyData中寫入鍵值對,值通過__counter函數生成。
bodyData的最終結果:
name=name_${__counter(FALSE,)}&passwd=pwd_${__counter(FALSE,)}&email=67609${__counter(FALSE,)}@qq.com
3、在HTTP請求中添加斷言,斷言內容就寫apikey即可。
4、tearDown中添加刪除。刪除一般是通過id或者name來刪除,這裡我們需要獲取到HTTP請求中的name,或者結果的apikey,根據這些來刪除內容。
添加後置處理器,正則表達式處理器,將結果的apikey獲取到:
通過__setProperty方法將myApiKey設置為全局變量:
添加BeanShell Sampler,執行__setProperty方法。
在tearDown中,刪除剛剛新增的用戶,這個API文檔沒有刪除的功能,所以大概說一下應該如何刪。在tearDown中新增一個HTTP請求,使用函數助手,找到__property方法,將全局變量獲取到。
在將新增的請求修改bodyData參數:
apikey=${__property(out,,)}
接下來可以添加普通線程組,測試登錄、查詢等功能。
如果需要依次測試線程組,記得勾選「獨立運行每個線程組」。
9.4性能壓力測試
模擬多種場景測試程序的響應時間、出錯率等
參數化:盡量避免從外部讀取參數(測試性能,盡量避免影響性能測試結果的事件),直接通過固定參數+函數形式(__counter())
察看結果樹:只保留最外層的察看結果樹
報告:最外層添加聚合報告,察看結果更方便
線程組:增刪改查分別放到不同線程組,盡量不放到一個線程組內,方便對單個請求做測試
分佈式:如並發量比較大,採用分佈式測試
新增/刪除:新增和刪除接口,建議不要採用時間模式(定時器)來壓測,直接使用線程數和循環。(新增和刪除高並發情況比較少)
需求1:在300秒內啟動100個用戶,每個用戶訪問10次服務器,平均響應時間在10ms內,錯誤率為0.
300秒內,是設置線程組的線程屬性Ramp-Up Period值;100個用戶表示:線程數為100;每個用戶訪問10次:循環次數10;
需求2:100個用戶同時訪問服務器,平均響應時間為10s內,錯誤率0.
100個用戶同時:線程數為100,然後設置集合點:添加->定時器->Synchronizing Timer,分組數為100
需求3:100個用戶,以20QPS的頻率訪問服務器資源,持續10s,要求平均響應時間為30s內,錯誤率0.
100個用戶:線程數為100;20QPS:表示一個用戶20次/秒去訪問服務器(添加->定時器->Constant Throughput Timer);持續10s,那麼循環次數應該為20*10=200
10 生成html測試報告
Jmeter生成html測試報告有兩種格式:
格式1:DOS命令行下執行測試腳本,生成HTML測試報告
cmd進入到你的需要測試的腳本路徑下,輸入一下命令:
Jmeter -n -t 測試計劃_實戰.jmx -l test.txt -e -o ./outHtml
-n:無圖形界面執行Jmeter
-t:後面跟的腳本文件
測試計劃_實戰.jmx:是需要測試的腳本文件名
-l:後跟日誌文件,日誌文件後綴只能是.txt或者.jtl或者無後綴。
-o:輸出到哪裡
./outHtml:輸出html到當前路徑下的outHtml文件夾中。
格式2:先使用Jmeter運行測試腳本,生成日誌文件,再將日誌文件轉為html格式測試報告。
步驟1.在聚合報告中,有一個「所有數據寫入一個文件」,點擊瀏覽,輸入一個文件名(輸入文件名,點確定後會報錯,不用管),運行腳本。
步驟2.進入到日誌.txt這個目錄,打開cmd,輸入命令:
Jmeter -g 日誌.txt -o ./報告
-g:關聯日誌文件
-o:輸出