去哪兒 Api 自動化測試實踐

hellosean發表於2017-12-20

背景

越來越多的應用基於前後端分離構建,後端提供資料介面,前端呼叫介面返回 json 資料渲染到 UI,這個時候保證後端介面資料正確性變的愈來愈重要,介面測試就是來解決這個問題。很多團隊,介面測試就是手動執行介面,肉眼比對介面返回的資料,這樣的操作流程效率低下,容易出錯。去哪兒移動架構組自研了介面管理平臺 YApi 解決這一痛點,使用者只需要在視覺化 GUI 下,配置每個介面的入參和對 RESPONSE 斷言,即可實現對介面的自動化測試,大大提升了介面測試的效率。下面開始詳細解決如何使用 yapi 介面管理平臺自動化測試介面。

準備工作

如果您還未部署 yapi 介面管理平臺,可先去示例站點試用。

在建立完專案和介面後,需要進入到測試集頁面,匯入需要測試的介面。

import-api

基礎概念

需要學習的基礎概念主要包含測試集、Pre-Script 、Test-Script 三方面。

測試集

在平時的開發過程中,經常遇到的一個問題是每次除錯介面都需要重新填寫引數,YApi測試集能夠儲存之前填寫的引數,方便下次的除錯。每個的請求引數還可以通過前面已請求的介面資料讀取,或填寫mock隨機字串,通過設定斷言指令碼驗證返回資料的正確性。

case

Pre-Script

pre

Pre-Script 包括請求引數處理指令碼和響應資料處理指令碼兩部分。通過自定義 js 指令碼方式改變請求的引數和返回的 response 資料。他的使用場景如下:

  • 介面請求引數需要加密及返回 response 解密
  • 介面請求引數需要新增計算 token

請求引數處理指令碼示例

以 jquery ajax 為例,假設當前的請求引數是

{
  url: '/api/user?id=1',
  method: 'POST',
  headers: {
    xxx: 'xxx'
  },
  data: {
    type: 1
  }
}
複製程式碼

那麼公共變數 context 包含以下屬性:

context = {
  pathname: '/api/user',
  query: {
    id: 1
  },
  requestHeader: {
    xxx: 'xxx'
  },
  method: 'POST',
  requestBody: {
    type:1
  }
}
複製程式碼

假設我們需要在 url 增加一個 token 引數,可以寫如下自定義指令碼:

去哪兒 Api 自動化測試實踐

返回資料處理指令碼示例

在上面的示例請求完成後,假設返回 responseBody={a:1},公共變數 context 包含以下屬性:

context = {
  pathname: '/api/user',
  query: {
    id: 1
  },
  requestHeader: {
    xxx: 'xxx'
  },
  method: 'POST',
  requestBody: {
    type:1
  },
  responseData: {
    a:1
  },
  responseHeader: {
    content-type: 'application/json'
    ...
  }
}
複製程式碼

假設我們需要修改響應資料 responseBody a 的值為 2,可以填寫如下自定義指令碼:

去哪兒 Api 自動化測試實踐

Test-Script (測試指令碼)

去哪兒 Api 自動化測試實踐

通過自定義指令碼斷言介面引數或返回 response 資料,在介面用例頁面點選 Test 編輯。

支援的公共變數

1.assert
  • assert(value)

    判斷 value 是否為 truth, 例如 assert(1) 通過, assert(0) 不通過,只要 value 不是 null, 0, false等值驗證通過

  • assert.equal(actual, expected)

    判斷 actual 是否等於 expected,例如 assert(1, 1)通過

  • assert.notEqual(actual, expected)

    判斷 actual 是否不等於 expected

  • assert.deepEqual(actual, expected)

    假設: actual = {a:1} 是一個物件,即便 expected = {a:1},如果使用 assert.equal 可能也是不相等的,因為在 js 引用的只是物件的一個指標,需要使用 assert.deepEqual 比較兩個物件是否相等

  • assert.notDeepEaual(actual, expected)

    深度比較兩個物件是否不相等

2.status

http 狀態碼

3.params

http request params, 合併了 query 和 body

4.body

返回 response body

5.header

返回 response header

6.records

記錄的 http 請求資訊,假設需要獲取 key 為 555 的介面引數或者響應資料,可通過 records[555].params 或 records[555].body 獲取

7.log

log(message) 函式,除錯時使用,log 資訊僅僅在斷言失敗後列印

示例

assert.equal(body.errcode, 0)
assert.equal(body.data.group_name, 'testGroup')
assert.equal(status, 200)
複製程式碼

開始測試

第一步:配置引數

YApi 除了支援常量字串外,還支援 mock 隨機字串和變數字串。

Mock引數

Mock 引數每次請求都會生成隨機字串,支援 mockjs 所有佔位符

去哪兒 Api 自動化測試實踐

變數引數

YApi 提供了強大的變數引數功能,你可以在測試的時候使用前面介面的 引數返回值 作為 後面介面的引數,即使介面之間存在依賴,也可以輕鬆 一鍵測試~

格式:

$.{key}.{params|body}.{path}
複製程式碼

例如:現有兩個介面,分別是“導航標題”和“文章列表”

去哪兒 Api 自動化測試實踐

文章列表介面需要傳引數: 當前標題(id),而這個 id 需要通過 導航標題 的返回值獲取,這時應在 文章列表 的引數輸入框中根據前者的 key 找到對應 id。

導航標題 的引數和返回值有如下結構:

引數:

去哪兒 Api 自動化測試實踐

返回值:

去哪兒 Api 自動化測試實踐

文章列表 的引數可以如下配置:

去哪兒 Api 自動化測試實踐

其中 $. 是使用 動態變數 的標誌,$.269.params 即表示 key 值為 269 用例的請求引數,$.269.body 即表示 key 值為 269 用例的返回值。

Tips: 上下拖動測試集合的列表項可以調整測試的順序。

目前yapi中的querybody,headerpathParam的輸入引數已經支援點選選擇功能。無需自己填寫表示式,只需在彈窗中選擇需要展示的表示式即可。 輸入選項包括常量mock資料,在測試集合中也支援變數選擇。 具體用法:單擊編輯按鈕開啟表示式生成器,點選需要的資料建立表示式,這裡也可以實時檢視錶達式結果。

去哪兒 Api 自動化測試實踐

第二步:開始測試

case

在測試列表可以看到每個測試用例的 key,還有 開始測試、報告等功能 點選開始測試會按照 case 定義的引數從上往下一個一個進行測試,如果順序有問題,可以拖動調整 測試完成之後,點選報告檢視該次請求的結果

後記:

YApi 自動化測試大大簡化了介面測試資料準備,和驗證環節,目前去哪兒測試團隊已經開始使用。未來 YApi 將會持續優化自動化測試功能,希望大家提出大家寶貴的意見。

開源介面管理平臺 YApi 官網

Github: YApi github

相關文章