目录
前言:
一、框架概述
二、框架架构
三、代码实现
四、实战步骤
五、总结
前言:
接口自动化测试是保障软件质量的重要手段之一,其自动化程度越高,越能有效提高软件测试效率。而接口自动化测试中,接口测试框架的封装则显得尤为重要。为此,我们完成了一款数据驱动带签名混合封装的接口自动化框架,本篇文章将详细介绍这一项目的实战过程。
一、框架概述
这个框架主要是针对线上支付项目的接口自动化测试开发的,而由于该项目所属的行业特殊性,其所涉及数据加解密、签名校验等方面都显得非常重要。
因此,本框架的主要功能模块如下:
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