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

news2024/12/23 4:58:28

接口测试仅仅掌握 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 base64import jsonimport requestsclass 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"]:            pass        elif "websocket" == data["schema"]:            pass        else:            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"        }

还是通过请求信息的结构体中的 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)

总结

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

  1. 如果知道使用的是哪个通用加密算法的话,可以自行解决。

  1. 如果不了解对应的加密算法的话,可以让研发提供加解密的 lib。

  1. 如果既不是通用加密算法、研发也无法提供加解密的 lib 的话,可以让加密方提供远程解析服务,这样算法仍然是保密的。

本文主要讲的是在了解使用加密算法的情况下,如何处理这样的解密算法。但是封装的思路都是相通的,不管是面对哪种情况,都可以通过格式化的数据,指明数据的内容,并通过一层逻辑的封装,将加解密或者选择的协议封装进去。

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

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

相关文章

GO语言基础-06-匿名函数和闭包

文章目录1. 匿名函数概念语法示例2. 闭包概念语法语法示例1. 匿名函数 概念 如其名,匿名函数不声明函数名。因此要调用匿名函数只能定义一个变量等于该匿名函数。 语法 func(参数 参数类型)(返回值 返回值类型){函数体 }示例 代码 package mainimport "fm…

Jenkins操作文档

前言 jenkins概述 持续集成是一种实践,而jenkins可以帮助团队去尽量好的去完成这种实践 jenkins是⼀个开源软件项⽬,是基于Java开发的⼀种持续集成⼯具,⽤于监控持续重复的⼯作,旨在提供⼀个开放易⽤的软件平台,使软…

“锂”想护航|深耕重点工段,用AI为锂电池安全生产加倍提速!

行业发展DEVELOPMENT -受益于新能源汽车市场的爆发增长、“双碳”政策影响下的储能市场扩大等影响,中国锂电行业现已进入高度产业化、规模化发展时期。锂电池生产工艺较长,生产设备庞杂,专用性强,而当前已迈入国际化竞争的锂电行业…

【Vue】032-尚硅谷-尚品汇-mockjs模拟数据---20230111

032-尚硅谷-尚品汇-mockjs模拟数据 官网链接 第一步:安装依赖包mockjs 安装mockjs npm install --save mockjs第二步:在src文件夹下创建一个文件夹mock。 第三步:准备模拟的数据。! mock/banner.json [{"id": "1","imgUrl": &q…

哪种蓝牙耳机音质好?2023公认音质最好的蓝牙耳机推荐

现如今,蓝牙耳机的使用频率越来越高,其在音质上的表现也越来越好。那么,在众多的蓝牙耳机当中,哪种蓝牙耳机音质好?下面,我来给大家推荐几款公认音质最好的蓝牙耳机,一起来看看吧。 一、南卡小…

(十七)Java的时间与日期(1)

目录 前言: ①Date类 ②SimpleDateFormat类 ③Calendar 前言: 时间和日期. 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分析,集群节…

深入浅出变长结构体

1、 问题的引出 项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如如下的包头:88 0f 0a ob cd ef 23 00 。长度由头2个字节880f决定,考虑字节序,转为0f88,转为10进制3976个字节的…

汽车零部件行业追溯系统的应用

汽车行业正处于一个蓬勃发展的阶段,随着客户需求的不断变化,生产厂商推出新款商品的速度也越来越快,新项目和变更的不断出现,就可能导致在交付的产品质量方面遇到各种各样的问题。如果这些质量问题得不到及时有效地追溯和控制&…

知识点滴 - PLC培训笔记

如上图所示,这个设备就是PLC的应用场景,对外控制很多接口电路,交流直流,不同大小电流、电压的电路。在工业上使用很多。 而开发PLC程序时,是在相应的集成开发环境中,画出如下的梯形图: 什么是PL…

Vue使用Element-UI生成并展示表头序号

前言 序号算是在展示数据的时候,一种很普遍的属性了,我们可以自己写生成序号的规则,也可以借助第三方。 这里我选择后者,使用Element-UI自带的一个table属性,去生成并展示需要 首先看下我的页面,是没有序…

Apache Sling App CMS <1.1.4 存在反射型XSS漏洞(CVE-2022-46769)

漏洞描述 Apache Sling 是一个基于可扩展内容树(extensible content tree)的 RESTful Web 应用框架。 1.1.4 之前版本的 Apache Sling 中的 cms.js#confirmMessage 方法未对用户可控的 title 和 message 参数进行过滤,攻击者可将精心构造的…

dubbo源码实践-总结

自己大概花了一个月的时间,断断续续的看了一遍dubbo源码,之前的文章从实践出发搭建了dubbo各层的例子!Dubbo源码的学习也暂时告一段落。这篇就谈谈自己对dubbo源码学习个人感受!1 dubbo是什么?dubbo是一个RPC框架&…

网站优化包括对什么优化(网站优化有哪些方面)

互联网时代下,各行各业都想在在互联网中占据市场,目前网站优化成为时代的潮流,很多站长,在对网站进行优化时,稍不注意就会造成网站优化过度,这也是各位最头疼的事情,网站优化能急于求成&#xf…

KubePi <1.6.4 存在会话固定漏洞(CVE-2023-22479)

漏洞描述 KubePi 是一个 K8s 面板,允许管理员导入多个 Kubernetes 集群,并且通过权限控制将不同 cluster、namespace 的权限分配给指定用户。 1.6.4 之前版本的 KubePi 在用户登录后未刷新用户 cookie,攻击者可通过诱导用户点击恶意链接等劫…

maven创建web工程,使用模板方式(二)

一,选择webapp模板 二,填写完信息后,创建后是如下的结构: 可以看到只有web目录,没有其他的java,resources,test目录等。 三,创建Java,resources,test目录 右键-> ma…

【C语言进阶】 指针强化练习

目录题目一题目二题目三题目四题目五题目六题目七题目八题目一 下面这段代码的执行结果是? int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d\n", *(a 1), *(ptr - 1));return 0; }解决这种数组与指针相结合的问题…

【Leetcode面试常见题目题解】2. 无重复字符的最长子串

题目描述 本文是LC第3题:无重复字符的最长子串。 题目描述如下 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 举例 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 输入:…

html实现酷炫的公司年会抽奖(附源码)

文章目录1.设计来源1.1 主界面1.2 抽奖效果1.2 中奖效果2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码源码下载作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/128640998 ht…

AI绘画日漫欧漫动态表情换脸游戏风生成红包封面流量主小程序开发

AI绘画日漫欧漫动态表情换脸游戏风生成红包封面流量主小程序开发 因全网AI绘画大量小程序被封禁下架。只有采用合规稳定运营引擎。 文生图图动日漫图生欧漫图转动图人物表情变脸换脸3D动漫集成7大AI制图模式 支持个人模式和企业支付。趣味AI制图支持流量主。 打造一款适合个人…

uniapp 画中画悬浮窗(视频) Ba-VideoPip

简介(下载地址) Ba-VideoPip 是一款画中画方式的视频悬浮窗插件。支持点播、直播;支持官方、三方播放器无缝切换;支持动态刷新(如切换视频或进度)。 支持点播、直播支持官方、三方播放器无缝切换支持动态…