YApi 服务端测试新增 globalCookie ,兼容自动化触发服务端测试功能

YApi是一个开源的接口管理平台,它提供了丰富的接口管理和测试功能。其中,服务端测试是YApi的一个重要特性,可以帮助开发人员自动化执行接口测试。

在YApi的服务端测试中,新增globalCookie是一个很有用的功能。通过设置globalCookie,你可以在服务端测试中模拟用户的登录状态或其他需要的Cookie信息。这样,在执行接口测试时,就可以保持一致的用户身份或其他上下文信息,更加贴近真实的场景。

如果有用过 YApi,还试过测试功能,没准会提过一个类似的 issues: 为什么本地运行接口测试正常,但是服务端测试却不正常呢?

这个主要是因为本地是用浏览器来跑的,同在一个集合的接口用例,前面 set-cookie 以后,后面的 cookie 会直接从浏览器里面读,也就保持了前后一致性。但是,你用服务端来跑的时候,就算是同一个集合的测试用例,它的 cookie 值并没有完全保持前后一致,这也就导致了为什么本地跑可以,但是服务端测试不行。

但是很多时候我们做 ci 工具的时候,也就是我们想把接口测试做成,提交代码以后自动触发运行并失败告警的自动化流程里面去的时候,往往需要的都是它的服务端测试的功能,所以服务端测试的 cookie 前后一致性的功能,也就很有必要了。

然鹅,这个 globalCookie 并没有随着 YApi 的更新也一起加上,所以,又到了自己动手丰衣足食的环节。

原项目太大了没必要全部拉下来,这里我直接 fork 了一个 yapi 的 docker 部署,然后我们只需要修改一些代码,添加到 Dockfile 里面去,打出来的镜像也就具备了 globalCookie 的功能。

复制代码
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;
  }

作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

相关推荐
weixin_460443566 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w9 小时前
什么是AOP
java
Cc.Y9 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
程序员-Benothing10 小时前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
paopaokaka_luck10 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870510 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev10 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
m0_6464299710 小时前
Docker 完整核心知识点总结(超通俗易懂版)
运维·docker·容器
Sarvartha10 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞10 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计