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

news2024/11/30 0:34:22

目录

 前言:

一、框架概述

二、框架架构

三、代码实现

四、实战步骤

五、总结


前言:

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

一、框架概述

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

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

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

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

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

相关文章

推荐 6 款还不错的文档协作工具~

你们团队是否正在寻找便捷丰富功能的文档协作软件? 文件协作软件帮助你和你的团队更有效地工作,并进行实时协作,为创新创造更多的空间。 但是,今天有数百种文档协作工具,你应该选择哪一种呢? 为了帮助你…

SpringSecurity的认证原理及如何自定义认证结合MyBatis替换原数据源

文章目录 一、自定义认证二、自定义登录界面三、自定义成功的处理1、前后端分离返回json 四、如何在前端显示异常1、传统的方法2、前后端分离返回错误的json 五、注销登录配置1、注销登录前后端不分离2、前后端分离的方法 六、登录⽤户数据获取1、SecurityContextHolder2、Secu…

【Netty】Netty 程序引导类(九)

文章目录 前言一、引导程序类二、AbstractBootStrap 抽象类三、Bootstrap 类四、ServerBootstrap 类五、引导服务器5.1、 实例化引导程序类5.2、设置 EventLoopGroup5.3、指定 Channel 类型5.4、指定 ChannelHandler5.5、设置 Channel 选项5.6、绑定端口启动服务 六、引导客户端…

STL-reverse_iterator 反向迭代器

回顾 对于STL中的容器,迭代器(iterator)是很重要的部分,同时迭代器也是STL六大组件之一,在之前我们实现vector和list中,我们已经对于迭代器有了初步的认识,为什么设计迭代器? 就是为了能像数组中的指针一样…

虹科干货|创新求变:虹科Redis企业版数据库驱动金融实时业务

BDO调查显示,43%的金融企业正计划全力加速数字化转型,互联网巨头与金融科技初创公司正在颠覆传统。”与此同时,客户行为、消费习惯和期望持续变化,以客户为中心的快速金融服务已成趋势,企业微服务、云原生应用亟需一组…

【算法题解】30. 全排列的递归解法

这是一道 中等难度 的题 https://leetcode.cn/problems/permutations/ 题目 给定一个不含重复数字的数组 n u m s nums nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1…

景点解说二维码怎么做?一键教你轻松生成二维码

现在的各种景区为了节省人工都会将景点的详细讲解做成二维码。通过手机扫码就能自助导览。那么,大家知道这种景区讲解二维码是怎么制作的吗? 一、什么工具能制作二维码图片? 机智熊二维码生成器(https://www.jzx.com/)…

什么是高性能计算实习生?做高性能计算有前景吗?

随着大模型和算力时代的大火,高性能计算实习的岗位越来越多了,各个大厂都在码人,百度、小米、字节、华为等等,也有很多网友晒出了面试一众知名芯片企业的面经和笔试题。 但是依然有很多朋友不清楚什么是高性能计算实习生&#xf…

搜索推荐系统[10]项目实战系列Z1:手把手教学(商品搜索系统、学术文献检索)语义检索系统搭建、召回排序模型详解。

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

每日一练 | 网络工程师软考真题 Day12

阅读以下说明,答复以下【问题1】至【问题3】 【说明】 某单位有1个总部和6个分部,各个部门都有自己的局域网。该单位申请了6个C类IP地址202.115.10.0/24~202.115.15.0/24,其中总部与分部4共用一个C类地址。现方案将这些部门用路由器互联&…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日,第一台名称ENIAC。体积一间屋子的大小,重量高达28t。 第一代:1946 – 1958 > 12 年 (电子管) 第二代:1958 – 1964 > 6 年 (晶体管…

VR数字展厅——助力商企实现数字化营销展示

近年来,随着元宇宙、虚拟现实等概念逐渐进入大众视野,VR虚拟展厅也慢慢的发展成为了一种新的展示形式。VR数字展厅可以将展示场景复刻在线上,不再受限于线下环境,随着VR全景技术的高速发展,虚拟展厅帮助商企实现更具创…

一起CPU很闲,load却很大的案例分析

1、软硬件环境 硬件: 飞腾E2000Q 平台 软件: linux 4.19.246 2、问题现象 系统在上电后,无意中发现系统的平均负载很大,数值显示远超过cpu的承载能力。心想也没有跑什么业务程序呀,吓得赶紧运行top命令,瞅…

无人车端到端驾驶模型概述

摘要: 通常,端到端驾驶模型使用一个深度神经网络来完成这种映射,网络的所有参数为联合训练而得。这种方法因它的简洁高效而引人关注。 引言 在搭建无人车时,我和小伙伴们的主要工作是建立一个驾驶模型。所谓的驾驶模型是控制无人…

idea模板配置

idea版本:2023.1 未设置模板的idea,新建类会自动生成类注释 格式如下: /*** author user* date 2023/5/20 0020 14:25*/ public class User {} 其中,user为当前用户名 这里,如果希望将类注释改写成如下&#xff0…

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术,只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺,休息好了再继续卷,卷是常态,“仰卧起坐”也好,“卷的姿势”也好,都是在反复“卷起”的过程中寻找一些舒适和平衡…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息,我一直觉得,如果那真的发生了,会是人类的悲哀。 由于之前我存储的地址又挂了,所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下,发现有三个地址。 他说这第一个…

智能CAN/串口协议转换器LCNET Pro RS-232/485

智能CAN/串口协议转换器LCNET Pro RS-232/485提供一路RS-485、一路RS-232和一路CAN通道,实现CAN与串口RS-485或RS-232之间的双向数据智能转换。每个通道独立隔离,每路通道采用金升阳电源模块和信号隔离芯片实现2500VDC电气隔离,电源输入防反设…

基于Redis的Java分布式锁,接口并发处理,并发方案

Redis的分布式锁很多人都知道,比如使用Jedis的setNx、incr等方法都可以实现分布式锁的功能,但是Jedis需要自己管理连接池,就稍微麻烦一点。 今天介绍的是使用RedisTemplate切面编程自定义注解SPEL来实现分布式锁的功能,封装完成后…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应: 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉,这就是雪崩效应,那么其实短信服务又不是我们主要业务,这个时候我们可以采用服务降级,服务降级就是暂时的把短信服务停…