接口自动化测试完整详解(Python+pytest+requests+Allure 企业落地版)

发布时间:2026/7/1 3:38:15
接口自动化测试完整详解(Python+pytest+requests+Allure 企业落地版) 接口自动化测试完整详解PythonpytestrequestsAllure 企业落地版整体核心分层自动化框架思想 核心技术实现 CI持续集成 项目管理规范一、框架选型与标准目录结构1. 主流技术栈选型图中标准组合Python pytest requests Allure各组件职责拆分组件作用Python开发语言语法简洁第三方库丰富pytest单元/自动化测试框架支持用例管理、参数化、夹具、后置前置requestsHTTP请求库发送GET/POST/PUT等接口请求Allure高颜值可视化测试报告展示步骤、断言、日志、失败截图yaml/csv/excel测试数据文件实现数据驱动DDTlogging日志模块记录完整请求/响应报文pymysql数据库连接库实现落库校验、造数、清理数据2. 标准分层目录结构企业通用规范api_auto_test/ ├── common/ # 公共封装层核心工具类 │ ├── http_client.py # 统一请求封装url、token、header、ssl │ ├── assert_util.py # 通用断言工具多层json、数据库断言 │ ├── log_util.py # 日志封装打印完整请求响应 │ ├── db_util.py # 数据库操作封装查询/新增/清理 │ └── tools.py # 工具函数提取json、时间、随机数、加密签名 ├── config/ # 环境配置文件 │ ├── env.yaml # 多环境域名、账号、数据库地址、全局token │ └── setting.py # 全局变量报告路径、日志等级、文件路径 ├── data/ # 测试数据层数据驱动文件 │ ├── login_data.yaml # 登录接口多组测试数据 │ └── order.csv # 订单批量参数化数据 ├── testcases/ # 测试用例层按业务模块拆分 │ ├── test_login.py # 登录模块用例提取token实现关联 │ ├── test_user.py # 用户信息接口 │ └── test_order.py # 订单业务链路登录→创建→查询→取消 ├── reports/ # 报告输出目录 │ ├── log/ # 运行日志文件 │ ├── raw/ # allure原始结果 │ └── html/ # 最终allure可视化html报告 ├── conftest.py # pytest全局夹具前置登录、全局token、环境清理 └── run.py # 项目启动入口一键执行全部用例并生成报告二、核心技术要点拆解全考点覆盖1. 请求封装 common/http_client.py统一封装HTTP请求解决重复代码、统一处理公共逻辑URL自动拼接读取config环境域名不用每个用例写完整地址Token全局自动携带登录后存入全局变量后续接口自动塞入Header接口签名统一处理加密算法封装所有请求自动加sign签名SSL证书忽略测试环境跳过证书校验统一日志打印自动记录请求头、请求体、响应码、响应JSON统一异常捕获超时、连接失败、500异常统一捕获记录日志极简封装示例代码importrequestsfromcommon.log_utilimportloggerfromconfig.settingimportBASE_URLclassHttpClient:token# 全局静态tokenclassmethoddefsend_request(cls,method,path,paramsNone,jsonNone,headersNone):# 1. 拼接完整urlurlBASE_URLpath# 2. 统一公共请求头base_headers{Content-Type:application/json}ifcls.token:base_headers[Authorization]fBearer{cls.token}ifheaders:base_headers.update(headers)# 3. 打印请求日志logger.info(f请求地址:{url}, 请求方法:{method})logger.info(f请求头:{base_headers}, 请求参数:{json})# 4. 发送请求resprequests.request(methodmethod,urlurl,paramsparams,jsonjson,headersbase_headers,verifyFalse# 关闭ssl校验)logger.info(f响应码:{resp.status_code}, 响应内容:{resp.text})returnresp.json()2. 接口关联参数动态提取与传递实现思路登录用例执行完成提取返回token存入全局静态变量HttpClient.token后续所有业务接口自动携带token无需每个用例重复传参链路场景创建订单返回orderId存入夹具变量查询/取消订单直接读取代码示例test_login.pyimportpytestfromcommon.http_clientimportHttpClientfromcommon.assert_utilimportassert_code_successdeftest_login():# 发送登录请求req_data{username:test01,password:123456}resHttpClient.send_request(POST,/login,jsonreq_data)# 断言登录成功assert_code_success(res)# 提取token全局共享HttpClient.tokenres[data][token]# 提取用户ID存入pytest全局夹具pytest.user_idres[data][userId]3. 数据驱动 DDTpytest.mark.parametrize yaml/csv作用一套接口批量执行多组正向/边界/异常参数减少重复用例代码方式1YAML文件读取参数推荐可读性高data/login_data.yamlcases:-name:正常账号登录username:test01pwd:123456expect_code:200-name:密码错误username:test01pwd:666666expect_code:400用例读取yaml批量执行importyamlimportpytestfromcommon.http_clientimportHttpClient# 读取yaml数据withopen(./data/login_data.yaml,r,encodingutf-8)asf:login_casesyaml.safe_load(f)[cases]pytest.mark.parametrize(case,login_cases)deftest_login_param(case):resHttpClient.send_request(POST,/login,json{username:case[username],password:case[pwd]})assertres[code]case[expect_code]方式2CSV批量数据大批量造数场景搭配pandas读取csv实现上千条账号参数化执行。4. 多层断言 数据库落库校验1多层JSON通用断言 common/assert_util.py支持校验顶层code、嵌套字段、数组长度、字段非空defassert_code_success(response):校验业务码200assertresponse[code]200,f业务失败{response[msg]}defassert_json_field(res,json_path,expect_val):多层字段断言如$.data.user.nameimportjsonpath valjsonpath.jsonpath(res,json_path)[0]assertvalexpect_val2数据库落库校验接口自动化核心强校验场景调用创建订单接口后查询MySQL订单表校验订单号、金额、状态是否正确落库fromcommon.db_utilimportDBdeftest_create_order():# 1. 调用创建订单接口req{goodsId:1001,num:2}resHttpClient.send_request(POST,/order/create,jsonreq)order_idres[data][orderId]# 2. 查询数据库订单sqlfselect order_id, amount, status from t_order where order_id{order_id}db_dataDB.query_one(sql)# 3. 数据库断言assertdb_data[status]1# 状态1待支付assertdb_data[amount]199.005. 完整日志记录 log_util.py日志要求区分日志等级INFO正常报文、ERROR失败堆栈完整打印请求URL、请求头、入参、响应码、返回JSON日志按日期分文件保存Allure报告可嵌入日志详情importloggingfromconfig.settingimportLOG_PATHdefget_logger():loggerlogging.getLogger(api_auto)logger.setLevel(logging.INFO)# 文件输出控制台输出file_handlerlogging.FileHandler(LOG_PATH,encodingutf-8)console_handlerlogging.StreamHandler()fmtlogging.Formatter(%(asctime)s - %(levelname)s - %(message)s)file_handler.setFormatter(fmt)logger.addHandler(file_handler)logger.addHandler(console_handler)returnlogger loggerget_logger()三、持续集成 CI/CDJenkins Allure1. 整体流程代码提交Git → Jenkins自动拉取代码 → 安装Python依赖 → 执行pytest自动化用例 → 生成Allure原始结果 → 渲染HTML报告 → 归档报告 邮件推送测试结果2. Jenkins Shell执行脚本# 1. 安装依赖pipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple# 2. 清空历史报告rm-rfreports/raw reports/html# 3. 执行pytest生成allure原始数据pytest testcases/--alluredirreports/raw-s# 4. 渲染allure可视化报告allure generate reports/raw-oreports/html--clean# 5. 判断用例失败让Jenkins构建失败if[$?-ne0];thenecho自动化用例存在失败exit1fi3. 配套配置Jenkins插件Allure Report、Email Extension构建后操作归档reports/html报告发送邮件附件html报告区分成功/失败邮件模板触发方式代码提交触发GitLab WebHook定时构建每日凌晨2点全量回归核心链路四、用例管理规范1. 自动化用例与手工用例关联自动化用例只覆盖核心业务流程登录、下单、支付、查询不覆盖极端低频异常每个自动化用例添加注释关联测试管理平台用例ID如#TC001 正常下单流程迭代更新需求变更同步修改自动化脚本保证和手工用例同步。2. 环境清理与造数策略1前置造数conftest夹具pytest.fixture(scope“module”, autouseTrue)模块执行前自动创建测试账号、测试商品数据保证用例有数据可执行。2后置数据清理模块执行完成删除本次自动化生成的订单、用户脏数据避免数据库持续堆积测试数据导致接口查询越来越慢生产隔离自动化单独一套性能/测试库禁止操作线上库。3. 分层执行策略冒烟用例仅核心链路代码提交快速执行5分钟内全量回归定时任务执行所有自动化用例夜间执行模块分组通过pytest.mark.order标记Jenkins可单独执行订单模块。五、面试高频考点总结为什么分层设计common/config/data/testcases解耦、复用、易维护修改环境地址只改yaml修改请求逻辑只改http_client。pytest如何实现接口关联全局静态变量、夹具fixture共享参数登录提取token存入全局请求类下游自动携带。数据驱动实现方式pytest.mark.parametrize yaml/csv多组参数批量执行减少重复代码。自动化和手工测试区别自动化擅长重复回归、核心链路手工擅长复杂交互、UI、低频异常场景。CI集成流程Git触发Jenkins→拉代码→安装依赖→pytest执行→生成Allure报告→邮件通知。