接口测试 Mock 实战 | 结合 jq 完成批量化的手工 Mock
本文霍格沃兹测试学院学员学习实践笔记。
一、应用背景
因为本章的内容是使用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":
} $ echo '{"jq": {"jqTest": 1} }' | jq '.jq.jqTest' $ echo '{"jq": {"jqTest": 1} }' | jq '.["jq"]'
{
"jqTest":
}
索引过滤
.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":
}
如果其中一个表达式有多个结果,那么输出也会产生多个结果
$ 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 "" | 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+='
获取长度
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'
[
,
,
,
,
, ]
差集('-')
:有数组a
,b
;a-b
就会得到一个只包含a
中元素,不包含b
中元素的新数组:
$ echo '{"a": [1,2,3] ,"b": [3,4,5]}' | jq '.a-.b'
[
, ]
更多用法
更多用法可参考官网:
https://stedolan.github.io/jq/manual/#Basicfilters
3、Mock 实现
3.1 实现目标
如下图中的科普推荐栏目中有 2 则科普文章,现在想要mock
几十甚至上百篇文章或广告。
3.2 数据准备
抓取接口的响应
json
报文如下:
{
"code": ,
"msg": null,
"data": {
"pageNumber": ,
"pageSize": ,
"totalElements": ,
"totalPages": ,
"pageList": [{
"id": ,
"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": ,
"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": ,
"msg": null,
"data": {
"pageNumber": ,
"pageSize": ,
"totalElements": ,
"totalPages": ,
"pageList": [{
"id": ,
"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": ,
"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": ,
"msg": null,
"data": {
"pageNumber": ,
"pageSize": ,
"totalElements": ,
"totalPages": ,
"pageList": [
{
"id": ,
"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": ,
"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": ,
"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": ,
"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
文件即测即用即可:
以上,期待大家一起交流,多多指正。
更多测试技术分享点此关注
接口测试 Mock 实战 | 结合 jq 完成批量化的手工 Mock的更多相关文章
- 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分.先来看应用场景,App 经常会有一些信息展示的列表页,比如商家的菜品.股 ...
- Python接口测试实战4(上) - 接口测试框架实战
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试框架实战与自动化进阶☝☝☝
Python接口测试框架实战与自动化进阶☝☝☝ 一.fiddler在工作中的运用 1.如何抓接口 抓紧手机端接口 ①.在电脑终端输入:ipconfig ,找到电脑ip ②.打开手机,连接WiFi, ...
- Python接口测试框架实战与自动化进阶✍✍✍
Python接口测试框架实战与自动化进阶 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看 ...
- 抓包分析与mock实战
Charles下载安装 官网下载安装:https://www.charlesproxy.com/ 电脑证书配置 如果不配置证书,无法抓取https协议 配置证书: 1 - 打开Charles,在hel ...
- 接口测试框架实战(一) | Requests 与接口请求构造
1080×388 33.4 KB Requests 是一个优雅而简单的 Python HTTP 库,其实 Python 内置了用于访问网络的资源模块,比如urllib,但是它远不如 Requests ...
- 接口测试Fiddler实战20150921
(写好的文章被不小心删掉了,现在补一篇) 项目背景: 1.接口URL:http://192.168.xx.xx:8080/mserver/rest/ms 2.接口参数:data=xxxxx&k ...
- 接口测试框架实战(三)| JSON 请求与响应断言
关注公众号,获取测试开发实战干货合辑.本文节选自霍格沃兹<测试开发实战进阶>课程教学内容. 数据驱动就是通过数据的改变驱动自动化测试的执行,最终引起测试结果的改变.简单来说,就是参数化在自 ...
- Web 前端实战:JQ 实现树形控件
前言 这是一篇个人练习 Web 前端各种常见的控件.组件的实战系列文章.本篇文章将介绍个人通过 JQuery + 无序列表 + CSS 动画完成一个简易的树形控件. 最终实现的效果是: 这样结构比较复 ...
随机推荐
- PHP array_pad() 函数
实例 返回 5 个元素,并将 "blue" 值插入到数组的新元素中: <?php$a=array("red","green");pri ...
- PHP fstat() 函数
定义和用法 fstat() 函数返回关于一个打开的文件的信息. 该函数将返回一个包含下列元素的数组: [0] 或 [dev] - 设备编号 [1] 或 [ino] - inode 编号 [2] 或 [ ...
- PHP hex2bin() 函数
实例 把十六进制值转换为 ASCII 字符: <?phpecho hex2bin("48656c6c6f20576f726c6421");?> 以上实例输出结果: He ...
- 二维线段树->树套树
现在上真正的二维线段树 毕竟 刚刚那个是卡常 过题我们现在做一个更高级的做法二维线段树. 大体上维护一颗x轴线段树 然后在每个节点的下方再吊一颗维护y轴的线段树那么此时我们整个平面就被我们玩好了. 这 ...
- asp.net core 2.1的全局模型验证统一方案
网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiCont ...
- Python | 面试的常客,经典的生产消费者模式
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...
- 解决Xshell 工具连接不上VirtualBox虚拟机
初次尝试用VirtualBox安装Linux虚拟机,却遇到了一些问题,特地记录于此,方便后面查阅! 首先简易记录下安装Linux虚拟机过程: 大致经过如下步骤:新建虚拟电脑,加载Linux版本镜像安装 ...
- 从零搭建Spring Boot脚手架(2):增加通用的功能
1. 前言 今天开始搭建我们的kono Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问 ...
- JavaScript calss语法糖
JavaScript calss语法糖 基础知识 严格意义上来讲,在Js中是没有类这一概念的. 我们可以运用前面章节提到的构造函数来模拟出类这一概念,并且可以通过原型对象的继承来完美的实现实例对象方法 ...
- 基于Asp.net Core 3.1实现的Redis及MemoryCache缓存助手CacheHelper
这几天在面试,这个关于Redis缓存的博客一直没空写,今天总算有点时间了. 从很久很久之前,我就一直想学Redis了,反正看到各大招聘网上都要求Redis,不学就太落后了. 一开始我是按微软官网文档那 ...