Jmeter笔记(Ⅱ)使用Jmeter实现轻量级的接口自动化测试
接口測試雖然作為版本的一環(huán),但是也是有一套完整的體系,有接口的功能測試、性能測試、安全測試;同時,由于接口的特性,接口的自動化低成本高收益的,使用一些開源工具或一些輕量級的方法,在測試用例開發(fā)的成本不高的情況下能去的比較好的測試效果。
?開源測試工具Jmeter可以承擔(dān)接口請求、結(jié)果解析和斷言的工作,可以作為輕量級接口自動化的實現(xiàn)手段,對于開發(fā)能力不強(qiáng)或規(guī)模不大的團(tuán)隊也能接受。Jmeter可以在協(xié)議層實現(xiàn)基本的功能,包括接口訪問、參數(shù)化構(gòu)造、返回值斷言和數(shù)據(jù)庫訪問,基本足夠滿足一個輕量級的接口自動化框架的功能。
?
我們定義一個如下的接口:
入?yún)?#xff1a;
SearchKeys: 我親愛的你, //用戶輸入的查詢數(shù)據(jù),不能為空PageSize: 10,//分頁的Page大小,默認(rèn)入?yún)?0,前端傳入PageIndex: 1,//分頁的PageIndex,第幾頁,前端傳入OrderBy: 0,//排序條件:0-銷量,1-價格,由前端傳入,前端的通過單選控件實現(xiàn)Method: ASC//排序方式:ASC-升序,DESC-降序,前端通過單選控件實現(xiàn)返回值:
{
????"data":
????[
????????{
????????????"CommodityID":"03445f1e-ba55-421d-80fa-1777741bb57e",
????????????"CategoryID":2,
????????????"CommodityName":"雙人床solo抽泣",
????????????"Thumb":"http://img4.imgtn.bdimg.com/it/u=1924829949,2185178641&fm=27&gp=0.jpg",
????????????"SalePrice":16.0,
????????????"SaleAmount":13
????????}
????],
????"records":1,
????"status":true,
????"message":""
}
代碼處理邏輯:按照分頁的頁面和大小,從Commodity表一張表中直接查詢到對應(yīng)數(shù)據(jù),查詢結(jié)果進(jìn)行實例化為Json處理后返回,對應(yīng)字段均存在Commodity表中,對應(yīng)數(shù)據(jù)如下:
測試的思路為,按照實現(xiàn)的業(yè)務(wù)邏輯,取除了Thumb的字段作為斷言字段,并構(gòu)造SQL進(jìn)行查詢,如果查詢到對應(yīng)數(shù)據(jù),則證明接口返回通過。具體構(gòu)造的SQL如下:
SELECT* FROMCommodity WHERECommodityID = '03445f1e-ba55-421d-80fa-1777741bb57d' AND CategoryID = 2 AND CommodityName = '我親愛的你大事不妙' AND SalePrice = 13.0 AND SaleAmount = 130?
那么我們需要進(jìn)行的工作,按照順序即為訪問接口-獲取返回值-解析回參-構(gòu)造SQL-查詢-判斷結(jié)果。整個過程,都能通過Jmeter進(jìn)行實現(xiàn),上手起來也比較容易。具體操作過程如下:
?
?一.Http請求:
在測試計劃下新增一個線程組,并在線程組下新增一個http請求:
?
添加Http請求以后,按照下圖所示可以設(shè)置請求,需要注意的是如果要輸入?yún)f(xié)議,就不要在服務(wù)器名稱或IP前加http或https了,否則會直接訪問到http://http://上去 :
一般來說,接口在訪問的時候都需要在驗證Header中的身份信息,Jmeter中提供了頭信息管理的功能:添加-配置元件-Http請求頭管理器:
?
使用結(jié)果樹查看接口返回值:添加-監(jiān)聽器-查看結(jié)果樹,可以明確看到接口的返回報文:、
入?yún)?#xff1a;
PS:Jmeter記錄的入?yún)M(jìn)行自動URL編碼處理,有需要的可以自己做URL解碼即可
回參:
?
這樣,我們就完成了一個基本的Http請求的訪問。
?二.實現(xiàn)參數(shù)化
想必大家注意到了,我們之前在通過Http請求構(gòu)造入?yún)r,對SearchKey這個入?yún)⒉]有填入之前構(gòu)造的參入,而是使用了${Key},在Jmeter中,參數(shù)的傳入就是通過${參數(shù)名}的方式進(jìn)行的。
一般來說,我們測試過程中不一定能保證數(shù)據(jù)的穩(wěn)定或需要構(gòu)造多個不同的參數(shù)進(jìn)行處理 ,很多時候需要考慮做參數(shù)化的處理,一定程度上實現(xiàn)動態(tài)構(gòu)造。Jmeter中提供了通過讀取本地文件進(jìn)行參數(shù)化的功能:
讀取配置文件中的參數(shù):在添加的http請求下添加配置元件-CSV DATA SET CONFIG:
?
添加CSV?數(shù)據(jù)配置器后,按照如下設(shè)置即可設(shè)置參數(shù):
需要調(diào)用的時候,?直接使用 ${參數(shù)名}?進(jìn)行調(diào)用即可。
?
?
?
三.使用JSON Extractor處理返回值中的Json
通常來說,現(xiàn)在大部分的接口返回值都序列化處理成為Json格式進(jìn)行返回。雖然使用正則獲取返回值也可以,但是Jmeter提供了一個更加方便的插件:JSON Extractor處理Json。
下載插件https://jmeter-plugins.org/wiki/JSONPathExtractor/,下載解壓后,把lib里的兩個jar拷貝到j(luò)meter的lib目錄,lib/ext里面的兩個jar拷貝到j(luò)meter的lib/ext目錄,重啟jmeter即可。
我們以處理以下Json中的CommodityID為例,來獲得對應(yīng)的值:
{"data":[{"CommodityID":"03445f1e-ba55-421d-80fa-1777741bb57e","CategoryID":2,"CommodityName":"雙人床solo抽泣","Thumb":"http://img4.imgtn.bdimg.com/it/u=1924829949,2185178641&fm=27&gp=0.jpg","SalePrice":16.0,"SaleAmount":13}],"records":1,"status":true,"message":""}?注意到CommodityID在Json數(shù)組中,所以Json路徑為data[0]["CommodityID"],需要添加Json數(shù)組中的索引值 。我們在Json?Path?Expreeions填入 $.data[0].[CommodityID],這樣我們就取出了CommodityID的值;在后續(xù)之后,我們就可以通過${CommodityID}的方式調(diào)用取出的值。
?
如法炮制,我們可以取出所有的斷言字段。
按照之前的分析,我們可以構(gòu)造使用斷言字段構(gòu)造一條SQL訪問數(shù)據(jù)庫,如果所有的字段都返回正確,那么查詢結(jié)果應(yīng)該是不為空的;按照如下的格式,我們就可以構(gòu)造出我們所需要的斷言SQL了:
SELECT*FROMCommodity WHERECommodityID = '${CommodityID}' AND CategoryID = ${CategoryID} AND CommodityName = '${ CommodityName }' AND SalePrice = ${SalePrice} AND SaleAmount = ${SaleAmount}接下來,我們只需要使用Jmeter執(zhí)行該SQL,并對返回結(jié)果進(jìn)行驗證,即可實現(xiàn)這個輕量級的接口自動化。
?
四.使用JDBC訪問MySql:
Jmeter提供了JDBC的插件進(jìn)行數(shù)據(jù)庫訪問,但是在此之前,我們需要下載MySql的JDBC驅(qū)動包。一般來說,JDBC驅(qū)動包版本需要和數(shù)據(jù)庫版本匹配,否則可能因為驅(qū)動的關(guān)系導(dǎo)致出錯。
1.在測試計劃下添加,導(dǎo)入對應(yīng)的JDBC驅(qū)動包:
?
2.添加-配置元件,JDBC?Connection?Configuration
?
具體設(shè)置如下所示,藍(lán)色框線內(nèi)的部分一般可以直接使用默認(rèn)設(shè)置,紅色框線內(nèi)需要我們手動填寫:
?
底部的數(shù)據(jù)庫連接字符串填寫如下:
DataBaseURL:?數(shù)據(jù)庫連接字符串,使用MySql的同學(xué)按照以下格式填寫即可:
jdbc:mysql://localhost:2000/AutoTest?useUnicode=true&characterEncoding=utf8 jdbc:mysql://數(shù)據(jù)庫服務(wù)器地址:端口號/數(shù)據(jù)庫名,在測試過程中遇到過因為編碼問題,查詢條件中的中文字符串不生效導(dǎo)致斷言結(jié)果錯誤,所以需要添加編碼方式,設(shè)置的與數(shù)據(jù)庫本身的編碼方式相同即可,我使用的是UTF-8 JDBC Driver Class:直接填寫com.mysql.jdbc.Driver即可 UserName/Password:連接數(shù)據(jù)庫的賬號和密碼3.使用JDBC?Request進(jìn)行數(shù)據(jù)庫操作:添加-Sampler-JDBC?Request
?
JDBC的操作比較簡單,我們只需要通過參數(shù)名調(diào)用設(shè)置的JDBC?Connection?Configuration,然后輸入要執(zhí)行的SQL即可:
?
添加一個查看結(jié)果樹,我們就能看到SQL的執(zhí)行結(jié)果了:
構(gòu)造的SQL:
?
查詢的結(jié)果:
?
五.使用斷言驗證返回結(jié)果:
Jmeter提供了豐富的斷言功能,可以用于檢查響應(yīng)數(shù)據(jù)與預(yù)期是否一致,可以用作接口自動化測試的結(jié)果校驗。對于一次請求,如果通過的話,斷言結(jié)果中只會打印一行請求的名稱;如果失敗,則除了請求的名稱外,還會有一行失敗的原因(不同類型的斷言,結(jié)果不同),也可以幫助我們定位返回值錯誤的內(nèi)容。此外,一個Sampler可以添加多個斷言,根據(jù)你的檢查需求來添加相應(yīng)的斷言,當(dāng)Sampler下所有的斷言都通過了,那么才算request成功。
那么針對這個用例,我們可以把問題簡單化:既然數(shù)據(jù)庫返回的查詢結(jié)果查詢到數(shù)據(jù)就算測試通過,那么JDBC Request的返回值中是一定有我們的傳入的參數(shù)的,那么我們就可以直接使用基本的文本工具來進(jìn)行斷言的驗證,返回結(jié)果包含一個或幾個斷言字段,那么就能斷言測試通過了:
添加-斷言-響應(yīng)斷言,響應(yīng)文本中包括關(guān)鍵的參數(shù)即可:
?
那么如果返回結(jié)果正確,斷言測試通過,結(jié)果樹中只有一條返回的數(shù)據(jù):
?
如果返回結(jié)果錯誤,那么斷言測試失敗,結(jié)果樹中會新增一行失敗的原因:
我們構(gòu)造一個錯誤的場景,將返回字段中的SaleAmount(銷量)返回為SalePrice(價格),那么我們的查詢結(jié)果為空,返回的斷言結(jié)果就會是失敗的,因為返回值中沒有包括傳入的CommodityID:
?
斷言失敗,因為沒有匹配到對應(yīng)的CommodityID數(shù)據(jù)。
至此,我們就使用Jmeter完成了一個輕量級的接口自動化測試的用例構(gòu)造,構(gòu)造好的用例可以用于后續(xù)版本的回歸測試。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/rd-ddddd/p/9578242.html
總結(jié)
以上是生活随笔為你收集整理的Jmeter笔记(Ⅱ)使用Jmeter实现轻量级的接口自动化测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生成跨语言的类型声明和接口绑定的工具(D
- 下一篇: 算法:高精度阶乘