基于pytest的Python接口自动化测试框架实战

林见深
林见深
发布时间:2026-10-15| 5人浏览过
原创

本文详细介绍如何使用pytest构建Python接口自动化测试框架。通过独立配置文件管理多环境参数,结合Excel读取测试用例以支持全量或指定执行。重点解析请求体中的MD5/SHA256加密逻辑预处理,并展示如何利用pytest-html生成可视化测试报告,实现从配置、加密、执行到报告生成的完整自动化流程。

本文介绍一种简洁高效的接口测试设计思路。

  • 核心目标是通过pytest框架对指定接口进行多维度场景测试,并配合断言机制验证接口返回结果的准确性。
  • 采用配置文件分离策略(conf文件),将环境参数独立管理,确保在不同测试环境下只需修改配置即可切换,无需改动代码。
  • 测试场景数据直接读取自Excel文件中的测试用例,支持执行全部用例或根据ID指定执行特定用例;用例中可包含需加密处理的变量。
  • 针对接口入参中包含的加密逻辑,在发送请求前增加一层数据预处理模块,对敏感参数进行加密处理。

以下是具体的测试用例示例及相关代码实现。


实现该方案所依赖的核心Python库包括:


import pytest
import time, json
import base64, hmac
import hashlib, uuid, re
import requests
import pandas as pd

首先定义配置文件读取逻辑,确保配置信息可被正确加载。


def config_txt(file_name="config.txt"):
    data_head = list()
    data_tail = list()
    for line in open(file_name, encoding='gb18030', errors='ignore'):
        head, sep, tail = line.partition('=')
        data_head.append(head.strip('\n '))
        if tail.find('#') != -1:
            tail, tail_b, tail_c = tail.partition('#')
        data_tail.append(tail.strip('\n  '))
    txt_data = dict(zip(data_head, data_tail))
    heada, sepa, taila = txt_data["GATEWAY_URL"].partition('/test_a')
    txt_data['HTTP_URI'] = "/test_a" + taila
    return txt_data

配置文件(conf)示例如下,包含网关地址、用户密钥、ID等关键信息: GATEWAY_URL = https://127.0.0.1:8051/test_a/adk #url链接地址 zhu_KEY = test_key #用户信息1 zhu_SECRET = test_secret #用户2 zhu_ID = 18825176013 #用户ID zhuLY_ID = 588347220 #用户信息3

其次,封装基础的加密处理函数,供后续测试用例重复调用。


def md5(data_md5):
    data_md5 = hashlib.md5(data_md5.encode(encoding='UTF-8')).hexdigest()
    return data_md5

def sha256(data_sha256):
    data_sha256 = hashlib.sha256(data_sha256.encode(encoding='UTF-8')).hexdigest()
    return data_sha256

def hash_hmac(app_secret, msg, sha1):
    hmac_code = hmac.new(app_secret.encode(), msg.encode(), sha1).digest()
    return base64.b64encode(hmac_code).decode()

接着处理Excel用例中的加密变量,例如对请求参数执行md5(18812345678)等预处理操作,确保发送的数据符合接口要求。


def body_encrypt(data_encrypt):
    if data_encrypt.find("sha256(") != -1:
        sha_ss = re.findall(r"sha256[(](.+?)[)]", data_encrypt)
        for i in range(len(sha_ss)):
            data_encrypt = re.compile("sha256[(]" + str(sha_ss[i]) + '[)]').sub(str(sha256(sha_ss[i])), data_encrypt)
    if data_encrypt.find("md5(") != -1:
        md5_ss = re.findall(r"md5[(](.+?)[)]", data_encrypt)
        for i in range(len(md5_ss)):
            data_encrypt = re.compile("md5[(]" + str(md5_ss[i]) + '[)]').sub(str(md5(md5_ss[i])), data_encrypt)
    return data_encrypt

从Excel文档中读取用例数据,将其转换为测试场景所需的格式。


def excel_case(file_name="case_file2.xlsx", case_id="all"):  # 读取excel账号及路由代理信息file_name
    data_excle = pd.read_excel(file_name, sheet_name=0, engine="openpyxl")
    df = pd.DataFrame(data_excle)
    if case_id != "all":
        df_data = df[(df.case_id == case_id)].to_dict('list')
    else:
        df_data = df.to_dict('list')
    case_id, case_name = df_data['case_id'], df_data['case_name']
    case_body, case_assert = df_data['case_body'], df_data['case_assert']
    case_body1 = body_encrypt(str(case_body))
    txt_data = list(zip(case_id, case_name, eval(case_body1), case_assert))
    return txt_data

核心部分:使用pytest框架执行接口测试逻辑。


class Test_zhu(object):
    #类初始化,此处在测试执行中,全局只会执行一次(读取配置文件)
    @classmethod
    def setup_class(self):
        self.text_data = config_txt()
   #方法初始化,此处在测试执行中,每条用例都会先执行一遍
    def setup_method(self):
        time.sleep(0.4)
        self.time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
   #request接口请求的逻辑
    def request_id(self, GATEWAY_URL, http_body):
        HTTP_BODY = eval(http_body)
        TIME_STAMP = str(int((time.time() + 5) * 1000))
        zhuCE = uuid.uuid1().hex
        msg = self.text_data['zhuLY_ID'] + "\n" + TIME_STAMP + "\n" + zhuCE + "\n" + self.text_data['zhu_KEY'] + "\n" + \
              self.text_data["HTTP_URI"] + "\n" + json.dumps(HTTP_BODY)
        HTTP_HEADER = {
            "zhu_ID": self.text_data['zhu_ID'],
            "zhuLY_ID": self.text_data['zhuLY_ID'],
            "zhuCE": zhuCE,
            "zhu_KEY": self.text_data['zhu_KEY'],
            "TIMESTAMP": TIME_STAMP,
            "SIGNATURE": hash_hmac(self.text_data['zhu_SECRET'], msg, hashlib.sha1)}
        print('**请求参数:{}.'.format(HTTP_BODY))
        response_one = requests.post(GATEWAY_URL, json=HTTP_BODY, headers=HTTP_HEADER, verify=True)
        print('**响应结果:{}.'.format(response_one.text))
        return eval(response_one.text)
    #parametrize为数据驱动,此处获取了excle用例里的数据;apitest定个标签,后续冒烟啥的可以选择性的跑(暂时无用);
    #excel_case(case_id="all")说明,all为全部用例执行或者指定用例执行case_0001
    @pytest.mark.parametrize('case_id,case_name, case_body, case_assert', excel_case(case_id="all"))
    @pytest.mark.apitest
    def test_zhu_case(self, case_id, case_name, case_body, case_assert):
        print("**\n执行编号:" + case_id + "\n**用例名称:" + case_name)
        case_assert_a = json.loads(case_assert)
        alertText = self.request_id(self.text_data['GATEWAY_URL'], case_body)
        retcode = case_assert_a.get('code') if case_assert_a.get('retcode') == None else case_assert_a.get('retcode')
        alertText_a = alertText.get('code') if alertText.get('retcode') == None else alertText.get('retcode')
        #此处为断言,判断用例通过还是不通过
        assert alertText_a == retcode

if __name__ == '__main__':
    pytest.main(["-sv", 'zhu_testA.py'])

最后,利用pytest-html库生成可视化的HTML测试报告,便于结果分析。

执行测试的命令为:pytest zhu_testA.py --html=report.html --self-contained-html

 

至此,关于使用Python和pytest进行接口自动化测试的完整流程已介绍完毕。如需了解更多Python接口自动化测试相关内容,建议查阅本站过往文章或关注后续更新,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。