YApi 服務端測試新增 globalCookie ,相容自動化觸發服務端測試功能
如果有用過 YApi,還試過測試功能,沒準會提過一個類似的 issues: 為什麼本地執行介面測試正常,但是服務端測試卻不正常呢?
這個主要是因為本地是用瀏覽器來跑的,同在一個集合的介面用例,前面 set-cookie 以後,後面的 cookie 會直接從瀏覽器裡面讀,也就保持了前後一致性。但是,你用服務端來跑的時候,就算是同一個集合的測試用例,它的 cookie 值並沒有完全保持前後一致,這也就導致了為什麼本地跑可以,但是服務端測試不行。
但是很多時候我們做 ci 工具的時候,也就是我們想把介面測試做成,提交程式碼以後自動觸發執行並失敗告警的自動化流程裡面去的時候,往往需要的都是它的服務端測試的功能,所以服務端測試的 cookie 前後一致性的功能,也就很有必要了。
然鵝,這個 globalCookie 並沒有隨著 YApi 的更新也一起加上,所以,又到了自己動手豐衣足食的環節。
原專案太大了沒必要全部拉下來,這裡我直接 fork 了一個 yapi 的 docker 部署,然後我們只需要修改一些程式碼,新增到 Dockfile 裡面去,打出來的映象也就具備了 globalCookie 的功能。
專案程式碼:yapi-globalCookie 【又到了歡迎來 star 的時刻!】
COPY open.js /yapi/vendors/server/controllers/
Dockerfile 裡面加了這句話,看了一下 YApi 的程式碼,涉及到介面測試的執行方式主要跟這個 /yapi/vendors/server/controllers/open.js 的檔案有關係,我們可以在執行服務端測試的時候,將 cookie 設定成全域性變數,每當出現 set-cookie 的時候就儲存下來,用於後面的請求,也就具備了 globalCookie 的功能。
var _globalCookies = false;
async webHandleTest(interfaceData) {
let requestParams = {};
let options;
options = handleParams(interfaceData, this.handleValue, requestParams);
if (_globalCookies) {
options.headers['Cookie'] = _globalCookies;
}
let result = {
id: interfaceData.id,
name: interfaceData.casename,
path: interfaceData.path,
code: 400,
validRes: []
};
try {
options.taskId = this.getUid();
let data = await crossRequest(options, interfaceData.pre_script, interfaceData.after_script,createContex(
this.getUid(),
interfaceData.project_id,
interfaceData.interface_id
));
let res = data.res;
if (res.header['set-cookie']) {
let arrCookie = res.header['set-cookie'].toString().split(',');
var tmp = '';
for (let i = 0;i < arrCookie.length; i++) {
let idx = arrCookie[i].indexOf(';');
if (tmp.length > 0) {
tmp += '; ';
}
tmp += arrCookie[i].substring(0, idx);
}
_globalCookies = tmp;
}
result = Object.assign(result, {
status: res.status,
statusText: res.statusText,
url: data.req.url,
method: data.req.method,
data: data.req.data,
headers: data.req.headers,
res_header: res.header,
res_body: res.body
});
if (options.data && typeof options.data === 'object') {
requestParams = Object.assign(requestParams, options.data);
}
let validRes = [];
let responseData = Object.assign(
{},
{
status: res.status,
body: res.body,
header: res.header,
statusText: res.statusText
}
);
await this.handleScriptTest(interfaceData, responseData, validRes, requestParams);
result.params = requestParams;
if (validRes.length === 0) {
result.code = 0;
result.validRes = [{ message: '驗證通過' }];
} else if (validRes.length > 0) {
result.code = 1;
result.validRes = validRes;
}
} catch (data) {
result = Object.assign(options, result, {
res_header: data.header,
res_body: data.body || data.message,
status: null,
statusText: data.message,
code: 400
});
}
return result;
}
相關文章
- 服務端測試開發必備技能:Mock測試服務端Mock
- PC客戶端安全測試服務客戶端
- Python_服務端效能高併發測試Python服務端
- 效能測試-服務端瓶頸分析思路服務端
- 挑戰 - 微服務架構下的服務端測試微服務架構服務端
- 主流 go-web 服務端框架效能測試GoWeb服務端框架
- 服務端效能測試你應該知道的服務端
- 【LocustPlus序】漫談服務端效能測試服務端
- 相容性自動化測試 | HUAWEI DevEco Studio雲測服務等您來體驗dev
- 服務端測試很牛逼?不要慫,幹它服務端
- 移動APP安全測試服務APP
- APP測試的極簡Mock方法——Mock服務端介面APPMock服務端
- [服務端] 效能測試入門指南 (慎入: 6000 字長文)服務端
- 服務端c100k連線測試和客戶端65535測試驗證2服務端客戶端
- 【自動化測試】移動端測試輔助工具 - adb
- 雲服務測試報告測試報告
- Swift Perfect服務端的自動化部署Swift服務端
- 功能測試、自動化測試、效能測試的區別
- 連載 2 - 意義 - 為什麼著重在服務端測試服務端
- 阿里雲視訊點播服務端API和SDK測試阿里服務端API
- 關於Web端-UI自動化測試WebUI
- netty建立聊天室服務端及單機併發測試結果Netty服務端
- 軟體測試學習——移動端功能測試分析
- 服務流程之全面的滲透測試服務介紹
- [20190213]測試服務端開啟那些埠.txt服務端
- React服務端渲染+pm2自動化部署React服務端
- 移動端 UI 自動化測試框架對比UI框架
- 服務測試碰釘子Server GCServerGC
- 自動化測試系列 —— UI自動化測試UI
- 服務端指南 服務端概述 | 微服務架構概述服務端微服務架構
- 2.5.4. 測試Oracle net——2.5.4.3. 測試網路服務名Oracle
- Spring Boot單元測試之服務層測試總結Spring Boot
- appium uiautomator 移動端自動化測試工具APPUI
- AutoRunner 功能自動化測試專案實訓之自動化測試原理(一)
- 看雪網站滲透測試服務網站
- Web服務效能測試:Node完勝JavaWebJava
- debian 中使用 telnet 測試服務
- 測試開發之自動化篇-自動化測試框架設計框架