软件测试自动化 后台服务端,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;

}

原创文章,作者:众测,如若转载,请注明出处:http://www.stest.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值