接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock

news2024/11/30 12:49:13

一、应用背景

因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分。

先来看应用场景,App 经常会有一些信息展示的列表页,比如商家的菜品、股票的公司、文章的列表展示等,例如下面这样:

菜品不够吃的话~不是,是菜品数量较少不够测试的量,假如我们想要测试几百个菜品时,会不会在刷的时候是否有性能影响,展示是否正常,列表展示的边界值测试等;

而要测就得有数据展示,这个时候要是通过后端去找或者造这么多数据是有点麻烦的,其实我们这个测试的测试点就是要测试前端页面的展示和性能,只要有这部分数据就可以,无所谓数据是否真实从数据库得来。

这个时候可以就可以利用mock的手段,对这种大数据进行等价类的生成,使前端可以拿到这类数据即可,而Charles正是我们实现手工mock测试的利器之一!

二、jq 简介

2.1 jq 的概述与用途

按惯例,先看官网对jq的解释:

jq 官网地址:https://stedolan.github.io/jq/

大概意思就是轻量灵活的Json处理命令行。

用途

说到这大概有些人有点感觉它能用来做什么了,为啥手工mock要使用jq了?没错!要用它来处理接口返回的json数据以达到mock的效果。

2.2 jq 的下载安装

  • Mac:Mac还是一如既往的简单(香~),装了Homebrew 的话一条命令brew install jq即可

  • 其他系统:jq 的官网很贴心,给出了各个系统的下载方式及其相关所需下载工具的链接,具体的就查看官网吧,链接如下

https://stedolan.github.io/jq/download/

2.3 jq 的基本使用

  • 基本过滤 .

最简单的过滤,.这是一个过滤器,它接受输入,并将其不变地生成为输出。

简单的说就是原样输出来:

    $ echo '{"jq": "jqTest"}' | jq '.'    {      "jq": "jqTest"    }
 

  • 对象过滤 .key、.key1.key2、.["key"]

可以通过.key或.key1.key2的方式来获取对应的value,这样的方式是不是有点像jsonpath?
    $ echo '{"jq": {"jqTest": 1} }' | jq '.jq'    {      "jqTest": 1    }    $ echo '{"jq": {"jqTest": 1} }' | jq '.jq.jqTest'    1    $ echo '{"jq": {"jqTest": 1} }' | jq '.["jq"]'    {      "jqTest": 1    }
 

  • 索引过滤 .key[index]、.key[ startIndex: endIndex]

其实就是在对象过滤的基础上加个索引而已,学过编程的都懂的~ 左闭右开,当然是针对数组的操纵,这里就以一种对象过滤写法基础上举例子,

.key[index]

    $ echo '{"jq": ["jqTest",1] }' | jq '.jq[0]'    "jqTest"
 

.key[ startIndex: endIndex]

    $ echo '{"jq": ["jqTest",1] }' | jq '.jq[0:1]'    [      "jqTest"    ]
 

  • 对象构建 {} 、[]

可以利用{} 、[]构建新的对象(数组)
    $ echo '{"jq": ["jqTest",1] }' | jq '{ newJq: .jq[1], }'    {      "newJq": 1    }
 

如果其中一个表达式有多个结果,那么输出也会产生多个结果

    $ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{user, title: .titles[]}'    {      "user": "stedolan",      "title": "JQ Primer"    }    {      "user": "stedolan",      "title": "More JQ"    }

如果key是不存在的,value将会赋值为null

    $ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{user111, title: .titles[]}'    {      "user111": null,      "title": "JQ Primer"    }    {      "user111": null,      "title": "More JQ"    }

如果再键的周围加括号就意味着它将作为表达式进行计算。

    $ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' |jq '{(.user): .titles[]}'    {      "stedolan": "JQ Primer"    }    {      "stedolan": "More JQ"    }

  • 其他常见用法

计算

        echo "10" | jq '(.+2)*5'        echo null | jq '{a: 1} + {b: 2} + {c: 3} + {a: 42}'        echo '["xml", "yaml", "json"]' | jq '. - ["xml"]'        echo '{"a":5}' | jq ‘.a+=10'
    

获取长度

        echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length’
    

  • 数组运算

这里要特别介绍一下数组的运算操作,也是下面实现目标的手段

jq 对于数组可以有并集(’+’)和差集(’-’)的操作:

并集('+'):有数组a,b; a+b就会得到一个包含所有a,b数组元素的新数组:

        $ echo '{"a": [1,2,3] ,"b": [3,4,5]}' | jq '.a+.b'        [          1,          2,          3,          3,          4,          5        ]
   

差集('-'):有数组a,b; a-b就会得到一个只包含a中元素,不包含b中元素的新数组:

        $ echo '{"a": [1,2,3] ,"b": [3,4,5]}' | jq '.a-.b'        [          1,          2        ]
    

  • 更多用法

更多用法可参考官网:

https://stedolan.github.io/jq/manual/#Basicfilters

3、Mock 实现

3.1 实现目标

如下图中的科普推荐栏目中有 2 则科普文章,现在想要mock几十甚至上百篇文章或广告。

3.2 数据准备

  • 抓取接口的响应json报文如下:

    {        "code": 1,        "msg": null,        "data": {            "pageNumber": 0,            "pageSize": 10,            "totalElements": 12,            "totalPages": 2,            "pageList": [{                "id": 18,                "title": "老年痴呆症有哪些危害?",                "type": "patient",                "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",                "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"            }, {                "id": 17,                "title": "你了解老年痴呆是如何发病的嘛?",                "type": "patient",                "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",                "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"            }]      }    }
 

  • 我们将数据存入json文件中,然后赋值给一个变量

    $ mockData=$(cat /tmp/guanggao.json)    $ echo "$mockData"    {        "code": 1,        "msg": null,        "data": {            "pageNumber": 0,            "pageSize": 10,            "totalElements": 12,            "totalPages": 2,            "pageList": [{                "id": 18,                "title": "老年痴呆症有哪些危害?",                "type": "patient",                "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",                "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"            }, {                "id": 17,                "title": "你了解老年痴呆是如何发病的嘛?",                "type": "patient",                "img": "https://greenvalley.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",                "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"            }]      }    }
 

  • 然后我们利用jq对pageList中的列表进行+=操作,完成一次翻倍增长,将结果传给变量mockData。

这里用到的是jq对数组的并集(‘+’)运算,两个数组相加,最终得到一个包含两个数组所有元素的新数组。
    mockData=$(echo "$mockData" | jq '.data.pageList+=.data.pageList')    $ echo "$mockData"    {      "code": 1,      "msg": null,      "data": {        "pageNumber": 0,        "pageSize": 10,        "totalElements": 12,        "totalPages": 2,        "pageList": [          {            "id": 18,            "title": "老年痴呆症有哪些危害?",            "type": "patient",            "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"          },          {            "id": 17,            "title": "你了解老年痴呆是如何发病的嘛?",            "type": "patient",            "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"          },          {            "id": 18,            "title": "老年痴呆症有哪些危害?",            "type": "patient",            "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/a295c2081459450ba6679db48d6a2471_700_360.png",            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAH</p>"          },          {            "id": 17,            "title": "你了解老年痴呆是如何发病的嘛?",            "type": "patient",            "img": "https://gv.oss-cn-shanghai.aliyuncs.com/hospital/953fc541af7b4576b233d2d6b364bddf_700_360.png",            "content": "<p>https://fx.wxbjq.net.cn/preview/6cAK</p>"          }        ]      }    }
 

按照上述的方法,每次列表的元素个数都会翻倍,也就是操作n次就变成2的n次方倍,指数增长的速度就不用多说了~

这样根据自己的需要得到数据后将新数据存入json文件,最重要的数据准备过程也就完成了:

    $ echo "$mockData" > /tmp/MockTest.json
 

3.3 Charles 的 Mock 实现

说了这么多“废话”,总算是到了主角了,其实数据准备好了,工具的使用还是很简单的,Charles有一个叫做Map Local的功能,在你要mock的请求上右击就可找到:

Map Local可以对指定的接口返回使用本地文件进行替换,如这里替换为上文中废话半天生成的数据文件MockTest.json

然后再次刷新页面,看看效果,页面的列表就如愿倍增了,也不用去数据库添加数据,保存一份json文件即测即用即可:

以上,期待大家一起交流,多多指正。

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

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

相关文章

真无线蓝牙耳机怎么选?分体式蓝牙耳机选购攻略及推荐

近年来&#xff0c;随着智能手机终端市场的崛起&#xff0c;无线蓝牙耳机的产销也随之呈持续增长的态势。真无线蓝牙耳机凭借其时尚、便捷性&#xff0c;迅速成为年轻人出门必备的数码单品之一。蓝牙耳机经过多年发展&#xff0c;其产品种类、品牌型号数不胜数。导致&#xff0…

springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

目录前言1. ApplicationListener1. 简单的全局监听2. 定时任务3. 监听自定义事件2. SmartApplicationListener1. 简单使用2. 方法介绍3. EventListener前言 监听器&#xff1a; 当某个事件触发的时候&#xff0c;就会执行的方法块。 springboot提供了两个接口来实现监听&…

Paddle进阶实战系列(一):保险文本视觉认知问答

保险文本视觉认知问答 1.项目介绍 1.1背景 随着人工智能技术的逐渐成熟&#xff0c;计算机视觉、语音、自然语言处理等技术在金融行业的应用从广度和深度上都在加速&#xff0c;这不仅降低了金融机构的运营和风险成本&#xff0c;而且有助于提升客户的满意度&#xff0c;比如…

Rhec第二次作业

两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器准备两台虚拟机并保证可以ping通网络&#xff0c;ip地址不一样第一台机器配置创建rhce用户在rhce用户上&#xff0c;创建密钥对并将公钥发送给第…

JDK源码(二)ConcurrentHashMap-JDK1.7

1.背景 并发编程中&#xff0c;ConcurrentHashMap是一个使用度非常高的数据结构。 优点: 线程安全相比于HashTable和Collections.synchronizedMap()效率高&#xff0c;使用了分段锁技术。 2.ConcurrentHashMap数据结构 Segment Segment继承了ReentrantLock&#xff0c;所以它…

Java设计模式-桥接模式Bridge

传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图: 类图 问题 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

【Kotlin】标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

文章目录一、apply 标准库函数二、let 标准库函数Kotlin 语言中 , 在 Standard.kt 源码中 , 为所有类型定义了一批标准库函数 , 所有的 Kotlin 类型都可以调用这些函数 ; 一、apply 标准库函数 Kotlin 标准库函数 中的 apply 函数 , 该函数可以看作 实例对象 的 配置函数 , 传…

现货黄金术语汇总

有的投资者可能并不是新手&#xff0c;可能之前对股票投资的一些术语有一定的了解甚至说是经验。但是转到现货黄金市场的时候&#xff0c;还是对很多术语感到很陌生&#xff0c;下面小编针对一些与股票不一样的现货黄金术语进行介绍&#xff0c;希望可以帮助投资者们尽快"…

前言技术之swagger

一.前后端分离的特点前后端分离是的前端与后端之间的职责更加明确 后台&#xff1a; 负责业务处理 前端&#xff1a; 负责显示逻辑 在这种情况下&#xff0c;前端和后端可以分别交付给专业的开发人员去做&#xff0c;所以是必须要定义前后端直接的对接 接口&#xff0c;否则各自…

liblas读取点云,设置半透明

一&#xff0c;用Liblas读取点云数据&#xff0c;获取点云位置和颜色 二&#xff0c;将点云位置和颜色分别代入geode的位置数组和颜色数组 三&#xff0c;用glsl设置半透明。需要注意的是 1&#xff0c;颜色数组是用attribute,所以要用 geom->setVertexAttribArray(10, colo…

Wireshark抓包分析DHCP

1、DHCP简介动态主机设置协议&#xff08;英语&#xff1a;Dynamic Host Configuration Protocol&#xff0c;DHCP&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用于内部网或网络服务供应商自动分配IP地址&#xff1b…

从0到1完成一个Vue后台管理项目(十五、作业列表、表格数据方法的封装)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

解决虚拟机安装 VMware Tools 灰色无法点击问题

环境&#xff1a; 主机 OS: Windows 11 虚拟机平台: VMware Workstation 17 Pro 虚拟系统: Ubuntu 22.04 1. 问题 安装好 Linux 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工具&#xff0c;最简单的办法就是通过虚拟机平台的 “一键安装”&a…

Java之ATM系统

目录项目介绍系统准备&#xff0c;首页设计总结开户功能总结用户登录总结用户操作页设计、查询账户、退出账户功能用户存钱取款功能转账功能密码修改、销户源代码项目介绍 系统准备&#xff0c;首页设计 总结 1、用户的账户信息&#xff0c;系统如何表示的? 定义账户类Accoun…

【CVHub】现代目标检测故事 | 40+目标检测网络架构大盘点!从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2

本文来源“CVHub”公众号&#xff0c;侵权删&#xff0c;干货满满。 作者丨派派星 来源丨CVHub 原文链接&#xff1a;现代目标检测故事 | 40种网络架构大盘点&#xff01;从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2 导读 目标检测是指在图像或视频中分…

PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片&#xff0c;集成32-bit高性能低功耗MCU&#xff0c;16KB OTP&#xff0c;8KB Retention SRAM和64KB ROM&#xff0c;可选EEPROM。内置高性能多模射频收发机最大发射功率10dBm&#xff0c;BLE 1Mbps速率下接收灵敏…

快手发布2022直播生态报告,运营人速览

1、快手电商推出2023年直播间联合补贴活动1月5日&#xff0c;快手电商推出2023年直播间联合补贴活动。该活动主要目的是助力主播完成更高销售额&#xff0c;报名成功后&#xff0c;平台将对直播间内的一部分活跃用户发放10%-16%折扣率的满减优惠券&#xff0c;成本由平台和主播…

【BUG解决方案】jQuery数组中包含数据,但通过 .length 获得的数组长度始终为0

0. BUG展示 var lels []; for (var i 0; i < maxDevNums 1; i) {lels.push([]); } $.ajax({type : "post",async : true,url : "/sc/comb/history/data",data : {},dataType : "json",success : function (result) {if (result) {for (le…

FFmpeg 集成 x265 编译及解码

x265 是一个免费的软件库和应用程序&#xff0c;用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式&#xff0c;并在 GNU GPL 条款下发布。 FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译&#xff0c;在编译 FFmpeg 之前需要先编译 x265&#xff0c;但并不是所有的版本都能…

Python一轮知识拾遗

目录 字符串格式化 %格式符 format字符串格式化 三元条件运算符 可迭代对象 break和continue语句 enumerate函数 序列封包 序列解包 部分序列解包 append.列表和extend.列表的区别 字符串格式化 通过字符串的格式化&#xff0c;可以输出特定格式的字符串。 (1) 格式化…