接口测试框架实战 | 流程封装与基于加密接口的测试用例设计

因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分。
先来看应用场景,App 经常会有一些信息展示的列表页,比如商家的菜品、股票的公司、文章的列表展示等,例如下面这样:
菜品不够吃的话~不是,是菜品数量较少不够测试的量,假如我们想要测试几百个菜品时,会不会在刷的时候是否有性能影响,展示是否正常,列表展示的边界值测试等;
而要测就得有数据展示,这个时候要是通过后端去找或者造这么多数据是有点麻烦的,其实我们这个测试的测试点就是要测试前端页面的展示和性能,只要有这部分数据就可以,无所谓数据是否真实从数据库得来。
这个时候可以就可以利用mock的手段,对这种大数据进行等价类的生成,使前端可以拿到这类数据即可,而Charles正是我们实现手工mock测试的利器之一!
按惯例,先看官网对jq的解释:
jq 官网地址:https://stedolan.github.io/jq/
大概意思就是轻量灵活的Json处理命令行。
用途
说到这大概有些人有点感觉它能用来做什么了,为啥手工mock要使用jq了?没错!要用它来处理接口返回的json数据以达到mock的效果。

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何完成的。
首先在做用例分析之前,可以通过追查公司一年来所有的故障原因,定位问题起因,或者通过与 CTO、产品经理、研发、运维、测试调查,得到质量痛点,还可以分析业务架构、流程调用,以及监控系统了解到业务的使用数据,从而得到质量需求。
得到质量需求之后,通过与产品经理、项目经理、研发总监等对接后得知待测业务范围、业务场景用例、业务接口分析,从而确定公司的测试计划。将测试计划与质量需求结合进行分析,就可以开始进行业务用例的设计,而接口测试用例分析,也在其内。
https://ceshiren.com/uploads/default/original/3X/a/9/a9e2168a50554fbb24d8d208c7a7dbf72b1c1c50.png)
接口封装思想主要分为 3 个大维度:配置、接口封装、业务流程。其中:

  • 配置主要用作根据配置文件获取初始配置和依赖;
    • 接口封装遵循 APIObject 设计模式,对接口的调用进行抽象封装;
    • 业务流程则负责数据初始化、业务用例设计,包含有多个 API 形成的流程定义,不要再包含任何接口实现细节、以及断言。
  • 下面将会与实战案例结合,进行详细的介绍。
  • 由于信息安全原因,许多接口在传输的时候会对请求与响应进行加密处理,如果直接对这部分数据做断言显然是行不通的。还需要对这部分接口额外进行解密的处理之后,才可以对已解密的接口进行断言。
  • 在进行实战之前,需要先准备一个对响应加密的接口。对它发起一个 get 请求后,得到一个加密过后的响应信息。
  • 先准备一个 JSON 格式 demo:
  • 使用 base64 对其做加密,得到一个加密后的文件 demo64.txt
  • 使用 Python 命令在 “demo64.txt” 所在目录启动一个服务
  • 启动后的样子如图:
  • https://ceshiren.com/uploads/default/original/3X/a/8/a81aa06774d14929778820a4801f5304b1683cb2.png)

如果请求成功的话就代表环境已经准备成功
调用 base64,直接对返回的请求做解密,即可得到解密后的响应,将解密后的响应转为 JSON 格式,此时就可以对这个返回值做断言且不会报错了。
这样的写法显然不够优雅,如果被测接口的协议发生变化,Requests 库无法支持改变后的协议,需要调用别的第三库发送请求信息,则还是需要修改底层的源码。碰到这种情况,可以增加一层封装,构造一层更加通用的发送方法。
首先需要通过一个字典的结构体,保存所有的请求信息,包括发送的协议、解码方式、请求 method 等等,而这种字典形式的结构体也为后面的数据驱动改造做好了一个重要的铺垫。
通过请求信息的结构体中的schema,添加判断条件,去选择不同的请求协议。举个例子,如果 schema 为“http”的话,就选择调用被封装的 requests 库。
调用在ApiRequest类中的send方法发送请求并进行断言
如果面对不同的算法,还需要修改底层的源码,所以需要把算法封装。需要使用哪个算法,就使用哪个。封装的思想与上面相同。首先在字典结构体中添加一个 encoding 字段,用来判断选择的不同的加密条件。
还是通过请求信息的结构体中的 encoding,添加判断条件,去选择不同的解密方式。
首先需要明确在面对一个加密的响应结果,可以使用什么样的处理方式:
1.如果知道使用的是哪个通用加密算法的话,可以自行解决。
2.如果不了解对应的加密算法的话,可以让研发提供加解密的 lib。
3.如果既不是通用加密算法、研发也无法提供加解密的 lib 的话,可以让加密方提供远程解析服务,这样算法仍然是保密的。
本文主要讲的是在了解使用加密算法的情况下,如何处理这样的解密算法。但是封装的思路都是相通的,不管是面对哪种情况,都可以通过格式化的数据,指明数据的内容,并通过一层逻辑的封装,将加解密或者选择的协议封装进去。
推荐学习

接口测试框架实战,推荐霍格沃兹出品 《测试开发实战进阶》课程,BAT 大厂前沿实践,开源项目作者亲授。

4 个月 20+ 项目实战强化训练,测试大咖思寒授之以渔,一站式掌握 BAT 测试开发工程师必备核心技能(对标阿里P6+,年薪50W+)!学员直推 BAT 名企测试经理,普遍涨薪 50%+!

14 期火热招生中
【相关文章】

  • 接口测试框架实战(一) | Requests 与接口请求构造
    • 接口测试框架实战(二)| 接口请求断言
      提升自己的核心竞争力吧
      原文链接

更多技术文章分享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRyH51v4-1650338606554)([外链图片转存中…(img-hXkwo6HP-1650338601302)]]
1.请求行的 method 不同;
2.POST 可以附加 body,可以支持 form、json、xml、binary等各种数据格式;
3.从行业通用规范的角度来说,无状态变化的建议使用 GET 请求,数据的写入与状态建议用 POST 请求;
为了避免其他因素的干扰,使用 Flask 编写一个简单的 Demo Server。
4.安装flask
5.创建一个 hello.py 文件
hello.py
6.启动服务
提示下面信息则表示搭建成功。
发起 GET 请求,a、b参数放入 URL 中发送,并保存在 get 文件中:
发起 POST 请求,a、b参数以 form-data格式发送,并保存在post 文件中:
注意:>的右边为请求内容,<左边为响应内容。
GET 请求过程
POST 请求过程
对两个文件进行对比:
https://ceshiren.com/uploads/default/original/3X/4/a/4a03ca7af2fd5c321ad29931659094b71fbb825c.png)
从图中可以清楚看到 GET 请求的 method 为 GET,POST 请求的 method 为 POST,此外,GET 请求没有 Content-Type 以及 Content-Length 这两个字段,而请求行中的 URL 带有 query 参数,是两种请求都允许的格式。(End)

推荐霍格沃兹出品《测试开发从入门到高级实战系统进阶》课程,贴近大厂一线实践内容深度行业领先。

4 个月由浅入深,强化集训,测试大咖思寒领衔主讲,授之以渔,通过 10+ 企业级项目实战演练,带你一站式掌握 BAT 测试开发工程师必备核心技能(对标阿里巴巴P6+,挑战年薪50W+)!学员直推 BAT 名企测试经理,普遍涨薪 50%+!

提升自己的核心竞争力吧
原文链接

更多技术文章分享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gzZ1mB0-1650338532670)([外链图片转存中…(img-xW4hjAjO-1650338530772)]],装了Homebrew 的话一条命令brew install jq即可

    • 其他系统:jq 的官网很贴心,给出了各个系统的下载方式及其相关所需下载工具的链接,具体的就查看官网吧,链接如下
    • 基本过滤 .
  • 简单的说就是原样输出来:
  • 对象过滤 .key、.key1.key2、.[“key”]
  • 索引过滤 .key[index]、.key[ startIndex: endIndex]
  • .key[index]
  • .key[ startIndex: endIndex]
  • 对象构建 {} 、[]
  • 如果其中一个表达式有多个结果,那么输出也会产生多个结果
  • 如果key是不存在的,value将会赋值为null
  • 如果再键的周围加括号就意味着它将作为表达式进行计算。
  • 其他常见用法:
  • 计算
  • 获取长度
  • 数组运算
  • jq 对于数组可以有并集(’+’)和差集(’-’)的操作:
  • 并集(’+’):有数组a,b; a+b就会得到一个包含所有a,b数组元素的新数组:
  • 差集(’-’):有数组a,b; a-b就会得到一个只包含a中元素,不包含b中元素的新数组:
  • 更多用法
  • 更多用法可参考官网:
  • https://stedolan.github.io/jq/manual/#Basicfilters
  • 如下图中的科普推荐栏目中有 2 则科普文章,现在想要mock几十甚至上百篇文章或广告。
    • 抓取接口的响应json报文如下:
  • 我们将数据存入json文件中,然后赋值给一个变量
  • 然后我们利用jq对pageList中的列表进行+=操作,完成一次翻倍增长,将结果传给变量mockData。
  • 按照上述的方法,每次列表的元素个数都会翻倍,也就是操作n次就变成2的n次方倍,指数增长的速度就不用多说了~
  • 这样根据自己的需要得到数据后将新数据存入json文件,最重要的数据准备过程也就完成了:
  • 说了这么多“废话”,总算是到了主角了,其实数据准备好了,工具的使用还是很简单的,Charles有一个叫做Map Local的功能,在你要mock的请求上右击就可找到:
  • Map Local可以对指定的接口返回使用本地文件进行替换,如这里替换为上文中废话半天生成的数据文件MockTest.json:
  • 然后再次刷新页面,看看效果,页面的列表就如愿倍增了,也不用去数据库添加数据,保存一份json文件即测即用即可:
  • 以上,期待大家一起交流,多多指正。
  • 【相关文章】
    • 基于 Charles 代理技术的接口测试 Mock 实战 (一)
    • 接口测试策略与问题分析模型

原文链接

更多技术文章分享

猜你喜欢

转载自blog.csdn.net/hogwarts_2022/article/details/124269376