Apifox 進(jìn)行團(tuán)隊(duì)接口管理指南
Apifox
,同 postman 一樣,最基本的功能用來(lái)接口聯(lián)調(diào)。
稍微高級(jí)點(diǎn)的用法可以使用 Apifox 生成各個(gè)語(yǔ)言發(fā)送請(qǐng)求的代碼,針對(duì) Image/File 進(jìn)行請(qǐng)求,對(duì) Request Body 與 Response Body 進(jìn)行數(shù)據(jù)校驗(yàn)及測(cè)試。
「僅僅做到這些只是滿足一個(gè)開發(fā)者的使用場(chǎng)景。而 Apifox 更高級(jí)的用法可以使整個(gè)團(tuán)隊(duì)進(jìn)行受益,滿足開發(fā)測(cè)試的各個(gè)階段,對(duì)開發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境進(jìn)行全環(huán)境覆蓋。對(duì)開發(fā)、測(cè)試、文檔進(jìn)行更進(jìn)一步的自動(dòng)化」

1.?Apifox API 管理分層

Apifox 可對(duì)后端的所有請(qǐng)求按功能或者業(yè)務(wù)模塊進(jìn)行組織,使用 markdown 對(duì)所有請(qǐng)求和示例添加適當(dāng)?shù)拿枋觥?/p>
我們看一下 Apifox 關(guān)于組織請(qǐng)求及分組的建議。
項(xiàng)目: 對(duì)應(yīng)一個(gè)團(tuán)隊(duì)中某個(gè)服務(wù)。項(xiàng)目在項(xiàng)目組內(nèi)各個(gè)成員(server, client, QA)間進(jìn)行共享。可以對(duì)整個(gè)項(xiàng)目添加請(qǐng)求,文檔、單API測(cè)試等。最重要的是可以添加「測(cè)試流程」和「數(shù)據(jù)模型」,后續(xù)講到。對(duì)于一開始未在 apifox 組織請(qǐng)求的項(xiàng)目,可以「根據(jù) apidoc、swagger 等文檔自動(dòng)轉(zhuǎn)化為 apifox 組織好的項(xiàng)目」。
分組: 對(duì)應(yīng)一個(gè)模塊,或者各層級(jí)子路由。如?
router.use('/users')
?所有的請(qǐng)求都在一個(gè)分組,可以根據(jù)路由互相嵌套分組。請(qǐng)求: 對(duì)應(yīng)一個(gè)API請(qǐng)求,一個(gè)文檔。
實(shí)例: 對(duì)應(yīng)一個(gè)請(qǐng)求不同的參數(shù)以及響應(yīng),用于 Mock Server 以及文檔。
PS: 關(guān)于 Mock Server 和團(tuán)隊(duì)共享 API,在 postman 中也存在,不過(guò) apifox 全部免費(fèi),優(yōu)勢(shì)在我。
PS2: 一個(gè)小建議,如果能夠通過(guò)一個(gè) Proxy,跑一遍項(xiàng)目,將所有請(qǐng)求收集起來(lái)并存儲(chǔ)為 Apifox 的項(xiàng)目,可最大幅度地節(jié)省了人為添加 API 的繁瑣性。特別是由其它工具,剛轉(zhuǎn)化為 apifox 時(shí)。
1.1.?文檔
apifox 自動(dòng)生成文檔有助于團(tuán)隊(duì)協(xié)作,解決了手動(dòng)寫文檔,「以及更新不及時(shí)的重大bug」。
喂,那個(gè)后端,就是說(shuō)你了,你文檔沒(méi)更新害我白折騰了三天三夜。
不過(guò)這樣冗余字段過(guò)多,更好的解決方案是在測(cè)試中對(duì)請(qǐng)求進(jìn)行 json 校驗(yàn),同時(shí)充當(dāng)了一部分文檔的功能。畢竟 json-schema 就是用來(lái)描述數(shù)據(jù)使數(shù)據(jù)更加可讀。
以上說(shuō)到請(qǐng)求,對(duì)于響應(yīng)的文檔,可以 json-schema 校驗(yàn)或者每個(gè)字段的描述,以及更多的測(cè)試用例代表更多的細(xì)節(jié)。
1.2.?Mock
當(dāng)服務(wù)器端還沒(méi)有寫好 API 時(shí),客戶端可以自定義規(guī)則來(lái)生成接口。
更多參考 「前端該如何優(yōu)雅地Mock數(shù)據(jù)??」每個(gè)前端都應(yīng)該學(xué)會(huì)的技巧[1]
2.?測(cè)試
對(duì)于每一個(gè) Request 都需要有測(cè)試用例,驗(yàn)證響應(yīng)是否成功,響應(yīng)時(shí)間是否過(guò)長(zhǎng)或者響應(yīng) json 的數(shù)據(jù)類型是否正確。
測(cè)試可以使用?pm.expect
?進(jìn)行?BDD
?測(cè)試,風(fēng)格和?chai
?很像,如果熟悉?chai
?就很容易上手,pm.expect
?底層使用 chai 實(shí)現(xiàn),與 chai BDD API 一致。
apifox 也有一些 HTTP 相關(guān)的測(cè)試 API,如 status code,header, body,并且也提供了一些 snippets。
// 響應(yīng)成功
pm.test('Status code is 200', () => {
?pm.response.to.have.status(200)
})
// 響應(yīng)成功 chai.expect
pm.test('Status code is 200', () => {
?chai.expect(pm.response).to.have.property('code', 200)
})
// 校驗(yàn)響應(yīng)數(shù)據(jù)
pm.test('Page is 100', () => {
?const jsonData = pm.response.json()
?chai.expect(jsonData.page).to.eql(100)
})
重點(diǎn)不在這里,使用?「apifox 可以使用圖形界面交互式無(wú)需寫代碼對(duì)接口進(jìn)行測(cè)試」。

以上截圖對(duì)以下數(shù)據(jù)進(jìn)行了校驗(yàn)
API 請(qǐng)求成功,狀態(tài)碼必須是 200
響應(yīng)體數(shù)據(jù)必須是 JSON
響應(yīng)體中 code 字段必須是數(shù)字
2.1.?示例: 測(cè)試請(qǐng)求參數(shù)
一個(gè)請(qǐng)求帶有若干參數(shù),如?GET
?的?querystring(search)
?以及?POST
?的?body
,「不同的參數(shù)會(huì)有不同數(shù)據(jù)結(jié)構(gòu)的響應(yīng)」。
假設(shè)一個(gè)請(qǐng)求不同參數(shù)返回的 json schema 完全不同,則可以寫成兩個(gè) API 分開測(cè)試。
如果返回的 Json Schema 相同,只是值不同,則使用兩個(gè)不同的示例進(jìn)行測(cè)試。
3.?集成測(cè)試
單個(gè)API測(cè)試通過(guò)后,需要把所有請(qǐng)求集成在一起進(jìn)行測(cè)試。這時(shí)候出現(xiàn)了兩個(gè)問(wèn)題
如何確保API依賴
API之間如何傳遞數(shù)據(jù)
在 apifox 中可以使用環(huán)境變量維護(hù)數(shù)據(jù),在請(qǐng)求中用?{{}}
?占位符替代。
一個(gè)常見(jiàn)的場(chǎng)景是項(xiàng)目使用 token 來(lái)保存登錄信息,每次請(qǐng)求都需要攜帶token??梢栽诘卿浀臏y(cè)試代碼中設(shè)置 token 的環(huán)境變量
const url = 'http://{{HOST}}/api/login'
pm.test('There is a token', () => {
?const jsonData = pm.response.json()
?pm.expect(jsonData.token).to.a('string')
?pm.environment.set('token', jsonData.token)
})
const urlNext = 'http://{{HOST}}/api/profile?token={{token}}'

PS: 那如何自動(dòng)控制所有測(cè)試的順序呢?比如以下三步,登錄成功后走第二步,登錄失敗走第三步
登錄
發(fā)帖
XXX
4.?持續(xù)集成
如何將集成測(cè)試與項(xiàng)目集成在一起,納入版本管理,保留測(cè)試記錄,方便準(zhǔn)時(shí)定位 bug。
可以可使用 Apifox CLI,不過(guò)僅僅能測(cè)試離線數(shù)據(jù)??蓞⒖嘉臋n Apifox: 持續(xù)集成[2]
$ apifox run examples/sample.apifox-cli.json -r cli,html
5.?總結(jié)及更多疑問(wèn)總結(jié)
如何編寫測(cè)試用例
apifox 底層使用?
[chai.js](http://chaijs.com/api/bdd/)
?的 bdd 語(yǔ)法作為斷言庫(kù),另外加了一些特有的語(yǔ)法。apifox 可通過(guò)圖形化界面交互式校驗(yàn)數(shù)據(jù)
如何debug
點(diǎn)擊菜單欄 View -> Show Devtools (Show Postman Console) 可以查看響應(yīng),檢查輸出。
集成測(cè)試如何管理請(qǐng)求依賴
比如: 兩個(gè)API需要有依賴關(guān)系,比如當(dāng)創(chuàng)建完一個(gè)用戶后(注冊(cè)),獲取他的個(gè)人信息。獲取個(gè)人信息就需要依賴創(chuàng)建用戶這個(gè)API。
使用 Environment Variables 可以管理依賴
如何集成到服務(wù)器端項(xiàng)目中
可以使用 npm 包 apifox-cli 來(lái)集成到項(xiàng)目中