接口測試雖然作為版本的一環,但是也是有一套完整的體系,有接口的功能測試、性能測試、安全測試;同時,由於接口的特性,接口的自動化低成本高收益的,使用一些開源工具或一些輕量級的方法,在測試用例開發的成本不高的情況下能去的比較好的測試效果。
開源測試工具Jmeter可以承擔接口請求、結果解析和斷言的工作,可以作為輕量級接口自動化的實現手段,對於開發能力不強或規模不大的團隊也能接受。Jmeter可以在協議層實現基本的功能,包括接口訪問、參數化構造、返回值斷言和數據庫訪問,基本足夠滿足一個輕量級的接口自動化框架的功能。
我們定義一個如下的接口:
入參:
SearchKeys: 我親愛的你, //用戶輸入的查詢數據,不能為空 PageSize: 10,//分頁的Page大小,默認入參為10,前端傳入 PageIndex: 1,//分頁的PageIndex,第幾頁,前端傳入 OrderBy: 0,//排序條件:0-銷量,1-價格,由前端傳入,前端的通過單選控件實現 Method: ASC//排序方式:ASC-升序,DESC-降序,前端通過單選控件實現
返回值:
{
"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表一張表中直接查詢到對應數據,查詢結果進行實例化為Json處理后返回,對應字段均存在Commodity表中,對應數據如下:
測試的思路為,按照實現的業務邏輯,取除了Thumb的字段作為斷言字段,並構造SQL進行查詢,如果查詢到對應數據,則證明接口返回通過。具體構造的SQL如下:
SELECT * FROM Commodity WHERE CommodityID = '03445f1e-ba55-421d-80fa-1777741bb57d' AND CategoryID = 2 AND CommodityName = '我親愛的你大事不妙' AND SalePrice = 13.0 AND SaleAmount = 130
那么我們需要進行的工作,按照順序即為訪問接口-獲取返回值-解析回參-構造SQL-查詢-判斷結果。整個過程,都能通過Jmeter進行實現,上手起來也比較容易。具體操作過程如下:
一.Http請求:
在測試計划下新增一個線程組,並在線程組下新增一個http請求:
添加Http請求以后,按照下圖所示可以設置請求,需要注意的是如果要輸入協議,就不要在服務器名稱或IP前加http或https了,否則會直接訪問到http://http://上去 :
一般來說,接口在訪問的時候都需要在驗證Header中的身份信息,Jmeter中提供了頭信息管理的功能:添加-配置元件-Http請求頭管理器:
使用結果樹查看接口返回值:添加-監聽器-查看結果樹,可以明確看到接口的返回報文:、
入參:
PS:Jmeter記錄的入參會進行自動URL編碼處理,有需要的可以自己做URL解碼即可
回參:
這樣,我們就完成了一個基本的Http請求的訪問。
二.實現參數化
想必大家注意到了,我們之前在通過Http請求構造入參時,對SearchKey這個入參並沒有填入之前構造的參入,而是使用了${Key},在Jmeter中,參數的傳入就是通過${參數名}的方式進行的。
一般來說,我們測試過程中不一定能保證數據的穩定或需要構造多個不同的參數進行處理 ,很多時候需要考慮做參數化的處理,一定程度上實現動態構造。Jmeter中提供了通過讀取本地文件進行參數化的功能:
讀取配置文件中的參數:在添加的http請求下添加配置元件-CSV DATA SET CONFIG:
添加CSV 數據配置器后,按照如下設置即可設置參數:
需要調用的時候, 直接使用 ${參數名} 進行調用即可。
三.使用JSON Extractor處理返回值中的Json
通常來說,現在大部分的接口返回值都序列化處理成為Json格式進行返回。雖然使用正則獲取返回值也可以,但是Jmeter提供了一個更加方便的插件:JSON Extractor處理Json。
下載插件https://jmeter-plugins.org/wiki/JSONPathExtractor/,下載解壓后,把lib里的兩個jar拷貝到jmeter的lib目錄,lib/ext里面的兩個jar拷貝到jmeter的lib/ext目錄,重啟jmeter即可。
我們以處理以下Json中的CommodityID為例,來獲得對應的值:
{ "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數組中,所以Json路徑為data[0]["CommodityID"],需要添加Json數組中的索引值 。我們在Json Path Expreeions填入 $.data[0].[CommodityID],這樣我們就取出了CommodityID的值;在后續之后,我們就可以通過${CommodityID}的方式調用取出的值。
如法炮制,我們可以取出所有的斷言字段。
按照之前的分析,我們可以構造使用斷言字段構造一條SQL訪問數據庫,如果所有的字段都返回正確,那么查詢結果應該是不為空的;按照如下的格式,我們就可以構造出我們所需要的斷言SQL了:
SELECT * FROM Commodity WHERE CommodityID = '${CommodityID}' AND CategoryID = ${CategoryID} AND CommodityName = '${ CommodityName }' AND SalePrice = ${SalePrice} AND SaleAmount = ${SaleAmount}
接下來,我們只需要使用Jmeter執行該SQL,並對返回結果進行驗證,即可實現這個輕量級的接口自動化。
四.使用JDBC訪問MySql:
Jmeter提供了JDBC的插件進行數據庫訪問,但是在此之前,我們需要下載MySql的JDBC驅動包。一般來說,JDBC驅動包版本需要和數據庫版本匹配,否則可能因為驅動的關系導致出錯。
1.在測試計划下添加,導入對應的JDBC驅動包:
2.添加-配置元件,JDBC Connection Configuration
具體設置如下所示,藍色框線內的部分一般可以直接使用默認設置,紅色框線內需要我們手動填寫:
底部的數據庫連接字符串填寫如下:
DataBaseURL: 數據庫連接字符串,使用MySql的同學按照以下格式填寫即可:
jdbc:mysql://localhost:2000/AutoTest?useUnicode=true&characterEncoding=utf8 jdbc:mysql://數據庫服務器地址:端口號/數據庫名,在測試過程中遇到過因為編碼問題,查詢條件中的中文字符串不生效導致斷言結果錯誤,所以需要添加編碼方式,設置的與數據庫本身的編碼方式相同即可,我使用的是UTF-8 JDBC Driver Class:直接填寫com.mysql.jdbc.Driver即可 UserName/Password:連接數據庫的賬號和密碼
3.使用JDBC Request進行數據庫操作:添加-Sampler-JDBC Request
JDBC的操作比較簡單,我們只需要通過參數名調用設置的JDBC Connection Configuration,然后輸入要執行的SQL即可:
添加一個查看結果樹,我們就能看到SQL的執行結果了:
構造的SQL:
查詢的結果:
五.使用斷言驗證返回結果:
Jmeter提供了豐富的斷言功能,可以用於檢查響應數據與預期是否一致,可以用作接口自動化測試的結果校驗。對於一次請求,如果通過的話,斷言結果中只會打印一行請求的名稱;如果失敗,則除了請求的名稱外,還會有一行失敗的原因(不同類型的斷言,結果不同),也可以幫助我們定位返回值錯誤的內容。此外,一個Sampler可以添加多個斷言,根據你的檢查需求來添加相應的斷言,當Sampler下所有的斷言都通過了,那么才算request成功。
那么針對這個用例,我們可以把問題簡單化:既然數據庫返回的查詢結果查詢到數據就算測試通過,那么JDBC Request的返回值中是一定有我們的傳入的參數的,那么我們就可以直接使用基本的文本工具來進行斷言的驗證,返回結果包含一個或幾個斷言字段,那么就能斷言測試通過了:
添加-斷言-響應斷言,響應文本中包括關鍵的參數即可:
那么如果返回結果正確,斷言測試通過,結果樹中只有一條返回的數據:
如果返回結果錯誤,那么斷言測試失敗,結果樹中會新增一行失敗的原因:
我們構造一個錯誤的場景,將返回字段中的SaleAmount(銷量)返回為SalePrice(價格),那么我們的查詢結果為空,返回的斷言結果就會是失敗的,因為返回值中沒有包括傳入的CommodityID:
斷言失敗,因為沒有匹配到對應的CommodityID數據。
至此,我們就使用Jmeter完成了一個輕量級的接口自動化測試的用例構造,構造好的用例可以用於后續版本的回歸測試。