首页 > 其他分享 >干货 | 实战演练基于加密接口测试测试用例设计

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

时间:2022-10-05 13:00:29浏览次数:50  
标签:base64 加密 封装 接口 干货 测试用例 http data schema

干货 | 实战演练基于加密接口测试测试用例设计_json

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

接口测试用例分析

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

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

质量需求

样例

测试痛点

公司的接口一直不稳定影响用户的使用

质量反馈

最近半年来出现了几次大的故障

回归测试

每次升级都会影响老的功能

测试策略

目前公司没有可靠的测试体系

重构测试

微服务化改造需要有良好的测试体系保证

接口测试封装思想

接口封装思想主要分为3个大维度,配置、接口封装、业务流程。其中配置主要用作根据配置文件获取初始配置和依赖;接口封装遵循apiobject设计模式,对接口的调用进行抽象封装;业务流程则负责数据初始化、业务用例设计,包含有多个api形成的流程定义,不要再包含任何接口实现细节、以及断言。后面将会与实战案例结合,进行详细的介绍。

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

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

环境准备

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

先准备一个json格式demo

{"topics":

{

"orange":"movie",

"shool":"testing-studio",

"president":"seveniruby"

}

}

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

base64

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

python -m http.server 10000

启动后的样子如图:

干货 | 实战演练基于加密接口测试测试用例设计_json_02

使用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等等,而这种字典形式的结构体也为后面的数据驱动改造做好了一个重要的铺垫。

"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字段,用来判断选择的不同的加密条件

"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

总结:

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

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

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


标签:base64,加密,封装,接口,干货,测试用例,http,data,schema
From: https://blog.51cto.com/u_15649298/5732535

相关文章

  • 干货 | 通用 api 封装实战,带你深入理解 PO
    在普通的接口自动化测试中,如果接口的参数,比如url,headers等传参改变,或者测试用例的逻辑、断言改变,那么整个测试代码都需要改变。apiobject设计模式借鉴了pageobject的设计模......
  • 云架构系统如何做性能分析?| 实战干货
    性能分析一直是性能实施项目中的一个难点。对于只做性能测试不做性能分析的团队来说,总是不能把问题非常显性地展示出来,不能给其他团队非常明确的引导。对于这种类型的测试实......
  • 【学习笔记】数据库级别的MD5加密
    数据库级别的MD5加密什么是MD5?MD5信息摘要算法(英语:MD5Message-DigestAlgorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信......
  • #yyds干货盘点# 软件测试的目的和对象
    一、不论是哪个时期的定义,软件测试的目的实际上是一致的,这个目的就是“保证软件质量”。具体来讲就是要保证软件或系统符合相关的法律法规、技术标准和应用需求,降低软件的......
  • #yyds干货盘点#【愚公系列】2022年10月 Go教学课程 038-异常处理
    一、异常处理1.什么是异常处理异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为......
  • #yyds干货盘点#最新前端跨域实践方案
    nginx反向代理接口跨域跨域原理:同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题......
  • #yyds干货盘点# 软件测试的定义
    1973年,BillHetzel给出了软件测试的第一个定义:“软件测试就是为了程序能够按预期设想运行而建立足够的信心”。这个定义强调的是证实程序按预期运行,当软件测试这种技术手段......
  • #yyds干货盘点#sql跨表查询的三种方案
    最近又个朋友问我,如何进行sql的跨库关联查询?首先呢,我们知道mysql是不支持跨库连接的,但是老话说得好,只要思想不滑坡,办法总比困难多!​方案一:连接多个库,同步执行查询具体思路......
  • #yyds干货盘点# 软件评测技术的发展趋势
    随着软件技术的继续发展,以及软件应用的扩展和深入,软件测试必然也会不断发展。近年来,各类新型架构的软件系统层出不穷,云计算、物联网、人工智能、大数据分析以及移动应用的发......
  • #yyds干货盘点#【愚公系列】2022年10月 Go教学课程 037-面向对象综合案例-微博
    一、面向对象综合案例-微博微博(Micro-blog)是指一种基于用户关系信息分享、传播以及获取的通过关注机制分享简短实时信息的广播式的社交媒体、网络平台。微博允许用户通过......