完美解决接口测试难题,数据驱动带签名混合封装框架实现

目录

 前言:

一、框架概述

二、框架架构

三、代码实现

四、实战步骤

五、总结


前言:

接口自动化测试是保障软件质量的重要手段之一,其自动化程度越高,越能有效提高软件测试效率。而接口自动化测试中,接口测试框架的封装则显得尤为重要。为此,我们完成了一款数据驱动带签名混合封装的接口自动化框架,本篇文章将详细介绍这一项目的实战过程。

一、框架概述

这个框架主要是针对线上支付项目的接口自动化测试开发的,而由于该项目所属的行业特殊性,其所涉及数据加解密、签名校验等方面都显得非常重要。

因此,本框架的主要功能模块如下:

1.接口请求封装及数据加解密模块:支持get、post、put等常见接口请求方式,并且支持AES加解密、RSA加解密等多种加解密方式。

2.签名生成及校验模块:支持MD5、HMAC等数字签名方式,并可以自定义签名字符串。

3.数据驱动模块:通过读取Excel中的测试用例数据来完成API接口测试。

二、框架架构

框架的整体架构如下:

- config.py:配置文件,包括接口请求地址、加解密秘钥、签名秘钥等信息;

- api_request.py:接口请求模块,通过调用requests库来完成接口请求;

- encryption.py:加解密模块,支持AES加解密、RSA加解密,并可以根据传入参数选择对应的加解密方式;

- signature.py:签名校验模块,支持MD5、HMAC等数字签名方式;

- excel_handler.py:Excel读写模块,负责读取测试用例数据和写入测试结果;

- test_cases:测试用例目录,存放对应业务分层的测试用例Excel文件;

- test_runner.py:测试用例执行脚本,负责执行所有测试用例,并记录测试结果。

三、代码实现

1.接口请求封装及数据加解密模块

import requests
import json
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

class ApiRequest:
    def __init__(self, config):
        self.url = config["url"]
        self.headers = config["headers"]
        self.aes_key = config["aes_key"]
        self.aes_iv = config["aes_iv"]
        self.rsa_key = config["rsa_key"]
        
    def post(self, path, data=None):
        if data is not None:
            data = self.encrypt(json.dumps(data))
        response = requests.post(self.url + path, headers=self.headers, data=data)
        return self.decrypt(response.text)
        
    def get(self, path, params=None):
        response = requests.get(self.url + path, headers=self.headers, params=params)
        return self.decrypt(response.text)
        
    def put(self, path, data=None):
        if data is not None:
            data = self.encrypt(json.dumps(data))
        response = requests.put(self.url + path, headers=self.headers, data=data)
        return self.decrypt(response.text)
        
    def encrypt(self, data):
        cipher = AES.new(self.aes_key.encode('utf-8'), AES.MODE_CBC, self.aes_iv.encode('utf-8'))
        encrypted_data = cipher.encrypt(self.__pad(data).encode('utf-8'))
        return encrypted_data.hex()
        
    def decrypt(self, encrypted_data):
        cipher = AES.new(self.aes_key.encode('utf-8'), AES.MODE_CBC, self.aes_iv.encode('utf-8'))
        decrypted_data = cipher.decrypt(bytes.fromhex(encrypted_data))
        return self.__unpad(decrypted_data).decode('utf-8')
        
    def __pad(self, data):
        block_size = AES.block_size
        return data + (block_size - len(data) % block_size) * chr(block_size - len(data) % block_size)
        
    def __unpad(self, data):
        return data[:-ord(data[len(data) - 1:])]

2.签名生成及校验模块

import hashlib
import hmac

class Signature:
    def __init__(self, config):
        self.signature_method = config["signature_method"]
        self.signature_key = config["signature_key"]
        
    def generate_signature(self, data):
        if self.signature_method == "md5":
            return self.__generate_md5_signature(data)
        elif self.signature_method == "hmac":
            return self.__generate_hmac_signature(data)
        else:
            raise ValueError("Unsupported signature method: {}".format(self.signature_method))
        
    def verify_signature(self, data, signature):
        if self.signature_method == "md5":
            return self.__verify_md5_signature(data, signature)
        elif self.signature_method == "hmac":
            return self.__verify_hmac_signature(data, signature)
        else:
            raise ValueError("Unsupported signature method: {}".format(self.signature_method))
        
    def __generate_md5_signature(self, data):
        return hashlib.md5((data + self.signature_key).encode('utf-8')).hexdigest()
        
    def __generate_hmac_signature(self, data):
        return hmac.new(self.signature_key.encode('utf-8'), data.encode('utf-8'), hashlib.sha256).hexdigest()
        
    def __verify_md5_signature(self, data, signature):
        return self.__generate_md5_signature(data) == signature
        
    def __verify_hmac_signature(self, data, signature):
        return self.__generate_hmac_signature(data) == signature

3.数据驱动模块

from excel_handler import ExcelHandler
from api_request import ApiRequest
from signature import Signature

class TestRunner:
    def __init__(self, config):
        self.test_cases_dir = config["test_cases_dir"]
        self.api = ApiRequest(config["api"])
        self.signature = Signature(config["signature"])
        
    def run_all_tests(self):
        test_cases = self.__get_all_test_cases()
        for test_case in test_cases:
            self.__run_single_test(test_case)
        
    def __get_all_test_cases(self):
        excel_handler = ExcelHandler()
        return excel_handler.read_all_sheets(self.test_cases_dir)
        
    def __run_single_test(self, test_case):
        test_data = test_case["data"]
        expected_result = test_case["expected_result"]
        signature = self.signature.generate_signature(test_data)
        response = self.api.post(test_case["path"], data=test_data)
        assert response == expected_result, "Test case failed.\nTest data: {}\nExpected result: {}\nGot result: {}".format(test_data, expected_result, response)
        assert self.signature.verify_signature(response, test_case["signature"]), "Signature verification failed.\nResponse: {}\nSignature: {}".format(response, test_case["signature"])

四、实战步骤

1.安装依赖包

pip install requests
pip install pycrypto

2.创建测试用例Excel文件

在`test_cases`目录下新建`.xlsx`格式的Excel文件,每个Excel文件表示一个业务功能,每个sheet表示一个测试用例。

测试用例sheet格式如下:

| path  | data                 | expected_result | signature      |
|-------|----------------------|----------------|-----------------------|
| /api/ | {"key": "value"} | {"status": "ok"} | abcdefghijklmnop |

其中,path表示接口路径,data是请求数据,expected_result是期望返回结果,signature是数字签名。

3.配置相关参数

在`config.py`文件中配置相关信息,包括接口请求地址、加解密秘钥、签名秘钥等信息。

4.执行测试用例

执行以下命令:

python test_runner.py

测试结果将会输出在控制台中。

五、总结

通过以上步骤,我们完成了一款数据驱动带签名混合封装的接口自动化框架。该框架实现了接口请求封装、AES、RSA加解密、MD5、HMAC数字签名等功能模块,并采用数据驱动的方式完成API接口测试,提高了自动化测试效率。我们相信,该框架能在接口测试领域得到广泛应用,为软件测试与开发带来更多便利。

 作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试前进之路的必须品,如果你用得到的话可以直接拿走,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!

获取方式:留言【自动化测试】即可

【自动化测试交流】:574737577(备注ccc)http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MyTLBK9pZ74qgHUVVZfITmBhScUS5qPC&authKey=hUGxEWvPxbiSTszm1V9wE6Z%2FFpVNEdf%2BzEe4UXSvDPN8LPV5WcLAO%2BQ0RLX5tKCR&noverify=0&group_code=574737577

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot +spring security,解决跨域问题

一.简介 这篇文章主要是解释什么是跨域,在Spring中如何解决跨域,引入Spring Security后Spring解决跨域的方式失效,Spring Security 如何解决跨域的问题。 二.什么是跨域 跨域的概率: 浏览器不能执行其他网站的脚本&#xff0c…

【新星计划-2023】TCP/IP协议讲解

相信大家在学习的过程中一定听到过TCP/IP这个协议,那么,TCP/IP协议是什么?为什么会有TCP/IP协议? 一、TCP/IP是什么? TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国…

Taro 项目怎么获取元素的高度和视口高度

最近做小程序,用的Taro,需要设置空状态居中显示,因为空状态出现的地方不一样,所以需要动态设置,那么就需要获取元素的高度来计算 文档翻了一遍也没有找到,原生js获取高度得到的是null,百度了下…

考研数据结构--图

文章目录 图图的基本概念图的定义种类 图的抽象数据类型图的基本术语1. 端点和邻接点2. 顶点的度、入度和出度3. 完全图4. 稠密图、稀疏图5. 子图6. 路径和路径长度7. 回路或环8. 连通、连通图和连通分量9. 强连通图和强连通分量在一个图中找强连通分量的方法 10. 权和网 图的存…

自信裸辞:一晃 ,失业都3个月了.....

最近,找了很多软测行业的朋友聊天、吃饭 ,了解了一些很意外的现状 。 我一直觉得他们技术非常不错,也走的测开/管理的路径;二三月份裸辞的,然后一直在找工作,现在还没找到工作 。 经过我的分析&#xff0…

2023年广东省中职网络安全Web渗透测试解析(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问地址http://靶机IP/task1,分析页面内容,获取flag值,Flag格式为flag{xxx}; 2.访问地址http://靶机IP/task2,访问登录页面。用户user01的密码为1-1000以内的数,获取用户user01的密码,将密码作为Flag进行提交,Flag格式…

如何真正开启docker远程访问2375

注意看官方文档 Configure remote access for Docker daemon | Docker Documentation 1. windows上Docker Desktop开启远程访问端口2375 系统版本: win10专业版 Docker Desktop版本:4.18.0 很简单勾上, 应用并重启即可 2. linux上开启 尝…

设计模式—“接口隔离”

在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采样添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式有:Fascade、Proxy、Adapter、Mediator 一、Fascade 动机 上述A方案的问题在于组件的客户和…

性能测试重要知识与TPS上不去原因分析,测试进阶之路卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 常见性能测试术语…

音视频使用qt测试ffmpeg接口时无法运行

仅仅时把自己过程中遇到的稍微阻塞疑惑问题做出整理,疑惑的是拿到的ffmpeg包中没有dll文件,导致自己研究了一系列。 使用qt加载音视频ffmpeg对应的相关lib库,进行接口,源码的研究。 1:使用源码安装的方式获取相关的动…

易基因:全基因组DNA甲基化分析揭示DNMT1在斑马鱼模型听觉系统发育中的作用 | 胚胎发育

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 听力障碍通常与内耳发育不全或损伤有关,是影响生活质量的严重健康问题。因此研究听觉器官发生过程中的关键基因对于探索听力损伤的潜在策略至关重要。斑马鱼模型在理解内耳发…

基于SSM的校园办公管理系统的设计与实现(源码完整)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…

噶了呀,现在的00后这么卷的吗?

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里…

企业微信也能接入ChatGPT啦~你也能成功,步骤超详细~

文章目录 配置企业微信创建企业创建应用 配置项目一、OpenAI账号注册二、克隆项目代码三、复制配置文件四、企业微信配置 服务器购买运行项目安装Python安装核心依赖启动项目 个人微信绑定 上次我把ChatGPT接入了微信(请看这篇文章当ChatGpt接入微信群之后&#xff…

前几天面了个30岁左右的测试员,年薪50w问题基本都能回答上,必是刷了不少八股文···

互联网行业竞争是一年比一年严峻,作为测试工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯等大厂.....) 所以,大家就迎来了…

论文笔记: Trajectory Clustering: A Partition-and-Group Framework

07 Sigmoid 使用类DBSCAN的思路对轨迹聚类 1 intro 1.1 轨迹聚类 现有的轨迹聚类算法是将相似的轨迹作为一个整体进行聚类,从而发现共同的轨迹。 但是这样容易错过一些共同的子轨迹(sub-trajectories)。而在实际中,当我们对特…

Redis主从复制,哨兵模式和集群模式

一、主从复制 1、主从复制-哨兵-集群 主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自…

服务器被勒索病毒攻击怎么办,如何进行勒索病毒解密与预防工作?

在当今社会中服务器已经成为企业关键数据存储和传输的重要载体,同样也成为黑客攻击和勒索病毒的首要目标。一旦服务器被勒索病毒攻击,企业的正常运转与经济利益和核心数据都将受到威胁。下面将为大家介绍一下服务器被勒索病毒攻击后应该采取怎样的措施及…

软件系统三基座之一:权限管理

软件系统三基座包含:权限管理、组织架构、用户管理。 何为基座,即是有了这些基础,任一相关的“建筑”就能逐步搭建起来。 万丈高楼平地起 一、为什么要权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,…

【013】C++数组之一维数值数组和二维数值数组

一维数值数组和二维数值数组 引言一、一维数值数组1.1、概念1.2、一维数值数组的定义1.3、一维数值数组的初始化1.4、一维数值数组的元素操作1.5、使用示例 二、二维数值数组2.1、概述2.2、二维数值数组的初始化2.3、二维数值数组的元素操作2.4、使用示例 总结 引言 &#x1f4…