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

news2024/11/26 11:25:37

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;
  }

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

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

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

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023/7/23周报

目录 摘要 论文阅读 1、题目和现存问题 2、问题阐述及相关定义 3、LGDL模型框架 4、实验准备 5、实验过程 深度学习 1、GCN简单分类任务 2、文献引用数据分类案例 3、将时序型数据构建为图数据格式 总结 摘要 本周在论文阅读上&#xff0c;对基于图神经网络与深度…

LabVIEW使用支持向量机对脑磁共振成像进行图像分类

LabVIEW使用支持向量机对脑磁共振成像进行图像分类 医学成像是用于创建人体解剖学图像以进行临床研究、诊断和治疗的技术和过程。它现在是医疗技术发展最快的领域之一。通常用于获得医学图像的方式是X射线&#xff0c;计算机断层扫描&#xff08;CT&#xff09;&#xff0c;磁…

pnpm 与monorepo架构

软链接与硬链接 创建方式&#xff1a; mklink &#xff08;windows&#xff09; 软链接 &#xff1a; a、b指向同一个文件 b相当于一个快捷方式 硬链接&#xff1a; a、b指向同一个内存地址 某一文件修改&#xff0c;其他文件跟这变化 上图所示&#xff1a;安装某依赖&…

LabVIEW - DAQmx 数据采集

1. 题目 基于NI MAX创建模拟仿真设备&#xff0c;然后基于DAQmx编写模拟量数据采集程序&#xff0c;实现按照1s时间间隔&#xff0c;采集制定模拟输入端口一个数据的功能&#xff0c;并能够将采集的数据、数据采集的时间等参数写入文本文件保存。 2. 过程 通过在NI max的设备与…

虚拟人直播怎么做?3d虚拟主播全栈技术方案来了

元宇宙浪潮来袭后&#xff0c;虚拟人直播的应用场景得到进一步拓宽&#xff0c;大量的3d虚拟主播出现在品牌直播间、娱乐节目、发布会等应用中&#xff0c;那想要让3d虚拟主播“活得即时”&#xff0c;开启虚拟人直播要怎么做&#xff1f;本文将基于广州虚拟动力的3d虚拟主播全…

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商&#xff0c;它提供了很多组件供消费者使用&#xff0c;其中进行访问控制的组件叫做IAM(Identity and Access Management)&#xff0c; 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看&#xff0c;主要分两种&#xff1…

3、线性数据结构

线性数据结构&#xff0c;从名字可以看出&#xff0c;和“线”脱离不了关系。 那么从“线”联想&#xff0c;水平的&#xff0c;我们可以想到食堂打饭排的队伍&#xff0c;垂直的&#xff0c;我们可以联想到书桌上层叠摆放的书籍。 打饭的队伍一般遵循“先来先服务”的原则&a…

力扣热门100题之移动0【中等】

题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums […

利用Graphics的CopyFromScreen实现简陋版的打印(C#)

前段时间&#xff0c;在做一个打印的需求&#xff0c;需要把Winform界面的控件及内容全部打印出来&#xff0c;但有一个比较坑的地方是&#xff0c;公司提供的打印API打印单选框&#xff0c;打印单选框时发现选框和内容总是有那么一点点不对齐&#xff0c;看着很别扭。不过客户…

【Linux】文件操作(一)

目录 预备知识 复习C语言文件接口 fopen() 写入类&#xff1a;fwrite()、fprintf()、fputs() 读取类&#xff1a;fgets() 系统接口 open() 一个参数如何传递多个选项&#xff1f; close() write() read() 预备知识 在正式讲解文件之前&#xff0c;我们需要有一些预…

C#中小数保留固定位数

我们写程序的时候&#xff0c;有时候数据想要对齐一点&#xff0c;如果小数位数不一样&#xff0c;自然就对不齐了。这里提供一个方法. 1.这里举例保留小数点后4位(不足4位后面补0)。 String result String.Format("{0:F4}", 123.456); 输出结果为result123.4560&a…

Linux离线安装mysql8.0+

文章目录 1.查看是否安装过MySQL2.MySQL卸载3.下载mysql4.上传mysql到指定目录5.解压MySQL安装包6.安装1.准备工作2.开始安装3.查看MySQL版本 7.修改my.cnf配置文件8.授权给mysql用户8.服务初始化10.启动MySQL11.登录12.修改密码13.设置远程登录1连接超时问题2确认网络3查看端口…

STL vector 详解

STL vector 详解 STL vector 详解 STL vector 详解一级目录二级目录三级目录 1. vector容器2. vector 容器的初始化函数1.初始化2.案例 3. vector的访问函数1. 成员函数访问2. 操作符[ ]访问3.案例 4. vector的插入函数1. 语法2. 案例 5. vector的删除函数1.语法2. 案例 6. vec…

Vue el-table 多表格联合显示、合并单元格

原型图 分析 先看内容是三个表&#xff0c;每个表的合并单元格都有点不同。 按照原型图给的内容&#xff0c;第一个是两列&#xff0c;有行合并和列合并&#xff0c;还有表头行合并。 现根据图造出mock数据&#xff0c;然后再写对应的代码。 export const columnVarsData {s…

数据结构day7(2023.7.21)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;折半查找/二分查找 1-------100 key8850---10075-100int arr[]{12,23,33,45,66,78,99};key7912,23,33,45,66,78,990 6low mid high66, 78, 99mid1 mid highlow99lowhigh…

进程间的通信之管道(匿名管道)

文章目录 进程间通信&#xff08;IPC&#xff09;管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信&#xff08;IPC&#xff09; inter process conmmunication &#x1f447;&#x1f447;&#x1f…

现场总线协议转换网关快速选型介绍

现场总线协议是一种用于设备间通信的标准化接口&#xff0c;它支持数字信号和信息在不同设备之间的传输&#xff0c;例如传感器、执行器、控制器等。捷米特总线协议网关支持Profinet/DeviceNet/EthernetIP/EtherCAT/RS485/Profibus/ModbusRTU/TCPIP/CAN/CANopen/CC-Link等工业网…

【教学类-36-09】20230722职业抽卡(midjounery-niji)(涂色、裁剪、游戏)

作品展示&#xff1a; 随机选学具&#xff0c;辨认职业名称、说说工作内容、涂色、裁剪、交换卡片等 灵感来源&#xff1a; 最近在网上搜索“midjounery 简笔画”&#xff0c;发现一条宝藏“关键词”——可以直接生成简笔画风格&#xff08;造型的外边框线加粗&#xff09;的样…

【Elasticsearch】ES简单快速入门

ES简单快速入门 概述 Elasticsearch是一个分布式全文搜索引擎 下载与安装 https://www.elastic.co/cn/downloads/elasticsearch下载之后 解压文件夹&#xff0c;进入bin目录&#xff0c;双击elasticsearch.bat文件 一开始初始化时间比较久&#xff0c;之后初始化之后&…

Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现

本文基于Istio 1.18.0版本进行源码学习 1、Pilot-Discovery工作原理 Pilot-Discovery是Istio控制面的核心&#xff0c;负责服务网格中的流量管理以及控制面和数据面之间的配置下发 Pilot-Discovery从注册中心&#xff08;如Kubernetes&#xff09;获取服务信息并汇集&#xff…