Apifox:API 接口自動(dòng)化測(cè)試完全指南

1. 前言
在開始前大家可以先閱讀:深入了解自動(dòng)化測(cè)試:什么是自動(dòng)化測(cè)試及其作用?(https://apifox.com/apiskills/what-is-automation-testing)
大家好,這是一篇關(guān)于?Apifox?的接口自動(dòng)化測(cè)試教程。相信你已經(jīng)對(duì) Apifox 有所了解:“集 API 文檔、API 調(diào)試、API Mock、API 自動(dòng)化測(cè)試,更先進(jìn)的 API 設(shè)計(jì)/開發(fā)/測(cè)試工具”。
筆者是后端開發(fā),因此這篇教程關(guān)注的是?API 自動(dòng)化測(cè)試,如果你也是后端開發(fā),正苦于沒有好的方式測(cè)試接口,對(duì)保證線上接口穩(wěn)定性沒有信心,那么這篇文章就是為你準(zhǔn)備的,如果你學(xué)會(huì)了 Apifox 接口自動(dòng)化測(cè)試,它幾乎是一個(gè)會(huì)陪伴你整個(gè)職業(yè)生涯中的一件稱心應(yīng)手的兵器。
接口測(cè)試可不是簡(jiǎn)單的請(qǐng)求一兩個(gè)接口再檢查一下響應(yīng)結(jié)果那么簡(jiǎn)單,沒有貼近業(yè)務(wù)場(chǎng)景的測(cè)試意義不大,但完全模擬業(yè)務(wù)場(chǎng)景,一比一真實(shí)的去還原用戶操作流程的測(cè)試勢(shì)必會(huì)很復(fù)雜,如 接口需要登陸后才能操作怎么辦?一個(gè)接口依賴上一個(gè)接口請(qǐng)求返回的數(shù)據(jù)怎么辦?后端對(duì)請(qǐng)求有簽名驗(yàn)證怎么辦?后端任務(wù)是異步處理的怎么辦?...
不要擔(dān)心,既然是完全指南,這些問題我們就都會(huì)講到,Apifox 強(qiáng)大的能力可以解決這些問題,下面我們會(huì)用真實(shí)的案例,逐步講解覆蓋到這些所有的場(chǎng)景。建議大家打開?autotest.apifox.cn?這個(gè)項(xiàng)目,一邊學(xué)習(xí)里面的公共腳本(公共腳本、測(cè)試套件等都打包放在?百度網(wǎng)盤),一邊跟著練習(xí)。
2. 接口自動(dòng)鑒權(quán)
知識(shí)點(diǎn):環(huán)境變量、公共腳本、
pm.sendRequest
腳本發(fā)送請(qǐng)求
我們通過一個(gè)需要登錄才能訪問的后臺(tái)新聞列表接口,來演示接口自動(dòng)登錄鑒權(quán)。
默認(rèn)情況下訪問該接口提示需要登錄:

如果要正常訪問該接口的數(shù)據(jù),需要在 header 中提供?AdminToken: token
?頭,這是一個(gè)常見的需要 JWT 登錄認(rèn)證接口。
很自然的我們想到,如果自動(dòng)請(qǐng)求登錄接口獲取?token
?值,然后在每次請(qǐng)求前自動(dòng)帶上這個(gè)?AdminToken
?頭不就行了嗎,沒錯(cuò)就是這樣簡(jiǎn)單,偽代碼如下:
完整的代碼見 「公共腳本」admin: login and Auth

這里我們從登錄接口獲取 token 后,將其緩存到本地的環(huán)境變量中,這樣就不必每次都請(qǐng)求登錄了。
現(xiàn)在我們已經(jīng)完成了 請(qǐng)求登錄接口獲取 token,并設(shè)置到 請(qǐng)求頭中的功能,然后我們?cè)侔汛?公共腳本 應(yīng)用到 新聞列表的接口上,實(shí)現(xiàn)在 請(qǐng)求新聞列表接口 前自動(dòng)完成 “登錄”。
后臺(tái)有很多接口訪問都需要登錄,如果一個(gè)個(gè)地去設(shè)置 前置腳本 就太麻煩了,所以這里我們直接在 admin 后端接口的分組目錄上設(shè)置?前置操作?公共腳本admin: login and Auth
,這樣整個(gè) admin 下的全部接口都能自動(dòng)登錄了:

我們來驗(yàn)證一下:

可以看到返回了數(shù)據(jù),說明自動(dòng)登錄成功了,我們?cè)?控制臺(tái)輸出 中可以看到請(qǐng)求了登錄接口,在實(shí)際請(qǐng)求中 可以看到?AdminToken: token
?頭。
在這個(gè)例子中我們是將 用于后臺(tái)登錄的?用戶名
?和?密碼
?提前配置到了 環(huán)境變量中,然后利用腳本?pm.sendRequest
?請(qǐng)求登錄接口獲取 token,并設(shè)置 請(qǐng)求頭,這樣就實(shí)現(xiàn)了接口的自動(dòng)登錄。
關(guān)于變量的優(yōu)先級(jí) 和 腳本的執(zhí)行時(shí)機(jī),如圖所示:


3. 接口自動(dòng)加簽
知識(shí)點(diǎn):參數(shù)注入、內(nèi)置類庫(kù)
有一些對(duì)安全性要求較高的接口可能會(huì)有對(duì)接口請(qǐng)求進(jìn)行驗(yàn)簽的機(jī)制,具體是 接口請(qǐng)求的數(shù)據(jù) 會(huì)額外多一個(gè)?sign
?字段,它的值是可以是?md5(k1=v1&k2=v2...)
,這樣就確保了請(qǐng)求數(shù)據(jù)不會(huì)被篡改,但是這給我們測(cè)試帶來了麻煩,我們?nèi)绾蚊看巫詣?dòng)生成?sign
?參數(shù)呢,不用擔(dān)心,這對(duì) Apifox 來說不在話下,利用 Apifox 強(qiáng)大的腳本功能我們甚至能夠調(diào)用外部任何語言的腳本。
知道了請(qǐng)求加簽的原理,那么實(shí)現(xiàn)就很容易了,無非是 在請(qǐng)求前 自動(dòng)算出?sign
?,并注入到請(qǐng)求參數(shù)中去,下面是偽代碼:
完整的代碼見 「公共腳本」parkinglot:client: request sign and common params

然后 把 自動(dòng)加簽的公共腳本設(shè)置到?client 停車場(chǎng)設(shè)備端 ??
?分組 的前置腳本中,這樣其下所有接口請(qǐng)求時(shí)都有?sign
?參數(shù)了。
注:這里簡(jiǎn)化了簽名算法,?
md5(k1=v1&k2=v2..., key)
?其實(shí)簽名算法還有一個(gè)關(guān)鍵的?key
參數(shù) ,不過刪減這部分內(nèi)容并不影響我們這里對(duì)接口自動(dòng)加簽的講解。為了力求簡(jiǎn)潔,只關(guān)注最核心的東西,文章都是使用偽代碼的形式,完整代碼請(qǐng)讀者自行查看項(xiàng)目中的公共腳本。
4. 測(cè)試用例
知識(shí)點(diǎn):接口用例(順序)、流程控制(條件、循環(huán)、等待)、測(cè)試數(shù)據(jù)、斷言
在掌握了 Apifox 的強(qiáng)大腳本能力后,你幾乎能夠解決任何鑒權(quán)、加簽等問題了,接下來我們開始搭建完整的測(cè)試流程,以便真實(shí)完整的模擬正常使用時(shí)的業(yè)務(wù)測(cè)試場(chǎng)景。
我假定你已經(jīng)熟悉 Apifox 中 接口用例、環(huán)境變量、變量提取、斷言 等基礎(chǔ)概念,如果不熟悉,那建議你先快速地看一下官方文檔 :Apifox 幫助文檔。
我們先看一個(gè)簡(jiǎn)單的場(chǎng)景測(cè)試:

我們運(yùn)行測(cè)試看一下:


我們?cè)诤笈_(tái)看一下新聞分類和新聞確實(shí)創(chuàng)建成功了。
再看看一個(gè)稍微復(fù)雜一點(diǎn)的測(cè)試場(chǎng)景,一個(gè)異步任務(wù)處理的場(chǎng)景測(cè)試:

相信看到這里已經(jīng)不需要我解釋什么了,如你所見,Apifox 的測(cè)試用例的流程編排功能非常強(qiáng)大,你能 DIY 出任何復(fù)雜的場(chǎng)景。更多用法見文檔:測(cè)試流程控制 | Apifox 幫助文檔
5. Apifox CLI
知識(shí)點(diǎn):命令行
如果每次測(cè)試都需要我們手動(dòng)點(diǎn)擊 運(yùn)行按鈕 就太不方便了,沒錯(cuò),Apifox 當(dāng)然也考慮到了這點(diǎn),Apifox CLI 就可以幫助我們實(shí)現(xiàn)自動(dòng)化的測(cè)試。

點(diǎn)擊持續(xù)集成的按鈕就能夠生成 命令行代碼:
將這行 shell 命令復(fù)制到任意地方執(zhí)行即可實(shí)時(shí)運(yùn)行測(cè)試用例/套件。
6. 持續(xù)集成
知識(shí)點(diǎn):自動(dòng)化測(cè)試
我們先在服務(wù)器上安裝?apifox-cli
:
然后在發(fā)布工具中集成 測(cè)試命令即可:

為了通用性,我們使用 php 腳本 將?apifox run ...
?命令進(jìn)行了封裝,你理解成執(zhí)行的是?apifox run ...
?? 命令即可。
這里我們用的是 Spug 發(fā)布工具,類似 Jenkins,請(qǐng)根據(jù)實(shí)際情況配置。
7. 測(cè)試報(bào)告
知識(shí)點(diǎn):報(bào)告解析、釘釘通知
我們?cè)?Apifox.php
?腳本執(zhí)行測(cè)試命令,并解析測(cè)試生成的 json 文件,然后將結(jié)果拼裝發(fā)送到釘釘群,如果有失敗會(huì) at 相應(yīng)的開發(fā)人員:

8. 附錄
上面提到的公共腳本、測(cè)試套件等都打包放在這里了:百度網(wǎng)盤,需要的話可以拿去參考,強(qiáng)烈建議直接打開項(xiàng)目查看功能腳本,測(cè)試用例進(jìn)行參考學(xué)習(xí)。
作者:xika