如何使用 JMeter 實現 API 接口自動化測試?

因爲segmentfault編輯器上傳圖片錯誤,小編試過多種方式試圖拯救,仍是未能成功,因此如要看完整文章請至http://t.cn/R8njjaT

miaomiao 高級測試工程師
7年測試工做經驗,參與產品的功能/自動化/性能測試;目前負責 Red.Q、Warden 產品的質量保障工做。

背景

Red.Q 是豈安爲客戶提供業務風險情報服務的產品。API 是該產品的一個模塊,客戶能夠經過輸入不一樣的參數獲取不一樣的風險數據。
在測試該 API 的過程,就是對這個接口的測試,不一樣的 Token 對應不一樣的訂單,對應不一樣的標籤,對應不一樣的返回。本文主要介紹在測試該接口時總結的一些場景用法。正則表達式

工具介紹

目前接口測試的工具,例如 Postman/SoupUI,等大多都提供了接口的發送、響應結果的獲取、以及針對響應結果的斷言,均可以用來作接口的自動化測試,咱們目前選用的工具是 JMeter,各類工具大同小異。如對 JMeter 工具不瞭解的同窗請戳 Bioneck 分享的 Jmeter+Jenkins 文章。
實現本次自動化測試用到的組件介紹 :數據庫

  1. Threads--> 線程組
  2. 配置元件--> HTTP 請求默認值
  3. 配置元件--> JDBC Connection Configuration
  4. 配置元件--> HTTP 信息頭管理器
  5. 定時器--> 高斯定時器
  6. Sampler--> HTTP 請求
  7. Sampler--> JDBC Request
  8. 後置處理器--> 正則表達式提取器
  9. 斷言--> BeanShell 斷言
  10. 斷言--> 響應斷言
  11. 監聽器--> 查看結果樹

測試場景與測試實現

1使用Token調用API

一個最簡單的 HTTP 請求,由 host+ 端口 + 路徑 + 參數構成,調用 API 的設置以下:segmentfault

1) HTTP 請求默認值,設置好服務器 IP 和端口,全部做用範圍內的 HTTP 請求能夠再也不指定服務器

bigsec

2) HTTP 請求,設置路徑和參數異步

  • Red.Q 的請求是 GET 方法,參數能夠加入 Parameters ; 若是是 POST 方法的 JSON body,參數能夠放入 Body Data 內。
  • POST 請求時,參數內有中文,須要設定 Content encoding 爲 utf8

bigsec

3) 調用完成後,經過查看結果樹查看調用結果。編輯器

bigsec

2Mock-server 的機制

須要每次請求時,把 request_id 放到 Header 內,隨請求一塊兒調用(HTTP 信息頭管理器)。
1) HTTP 信息頭管理器
將 HTTP 信息頭管理器放入 HTTP 請求下,該 HTTP 信息頭管理器內的參數,只對該 HTTP 請求生效。
右邊的設置,每次 HTTP 請求 Mock-server 時,會將 REQUEST-ID 加入到請求 Header 內。工具

bigsec

2)查看結果樹內,能夠看到發送的 Header。性能

3斷言:響應結果的文本斷言

每次執行測試後,須要瞭解本次執行的結果正確與否,以上的步驟只能知道咱們返回了什麼,不能確認到底返回的對不對。這個時候須要用到斷言,對響應結果進行驗證。測試

1)響應斷言,提供對全部請求的響應結果內的內容進行斷言,通常爲文本斷言。spa

將響應斷言放入HTTP請求下,會對該HTTP請求調用的響應結果進行斷言。
要測試的文本放入測試的模式內,可添加多個驗證文本。

2) 查看結果樹內,若是與指定的內容不一致,請求會標記爲失敗,並給出失敗緣由。

4斷言:響應的結果與數據庫內的字段比較

部分場景下,要求每次調用 API 後,須要驗證對應的 [風險等級] 符合預期。而 [風險等級] 保存在數據庫內,須要經過 JDBC Request 來實現對數據庫的操做。

1)JDBC Connection Configuration,提供對數據庫的鏈接配置。

2) JDBC Request,設置查詢 SQL

驗證結果通常是查詢類的 SQL,QueryType 選擇 Select Statement;
若是須要在某個請求開始前對數據庫內的數據作新增修改刪除,則須要選擇 QueryType爲Update Statement;

3)在 JDBC Request 下,添加響應斷言,驗證響應結果與字符串一致。

5斷言:使用 BeanShell 編寫手工斷言

每次調用 API 後,須要驗證 Token 的 [最近調用時間字段] 。該時間字段是存在數據庫內的時間戳,而咱們須要驗證 token 的最近調用時間在 15s 之內,而響應斷言組件沒法作到日期的比對,須要用正則表達式提取器將請求的響應結果提取出來,而後做爲一個變量,在 Bean Shell 內進行比對。

1)調用完請求後
添加 JDBC Request,設置查詢條件以下

響應結果

2) 在 JDBC Request 下添加正則表達式提取器,提取數據庫返回的時間戳字段,保存到變量內。

3) 在 JDBC Request 下添加 BeanShell 斷言,對正則表達式提取器內提取的變量與當前時間進行比對。

6異步調用,等待必定時間後獲取調用結果數據

某 API 支持客戶進行異步調用,先發送一個異步請求提交數據(獲取一個 token),而後隔一斷時間後再(使用獲取到的 token)請求上一個請求的返回結果;須要用到定時器組件。
1)異步調用請求接口設置。

2)異步調用請求成功後,返回一個 query_id,若是要拿到真正的處理結果,須要在調用獲取結果的請求時,把 query_id 做爲一個參數。

3) 在異步請求下添加一個‘正則表達式提取器’,將異步調用返回的 query_id 保存到參數內。

4) 獲取異步調用結果的請求內,引用正則表達式提取出來的 query_id ,並做爲參數提交。

5) 異步調用通常不會立刻出結果,須要在獲取異步調用的結果請求以前等待一段時間

BeanShell Timer 內可設置線程等待 5s;
添加高斯定時器、固定定時器等定時器也可達到等待的效果;
定時器放在 HTTP 請求下,會先執行定時器,若是與 HTTP 請求是同級目錄,則每一個 HTTP 請求都會受定時器的時間影響。

總結

如今幾乎全部從事 Web 測試的同窗都會使用 JMeter 或某種 API 工具來調用幾把接口,而須要作到接口自動化,免不了要加入參數化、關聯、斷言等高級用法,本文僅列出工做中用到的常見場景中的用法,有不對之處或測試之間的交流歡迎指出,謝謝。

以上。

相關文章
相關標籤/搜索