测试开发 | 实战演练基于加密接口测试测试用例设计

news2024/9/23 13:24:32

image1080×594 76.4 KB

如果接口测试仅仅只是掌握一些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"]:

            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. 如果知道使用的是哪个通用加密算法的话,可以自行解决。

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

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

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

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

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

相关文章

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🧨 从零开始 verilog 以太网交换机系列专栏:点击这里 🔑未经作者允…

plt绘制点线图 点(marker)过密的解决办法

设置 markevery10 plt.plot(x, y, markero, markevery10) import matplotlib.pyplot as plt import numpy as npxnp.arange(0,2*np.pi,0.01) ynp.sin(x)fig, ax plt.subplots(constrained_layoutTrue)plt.title(markevery10)ax.plot(x, y, markero, markevery50, mfcr,mecr)…

(小甲鱼python)函数笔记合集四 函数(IV)总结 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解 二、函数中参数的作用域 作用域:一个变量可以被访问的范围,一个变量的作用域总是由它在代…

jQuery学习-01jQuery下载安装

1 jQuery的介绍 jQuery就是js函数库,里面有大量的js函数库,使用这些函数操作dom对象,做事件,动画,ajax处理; 地址:https://jquery.com/ 2下载 地址:https://jquery.com/download/…

Apache Solr 9.1-(一)初体验单机模式运行

Apache Solr 9.1-(一)初体验单机模式运行 Solr是一个基于Apache Lucene的搜索服务器,Apache Lucene是开源的、基于Java的信息检索库,Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果,它被设计为一个强…

day12-继承

1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现格式:class 子…

【算法题】1318. 或运算的最小翻转次数

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你三个正整数 a、b 和 c。 你可…

Webpack:HTML Webpack Plugin插件

HTML Webpack Plugin插件,在Webpack构建的前端项目中,用于简化index.html文件的创建,以免除项目打包之后手动创建/拷贝index.html到打包目录下的繁琐步骤。以下,从一个已构建好的Vue项目中的一个现象谈起,逐步深入了解…

vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库

准备工作 vs code已经安装好,扩展插件plateformIO也安装好。(下图是platformIO安装方式) platformIO界面功能介绍和简单使用 新建Arduino项目 选择正确的开发板型号,和自己习惯的编译框架。打开后有一个.ini的配置文件&#x…

MySQL表的增删改查(初级)

MySQL数据库最核心的内容就是增删改查(即CURD),看了这篇初级增删改查的博客之后可以解决以后工作中百分之80-90的内容,这部分的知识并不是很难,但是需要一定的熟练程度;C:create--新增U:update-…

设计模式_行为型模式 -《策略模式》

设计模式_行为型模式 -《策略模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、…

Nginx应用场景

Nginx应用场景 Nginx配置文件说明 Nginx 的配置文件位置 1、文件位置 安装目录\conf\nginx.conf 安装目录\nginx.conf 2、两个文件是一样的 3、使用 /usr/local/nginx/sbin/nginx 启动 Nginx ,默认用的是 安装目录 \nginx.conf 配置文件 4、作用:完…

三、命令行工具cmder的安装

1、cmder安装 1.1、cmder简介 cmder是一个增强型命令工具,不仅可以使用Windows下的所有命令,并且还可以使用Linux和shell命令。 1.2、cmder下载 (1)cmder的官方网站提供的下载地址实在是太慢了基本是下载不下来,建议到清华大学的镜像站去…

SELECT必知必会_引擎,PROCEDURE,事务处理

书接上文,之前说了Mysql的SELECT部分,本片文章会重点介绍关于MySql的其他一些知识,也会是MySql必知必会的最后一篇。 首先,是Mysql中的增删改操作,对于测试岗来说,这部分知识相对来说不是那么重要&#xf…

案例分享 | AI助力肯尼亚“Sheng”语研究

你听说过一种叫做“Sheng”的语言吗?这是一种斯瓦希里语-英语俚语,主要使用者为肯尼亚内罗毕等城市地区的青年。近年来,随着“Sheng”的使用量不断增加,一家非盈利组织正在帮助更新该地区的社区信息资源,随时根据词汇中…

【6s965-fall2022】深度学习的效率指标

两个核心指标是计算和内存(Computation and Memory)。需要考虑的三个维度是存储、延迟和能耗(Storage, Latency, and Energy)。 延迟 Latency Latency max(Toperation,Tmemory)max(T_{operation}, T_{memory})max(Toperation​,Tmemory​) 能耗 Energy 内存访问比计算更消耗…

Softmax Loss、AAM-Softmax(ArcFace)、Sub-center ArcFace的PyTorch实现与代码解读

概述 说话人识别中的损失函数分为基于多类别分类的损失函数,和端到端的损失函数(也叫基于度量学习的损失函数),关于这些损失函数的理论部分,可参考说话人识别中的损失函数本文主要关注这些损失函数的实现,…

开源PPP软件PRIDE-PPPAR使用记录(二)解算网友发来的GNSS观测文件

最近有个网友发来了几个GNSS原始观测文件,想使用TerraPos处理一下看看结果。 TerraPos打开这几个文件,都报一个格式错误,见下图: 正在上传…重新上传取消​ 这个问题不难,解决之道就是按照上一篇文章的方法&#xf…

杭州到温州老家自驾路线优化与整理

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 背景及义意义 背景 考虑到后续经常回老家,需要提前熟悉回家的路线。杭州和温州有很多快速路和国道与高速是基本相伴而行的,可以利用这些道路取…

在项目管理中,甘特图是最常用的工具之一

在项目管理中,为了能对项目过程进行监控,可视化进度管理,需要使用辅助工具来帮助我们管理项目,而甘特图则是其中最经常使用的工具之一。 甘特图更够清晰的反映项目各个阶段的计划,任务由谁负责,计划与实际…