一站式接口文檔及測(cè)試工具yapi介紹
我們部門正在使用yapi做接口文檔的管理,較之之前純手工寫接口注釋的方式確實(shí)方便了不少。

功能介紹
稍微看了一下,發(fā)現(xiàn)yapi除了做接口文檔的可視化管理之外,還有不少的功能。

按照官方說(shuō)法,YApi 是一個(gè)可本地部署的、打通前后端及QA的、可視化的接口管理平臺(tái)。
YApi 是高效、易用、功能強(qiáng)大的 api 管理平臺(tái),旨在為開(kāi)發(fā)、產(chǎn)品、測(cè)試人員提供更優(yōu)雅的接口管理服務(wù)。可以幫助開(kāi)發(fā)者輕松創(chuàng)建、發(fā)布、維護(hù) API,YApi 還為用戶提供了優(yōu)秀的交互體驗(yàn),開(kāi)發(fā)人員只需利用平臺(tái)提供的接口數(shù)據(jù)寫入工具以及簡(jiǎn)單的點(diǎn)擊操作就可以實(shí)現(xiàn)接口的管理。
基于 Json5 和 Mockjs 定義接口返回?cái)?shù)據(jù)的結(jié)構(gòu)和文檔,效率提升多倍 扁平化權(quán)限設(shè)計(jì),即保證了大型企業(yè)級(jí)項(xiàng)目的管理,又保證了易用性 類似 postman 的接口調(diào)試 自動(dòng)化測(cè)試, 支持對(duì) Response 斷言 MockServer 除支持普通的隨機(jī) mock 外,還增加了 Mock 期望功能,根據(jù)設(shè)置的請(qǐng)求過(guò)濾規(guī)則,返回期望數(shù)據(jù) 支持 postman, har, swagger 數(shù)據(jù)導(dǎo)入 免費(fèi)開(kāi)源,內(nèi)網(wǎng)部署,信息再也不怕泄露了
亮點(diǎn)是支持類似于postman的接口調(diào)試方式,這對(duì)測(cè)試同學(xué)會(huì)比較友好;另外還支持自動(dòng)化測(cè)試,支持response的斷言。
自動(dòng)化測(cè)試
那么yapi如何做自動(dòng)化測(cè)試的呢?

yapi定義了包含測(cè)試集、Pre-Script 、Test-Script 三方面。
測(cè)試集: 在平時(shí)的開(kāi)發(fā)過(guò)程中,經(jīng)常遇到的一個(gè)問(wèn)題是每次調(diào)試接口都需要重新填寫參數(shù),YApi測(cè)試集能夠保存之前填寫的參數(shù),方便下次的調(diào)試。每個(gè)的請(qǐng)求參數(shù)還可以通過(guò)前面已請(qǐng)求的接口數(shù)據(jù)讀取,或填寫mock隨機(jī)字符串,通過(guò)設(shè)置斷言腳本驗(yàn)證返回?cái)?shù)據(jù)的正確性。
Pre-Script:Pre-Script 包括請(qǐng)求參數(shù)處理腳本和響應(yīng)數(shù)據(jù)處理腳本兩部分。通過(guò)自定義 js 腳本方式改變請(qǐng)求的參數(shù)和返回的 response 數(shù)據(jù)。他的使用場(chǎng)景如下:(1)接口請(qǐng)求參數(shù)需要加密及返回 response 解密;(2)接口請(qǐng)求參數(shù)需要添加計(jì)算 token
Test-Script (測(cè)試腳本): 通過(guò)自定義腳本斷言接口參數(shù)或返回 response 數(shù)據(jù),在接口用例頁(yè)面點(diǎn)擊 Test 編輯。
具體示例:
assert.equal(body.errcode, 0)assert.equal(body.data.group_name, 'testGroup')assert.equal(status, 200)
總的來(lái)看跟postman支持的測(cè)試能力差不多。
插件
yapi支持如下的一些插件
yapi sso 登錄插件 yapi cas 登錄插件 By wsfe yapi gitlab集成插件 oauth2.0登錄 rap平臺(tái)數(shù)據(jù)導(dǎo)入 dingding 釘釘機(jī)器人推送插件 export-docx-data 數(shù)據(jù)導(dǎo)出docx文檔 interface-oauth-token 定時(shí)自動(dòng)獲取鑒權(quán)token的插件 import-swagger-customize 導(dǎo)入指定swagger接口
其中oauth和swagger插件是相當(dāng)實(shí)用的。
安裝和部署
yapi的后端是用nodejs實(shí)現(xiàn)的,所以安裝方式無(wú)非就是先裝nodejs,再npm install,最后加個(gè)pm2做服務(wù)管理。
使用我們提供的 yapi-cli 工具,部署 YApi 平臺(tái)是非常容易的。執(zhí)行 yapi server 啟動(dòng)可視化部署程序,輸入相應(yīng)的配置和點(diǎn)擊開(kāi)始部署,就能完成整個(gè)網(wǎng)站的部署。部署完成之后,可按照提示信息,執(zhí)行 node/{網(wǎng)站路徑/server/app.js} 啟動(dòng)服務(wù)器。在瀏覽器打開(kāi)指定url, 點(diǎn)擊登錄輸入您剛才設(shè)置的管理員郵箱,默認(rèn)密碼為 ymfe.org 登錄系統(tǒng)(默認(rèn)密碼可在個(gè)人中心修改)。
npm install -g yapi-cli --registry https://registry.npm.taobao.org
yapi server
利用pm2方便服務(wù)管理維護(hù)。
npm install pm2 -g //安裝pm2
cd {項(xiàng)目目錄}
pm2 start "vendors/server/app.js" --name yapi //pm2管理yapi服務(wù)
pm2 info yapi //查看服務(wù)信息
pm2 stop yapi //停止服務(wù)
pm2 restart yapi //重啟服務(wù)
代碼實(shí)現(xiàn)
隨便看了一眼yapi的代碼,對(duì)于這種前后端分離的項(xiàng)目,我建議大家可以先看后端的具體實(shí)體實(shí)現(xiàn),也就是model層。
第一個(gè)實(shí)體是interface,看名字盲猜代表的是接口的意思。
getSchema() {return {title: { type: String, required: true },uid: { type: Number, required: true },path: { type: String, required: true },method: { type: String, required: true },project_id: { type: Number, required: true },catid: { type: Number, required: true },edit_uid: { type: Number, default: 0 },status: { type: String, enum: ['undone', 'done'], default: 'undone' },desc: String,markdown: String,add_time: Number,up_time: Number,type: { type: String, enum: ['static', 'var'], default: 'static' },query_path: {path: String,params: [{name: String,value: String}]},req_query: [{name: String,value: String,example: String,desc: String,required: {type: String,enum: ['1', '0'],default: '1'}}],req_headers: [{name: String,value: String,example: String,desc: String,required: {type: String,enum: ['1', '0'],default: '1'}}],req_params: [{name: String,desc: String,example: String}],req_body_type: {type: String,enum: ['form', 'json', 'text', 'file', 'raw']},req_body_is_json_schema: { type: Boolean, default: false },req_body_form: [{name: String,type: { type: String, enum: ['text', 'file'] },example: String,value: String,desc: String,required: {type: String,enum: ['1', '0'],default: '1'}}],req_body_other: String,res_body_type: {type: String,enum: ['json', 'text', 'xml', 'raw', 'json-schema']},res_body: String,res_body_is_json_schema: { type: Boolean, default: false },custom_field_value: String,field2: String,field3: String,api_opened: { type: Boolean, default: false },index: { type: Number, default: 0 },tag: Array};}
看了一下schema,果然不出所料,基本上一個(gè)接口的方方面面都定義到了。
再看interfaceCase.js,繼續(xù)盲猜這個(gè)類用來(lái)表示接口測(cè)試用例。
getSchema() {return {casename: { type: String, required: true },uid: { type: Number, required: true },col_id: { type: Number, required: true },index: { type: Number, default: 0 },project_id: { type: Number, required: true },interface_id: { type: Number, required: true },add_time: Number,up_time: Number,case_env: { type: String },req_params: [{name: String,value: String}],req_headers: [{name: String,value: String}],req_query: [{name: String,value: String,enable: { type: Boolean, default: true }}],req_body_form: [{name: String,value: String,enable: { type: Boolean, default: true }}],req_body_other: String,test_res_body: String,test_status: { type: String, enum: ['ok', 'invalid', 'error', ''] },test_res_header: Schema.Types.Mixed,mock_verify: { type: Boolean, default: false },enable_script: { type: Boolean, default: false },test_script: String};}
梅開(kāi)二度,這里有個(gè)字段是test_script,沒(méi)仔細(xì)追代碼了,不過(guò)估計(jì)測(cè)試的斷言都以代碼的形式存在里面。
根據(jù)思路,大家可以把model文件全部讀一遍,這樣就應(yīng)該可以大致了解yapi的持久化層實(shí)現(xiàn)了。
功能實(shí)現(xiàn)層大家可以去讀controller里的代碼,ui層可以讀client里的代碼。
思考
總而言之,yapi基本上就是我們很多測(cè)試開(kāi)發(fā)同學(xué)所開(kāi)發(fā)的接口測(cè)試平臺(tái),支持接口文檔查看,簡(jiǎn)單的接口自動(dòng)化和mock等。
有志于從事測(cè)試開(kāi)發(fā)的同學(xué)可以精讀一下代碼,相信會(huì)有不少收獲。
需要搭建內(nèi)部接口測(cè)試平臺(tái)的同學(xué)可以直接私有化部署,用docker compose的話安裝體驗(yàn)更佳。
(本文來(lái)自測(cè)試圈TC,作者乙醇)
掃一掃下面的二維碼 免費(fèi)領(lǐng)取10G的Python學(xué)習(xí)資料哦~
“掃一掃,領(lǐng)取Python學(xué)習(xí)資料”

