流程封装与基于加密接口的测试用例设计

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何完成的。

接口测试用例分析

首先在做用例分析之前,可以通过追查公司一年来所有的故障原因,定位问题起因,或者通过与 CTO、产品经理、研发、运维、测试调查,得到质量痛点,还可以分析业务架构、流程调用,以及监控系统了解到业务的使用数据,从而得到质量需求

得到质量需求之后,通过与产品经理、项目经理、研发总监等对接后得知待测业务范围、业务场景用例、业务接口分析,从而确定公司的测试计划。将测试计划与质量需求结合进行分析,就可以开始进行业务用例的设计,而接口测试用例分析,也在其内。

质量需求样例
测试痛点公司的接口一直不稳定影响用户的使用
质量反馈最近半年来出现了几次大的故障
回归测试每次升级都会影响老的功能
测试策略目前公司没有可靠的测试体系
重构测试微服务话改造需要有良好的测试体系保证

接口测试封装思想

接口封装思想主要分为 3 个大维度:配置、接口封装、业务流程。其中:

  • 配置主要用作根据配置文件获取初始配置和依赖;
  • 接口封装遵循 APIObject 设计模式,对接口的调用进行抽象封装;
  • 业务流程则负责数据初始化、业务用例设计,包含有多个 API 形成的流程定义,不要再包含任何接口实现细节、以及断言。

下面将会与实战案例结合,进行详细的介绍。

基于加密接口的测试用例设计

由于信息安全原因,许多接口在传输的时候会对请求与响应进行加密处理,如果直接对这部分数据做断言显然是行不通的。还需要对这部分接口额外进行解密的处理之后,才可以对已解密的接口进行断言。

环境准备

在进行实战之前,需要先准备一个对响应加密的接口。对它发起一个 get 请求后,得到一个加密过后的响应信息。

先准备一个 JSON 格式 demo:

{"topics":
{
"orange":"movie",
"shool":"testing-studio",
"president":"seveniruby"
}
}

使用 base64 对其做加密,得到一个加密后的文件 demo64.txt

base64 demo.json >demo64.txt

使用 Python 命令在 “demo64.txt” 所在目录启动一个服务

python -m http.server 10000

启动后的样子如图:

使用curl命令对这个服务进行get请求:

curl http://127.0.0.1:10000/demo64.txt

如果请求成功的话就代表环境已经准备成功

实战练习

调用 base64,直接对返回的请求做解密,即可得到解密后的响应,将解密后的响应转为 JSON 格式,此时就可以对这个返回值做断言且不会报错了。

import base64
import json
import requests
class TestEncode:url = "http://127.0.0.1:10000/demo64.txt"def test_encode(self):r = requests.get(self.url)encode = json.loads(base64.b64decode(r.content))assert encode["topics"]["president"] == "seveniruby"

这样的写法显然不够优雅,如果被测接口的协议发生变化,Requests 库无法支持改变后的协议,需要调用别的第三库发送请求信息,则还是需要修改底层的源码。碰到这种情况,可以增加一层封装,构造一层更加通用的发送方法。

首先需要通过一个字典的结构体,保存所有的请求信息,包括发送的协议、解码方式、请求 method 等等,而这种字典形式的结构体也为后面的数据驱动改造做好了一个重要的铺垫。

 req_data={"schema": "http","method": "get","url": "http://127.0.0.1:10000/demo64.txt","headers": None}

通过请求信息的结构体中的schema,添加判断条件,去选择不同的请求协议。举个例子,如果 schema 为“http”的话,就选择调用被封装的 requests 库。

 class ApiRequest:#构造send方法,通过def send(self, data: dict):if "http" == data["schema"] :res = requests.request(data["method"],data["url"],header=data["headers"])return json.loads(base64.decode(res.content))elif "dubbo" ==  data["schema"]:passelif "websocket" == data["schema"]:passelse:pass        

调用在ApiRequest类中的send方法发送请求并进行断言

class TestEncode:def test_api(self):req_data={"schema": "http","encoding": "base64","method": "get","url": "http://127.0.0.1:10000/demo64.txt","headers": None}re = ApiRequest()data = re.send(req_data)assert data["topics"]["president"] == "seveniruby"

如果面对不同的算法,还需要修改底层的源码,所以需要把算法封装。需要使用哪个算法,就使用哪个。封装的思想与上面相同。首先在字典结构体中添加一个 encoding 字段,用来判断选择的不同的加密条件。

 req_data={"schema": "http","method": "get","url": "http://127.0.0.1:10000/demo64.txt","headers": None,"encoding": "base64"}

TEXT 复制 全屏

还是通过请求信息的结构体中的 encoding,添加判断条件,去选择不同的解密方式。

class ApiRequest:def send(self, data: dict):if "http" == data["schema"] :res = requests.request(data["method"],data["url"],headers=data["headers"])return json.loads(base64.b64decode(res.content))#通过请求信息的结构体中的`encoding`,去选择不同的解密方式。if data["encoding"] == "base64":return json.loads(base64.b64decode(res.content))elif data["encoding"] == "private":return json.loads(requests.post("url", data=res.content).content)else:return json.loads(res.content)

TEXT 复制 全屏

总结

首先需要明确在面对一个加密的响应结果,可以使用什么样的处理方式:

  1. 如果知道使用的是哪个通用加密算法的话,可以自行解决。
  2. 如果不了解对应的加密算法的话,可以让研发提供加解密的 lib。
  3. 如果既不是通用加密算法、研发也无法提供加解密的 lib 的话,可以让加密方提供远程解析服务,这样算法仍然是保密的。

Python接口自动化测试零基础入门到精通(2023最新版)

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

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

相关文章

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考:在一个线程 T1 中如何优雅的终止线程 T2? 错误思路1:使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释 …

postgresql的windows

1. 资源下载: https://www.postgresql.org/download/windows/ 2. 安装 双击,指定D盘目录,接下来默认安装,一直到出现下面的最后一步。一定要去除勾选复选框。 在最后,点击FINISH。 3. 初始化 4. 检查和修改配置 1&am…

数据结构:优先级队列(堆)

概念 优先级队列是啥? 队列是一种先进先出 (FIFO) 的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列。 在这种情况下, 数据结构应该提供两个最基本的…

converted from warning

converted from warning 关注微信:生信小博士 本地或者其它服务器跑同样的代码是正常的,只是有警告,但是在西柚云服务器上面运行会报错? 这是由于您两个环境使用的包版本不一样导致的,有如下解决方法 或者之前只是告警…

Jetpack Compose | State状态管理及界面刷新

我们知道Jetpack Compose(以下简称Compose)中的 UI 可组合项是通过Composable 声明的函数来描述的,如: Composable fun Greeting() {Text(text "init",color Color.Red,modifier Modifier.fillMaxWidth()) }上面的代…

MySQL实战1

文章目录 主要内容一.墨西哥和美国第三高峰1.准备工作代码如下(示例): 2.目标3.实现代码如下(示例): 4.相似例子代码如下(示例): 二.用latest_event查找当前打开的页数1.准备工作代码如下(示例&…

C++设计模式_20_Composite 组合模式

Composite 组合模式和后面谈到的Iterator,Chain of Resposibility都属于“数据结构”模式。Composite 组合模式核心是通过多态的递归调用解耦内部和外部的依赖关系。 文章目录 1. “数据结构”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义4. Composite 组合模…

科普|电源自动测试系统测试的项目都有哪些?

电源自动测试系统是一种用于电源性能自动测试的集成系统,它可以自动检测电源模块或开关电源的输入、输出、保护等各个方面。该系统通常由数据软件和各类硬件测试仪器共同组成,利用通讯总线、测试夹具以及其它线缆等将仪器进行连接组成整体的系统结构&…

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

成本预算管理系统

成本预算管理系统 功能介绍: 一 基本信息: 1、产品设置:产品的长、宽、高及面积计算公式的设置。 2、板材设置:板材类别、厚度、尺寸的设置 3、系统名称:风管系统的类别设置 4、公司信息:本公司的信息…

【多线程】线程互斥 {竞态条件,互斥锁的基本用法,pthread_mutex系列函数,互斥锁的原理;死锁;可重入函数和线程安全}

一、进程线程间通信的相关概念 临界资源:多线程执行流共享的资源就叫做临界资源。确切的说,临界资源在同一时刻只能被一个执行流访问。临界区:每个线程内部,访问临界资源的代码,就叫做临界区。互斥:通过互…

基于鸟群算法的无人机航迹规划-附代码

基于鸟群算法的无人机航迹规划 文章目录 基于鸟群算法的无人机航迹规划1.鸟群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用鸟群算法来优化无人机航迹规划。 1.鸟群搜索算法 …

0基础学习PyFlink——用户自定义函数之UDF

大纲 标量函数入参并非表中一行(Row)入参是表中一行(Row)alias PyFlink中关于用户定义方法有: UDF:用户自定义函数。UDTF:用户自定义表值函数。UDAF:用户自定义聚合函数。UDTAF&…

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图 二、参数配置 1、代码示例 <t-antd-selectv-model"selectVlaue":optionSource"stepList"change"selectChange" />2、配置参数&#xff08;Attributes&#xff09;继承 a-select Attributes 参数说明类型默认值v-model绑定值…

vivado crash

将增量编译去了

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

文件改名,轻松添加前缀顺序编号,文件改名更高效!

您是否曾经需要批量修改文件名&#xff0c;并希望在文件名中添加特定的前缀或顺序编号&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具&#xff0c;帮助您轻松解决这个问题&#xff01; 第一步&#xff0c;进入文件批量改名高手主页面&#xff0c;在板块栏…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…

亚马逊,速卖通,美客多如何打造爆款商品,排名提升榜首

1、产品Listing的完整性 Listing是亚马逊A9算法认识你产品的基础&#xff0c;在发布一条listing的时候&#xff0c;尽可能地做到最好!在准备一条listing之前&#xff0c;一定事先要收集、整理足够多的产品关键词&#xff0c;在优化listing内容的时候填充进去。仔细观察优秀竞品…