使用jmeter實(shí)現(xiàn)HTTP協(xié)議接口測(cè)試
1、工具準(zhǔn)備
抓包工具:
fiddler(http協(xié)議抓包神器)
鏈接:https://pan.baidu.com/s/1cjHHJWLkvdNGCwe923Auxg
提取碼:927r
2、知識(shí)準(zhǔn)備
HTTP協(xié)議
HTTP協(xié)議是一種無狀態(tài)協(xié)議,主要包含請(qǐng)求(request)和響應(yīng)(response)兩大部分
請(qǐng)求(request)
當(dāng)瀏覽器向Web服務(wù)器發(fā)出請(qǐng)求時(shí),它向服務(wù)器傳遞了一個(gè)數(shù)據(jù)塊,也就是請(qǐng)求信息,HTTP請(qǐng)求信息由3部分組成:
- 請(qǐng)求方法 URI協(xié)議/版本
- 請(qǐng)求頭(Request Header)
- 請(qǐng)求正文(請(qǐng)求頭和請(qǐng)求正文之間是一個(gè)空行,這個(gè)行非常重要,它表示請(qǐng)求頭已經(jīng)結(jié)束,接下來的是請(qǐng)求正文)

HTTP請(qǐng)求中,最常用的方法是get和post請(qǐng)求,兩者最基本的區(qū)別如下:
- get請(qǐng)求的參數(shù)一般放在請(qǐng)求行中,常用于向服務(wù)器獲取資源, 以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如:http://192.XXX.XX.XXX:XXXX/supplychainfinance-audit/orderManege/getOrdersList?currentPage=1&pageSize=10; POST請(qǐng)求的參數(shù)需要放在body里,常用于向服務(wù)器提交表單
- GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒有限制
響應(yīng)(response)
響應(yīng)即為接口返回的信息,包含3部分:
- 狀態(tài)行(包含協(xié)議/版本 狀態(tài)碼)
- 響應(yīng)頭
- 響應(yīng)體(常見的響應(yīng)格式有HTML、json、xml)

jmeter中各元件作用域及執(zhí)行順序
請(qǐng)參考: http://www.cnblogs.com/imyalost/p/5971168.html
3、使用jmeter發(fā)送HTTP請(qǐng)求
可以通過點(diǎn)擊optitions->choose languaage->chinese(simplified)切換語言為簡(jiǎn)體中文

1. 添加線程組

通過對(duì)線程組屬性配置,可以控制并發(fā)數(shù)、循環(huán)次數(shù)、持續(xù)時(shí)間等

2. 添加HTTP請(qǐng)求
添加cookie管理器
添加HTTP Cookie 管理器后,jmeter會(huì)自動(dòng)記錄并保存服務(wù)端返回的cookie信息,并且在后面所有請(qǐng)求中自動(dòng)添加cookie。每個(gè)線程的cookie都是獨(dú)立的。

線程組->右鍵,添加->取樣器->HTTP請(qǐng)求

添加HTTP信息頭管理器

由于systoken用于保存登陸信息、subSysClientid為所測(cè)試系統(tǒng)特有字段,需單獨(dú)添加信息頭

請(qǐng)求內(nèi)容填寫
由于Content-Type: application/x-www-form-urlencoded; charset=UTF-8;所以此處請(qǐng)求體選用表單形式填寫

若Content-Type: application/json則表示請(qǐng)求格式為json格式,需添加HTTP信息頭管理器,請(qǐng)求內(nèi)容填寫在消息體數(shù)據(jù)中:


3. 添加響應(yīng)斷言
斷言可以用于判斷服務(wù)器的返回是否是期望結(jié)果,由于被測(cè)試系統(tǒng)在請(qǐng)求成功后都會(huì)返回"message":"成功",所以斷言選擇“成功”
模式匹配規(guī)則中各項(xiàng)的含義:
??包括:返回結(jié)果包括你指定的內(nèi)容,支持正則匹配
??匹配:返回結(jié)果與你指定斷言完全一致,支持正則匹配
??Equals:返回結(jié)果與你指定斷言完全一致,不支持正則匹配
??SubString:與 “包括”差不多,都是指返回結(jié)果包括你指定的內(nèi)容,但是subString不支持正則字符串
??否:就相當(dāng)于取反。 如果上面斷言結(jié)果為true,勾選“否”后,最終斷言結(jié)果為false。如果上面斷言結(jié)果為false,勾選“否”后,則最終斷言結(jié)果為 true
??或者:如果測(cè)試模式下添加多個(gè)判斷條件,只要有一個(gè)為true,則斷言結(jié)果為true


4. 添加后置處理器
由于后續(xù)請(qǐng)求都會(huì)用到登陸返回的systoken,所以需要將其提取出來,作為下一個(gè)請(qǐng)求的參數(shù)(使用方式 ${Token})。
Content-Type: application/json;charset=UTF-8表示響應(yīng)的數(shù)據(jù)格式為json格式,所以添加json提取器



??json表達(dá)式簡(jiǎn)介
??響應(yīng)原文:`{"code":1,"sysToken":"platform-XXXXXXXXXXXXX-20190001","message":"成功"}`
??匹配內(nèi)容:platform-XXXXXXXXXXXXX-20190001
??json表達(dá)式:$.sysToken或者sysToken($表示根路徑)
??響應(yīng)原文:`{"code": 1,"data":{"sysToken": "platform-XXXXXXXXXXXXX-20190001","message": "成功"}}`
??匹配內(nèi)容:platform-XXXXXXXXXXXXX-20190001
??json表達(dá)式:$.data.sysToken或者data.sysToken($表示根路徑)
??響應(yīng)原文:`{"code": 1,"data":[{"sysToken": "platform-XXXXXXXXXXXXX-20190001","message": "成功"}]}`
??匹配內(nèi)容:platform-XXXXXXXXXXXXX-20190001
??json表達(dá)式:與前一個(gè)相比多了[],則表示為數(shù)組,所以需要用$.data[0].sysToken或者data[0].sysToken($表示根路徑)
5. 運(yùn)行并查看結(jié)果
在線程組下添加“查看結(jié)果樹”,可以查看該線程組下所有請(qǐng)求的結(jié)果

最終運(yùn)行后的結(jié)果如下:
請(qǐng)求:


響應(yīng):


4. 結(jié)構(gòu)優(yōu)化
1. 添加HTTP請(qǐng)求默認(rèn)值
添加方式:右鍵->添加->配置元件->HTTP請(qǐng)求默認(rèn)值
在同一個(gè)項(xiàng)目中,請(qǐng)求的協(xié)議、ip、端口號(hào)、編碼方式基本一致,添加“HTTP請(qǐng)求默認(rèn)值”后有效避免了每添加一個(gè)請(qǐng)求后都需要重新填寫這些字段

2. 參數(shù)化
參數(shù)化可以有效實(shí)現(xiàn)測(cè)試數(shù)據(jù)與腳本分離,提高腳本可用性
從csv文件中讀取測(cè)試數(shù)據(jù),需添加csv數(shù)據(jù)文件設(shè)置(右鍵->添加->配置元件->csv數(shù)據(jù)文件設(shè)置),添加完成后,在請(qǐng)求中使用${username}、${fullname}、${permission}即可獲取文件中的值
