新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python + Pytest接口自动化测试方案的实现

发布时间:2026/9/29 10:30:48来源:尧图网络
Python + Pytest接口自动化测试方案的实现
对接口自动化测试方案的实现情况。更新时间是2026年06月09日, 具体时间是09点19分59秒, 作者是优采云。它仅仅只合适拿来单独调试某个接口, 一旦遇到了要把回归测试批量执行、需要在多个不同环境里进行验证以及需要持续集成这种场景的时候, 靠人工去操作的话, 效率低得很, 而且还非常容易出错, 这篇文章是带着你一步一步从最基本的地方开始, 去搭建出一套在大型企业里真正能够投入使用并且符合标准的自动化测试框架的, 如果你对这方面感兴趣的话可以接着往下看了解具体情况。前言本方案只适合单独的一个接口调试。要是碰到批量回归测试, 还要在多环境里做验证, 以及做持续集成这些情况, 人工操作就太慢了, 而且特别容易出错。这篇文章带你从头开始搭建一套企业在实际应用中的 接口自动化测试框架。这个框架包括接口封装、数据驱动、报告可视化和 CI/CD 集成这样的全流程内容。它可以直接用到小型项目中, 也可以平滑地扩展到大型分布式系统里去。技术选型与优势对比我们选择以下技术栈, 这样做能够同时兼顾到易用性、扩展性以及生态系统的成熟程度。这些技术工具在核心作用方面展现出了明显的选型优势。3.8脚本开发语言语法很简洁, 第三方库特别丰富, 测试领域的生态系统相当完善。HTTP 请求发送如今最受欢迎的那个 HTTP 客户端工具, 它的 API 接口设计得十分简单, 用起来也非常容易上手。对测试用例进行管理与执行。它比那个要灵活得多, 支持参数化还有插件扩展。测试报告生成可视化效果十分不错, 并且还支持用例的归类管理, 同时也支持失败的截图, 此外还具备历史趋势的记录与展示功能。YAML测试数据与配置管理这句话的易懂程度特别高, 所以它是适合用来进行结构化数据存储的。持续集成这套软件是开源的, 同时也没有任何费用需要支付, 它能够支持按指定时间自动构建的代码触发报告集成。标准化项目结构我们采取了那个分层设计的一个思路, 把配置、接口、用例、工具还有数据都给分开了, 这样一来框架的可维护性也就得到保证了。api_auto_test/├── config/ # 环境配置目录│ └── config.yaml # 多环境配置开发/测试/生产├── api/ # 接口封装层所有业务接口│ ├── __init__.py│ └── login_api.py # 登录接口封装├── testcases/ # 测试用例层仅写用例逻辑│ ├── __init__.py│ └── test_login.py # 登录模块测试用例├── utils/ # 工具层通用方法│ ├── __init__.py│ ├── request_util.py # HTTP 请求封装│ ├── assert_util.py # 统一断言工具│ └── log_util.py # 日志工具可选├── data/ # 测试数据层数据驱动│ └── login_data.yaml # 登录模块测试数据├── reports/ # 测试报告输出目录├── requirements.txt # 项目依赖清单└── pytest.ini # Pytest 全局配置文件关于环境方面的搭建工作以及依赖关系的安装, 首先需要明确的是在基础环境这一块的规范要求是什么, 然后才能着手进行后续的那些相关依赖软件或者包的安装操作动作。执行以下命令, 就可以一键安装所有的依赖项。pip install requests pytest pyyaml allure-pytest3. 生成依赖清单方便后续团队协作和 CI 集成pip freeze requirements.txt实现核心模块的步骤在于进行多环境配置管理。可以在这个叫作 .yaml的文件里面去配置各种不同环境所对应的信息, 然后就可以支持那种一键切换的操作了。# 环境配置dev-开发环境 test-测试环境 prod-生产环境active_env: testenv:dev:base_url:timeout: 10test:base_url:timeout: 10prod:base_url:timeout: 155.这是一个被封装起来的, 用来发起通用请求的工具。把 HTTP 请求的功能, 封装到 utils/.py。这个文件里得写上异常处理的代码。同时, 还得加上日志打印的内容。import requestsimport yamlimport loggingfrom typing import Dict, Any# 配置日志logging.basicConfig(levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s)logger logging.getLogger(__name__)class RequestUtil:def __init__(self):# 加载配置文件with open(../config/config.yaml, r, encodingutf-8) as f:self.config yaml.safe_load(f)# 获取当前激活的环境self.active_env self.config[active_env]self.base_url self.config[env][self.active_env][base_url]self.timeout self.config[env][self.active_env][timeout]def send_request(self,method: str,path: str,headers: Dict[str, str] None,params: Dict[str, Any] None,json: Dict[str, Any] None,data: Any None,**kwargs) - requests.Response:统一发送 HTTP 请求:param method: 请求方法 GET/POST/PUT/DELETE:param path: 接口路径:param headers: 请求头:param params: URL 参数:param json: JSON 格式请求体:param data: 表单格式请求体:return: 响应对象url self.base_url pathlogger.info(f请求地址: {method} {url})logger.info(f请求参数: params{params}, json{json})try:resp requests.request(methodmethod,urlurl,headersheaders,paramsparams,jsonjson,datadata,timeoutself.timeout,**kwargs)logger.info(f响应状态码: {resp.status_code})logger.info(f响应内容: {resp.text[:500]}) # 只打印前500字符避免日志过长return respexcept requests.exceptions.Timeout:logger.error(f请求超时: {url})raiseexcept requests.exceptions.ConnectionError:logger.error(f连接失败: {url})raiseexcept Exception as e:logger.error(f请求异常: {str(e)})raise5.把业务这个接口那一层, 给封装了。在 api目录下, 针对那个带有 .py后缀的文件里去对登录这个功能相关的接口进行封装, 操作时要遵循一个很明确的原则, 也就是说每一个接口都需要单独去设置一个方法。from utils.request_util import RequestUtilclass LoginApi:def __init__(self):self.request RequestUtil()def login(self, username: str, password: str):登录接口:param username: 用户名:param password: 密码:return: 响应对象path /api/v1/loginpayload {username: username,password: password}return self.request.send_request(methodPOST,pathpath,jsonpayload)5.4 数据驱动测试数据我们把测试数据放到了 data/.yaml 里进行管理, 这样做的目的, 是为了能够实现那一种状态, 就是数据跟脚本是分离的。- case_name: 正常登录-正确用户名密码username: test01password: 123456expect_status: 200expect_code: 0expect_msg: 登录成功- case_name: 登录失败-密码错误username: test01password: wrong123expect_status: 200expect_code: 1001expect_msg: 密码错误- case_name: 登录失败-用户名不存在username: nonexistpassword: 123456expect_status: 200expect_code: 1002expect_msg: 用户不存在- case_name: 登录失败-用户名为空username: password: 123456expect_status: 200expect_code: 1003expect_msg: 用户名不能为空5.关于第五项内容, 即测试用例的编写工作。需要在代码/.py 文件当中去编写测试用例, 要通过使用参数化这个手段来做到数据驱动。import pytestimport yamlfrom api.login_api import LoginApi# 加载测试数据def load_login_data():with open(../data/login_data.yaml, r, encodingutf-8) as f:return yaml.safe_load(f)class TestLogin:def setup_class(self):测试类执行前的初始化操作self.login_api LoginApi()pytest.mark.parametrize(case, load_login_data(), ids[case[case_name] for case in load_login_data()])def test_login_cases(self, case):登录接口测试用例# 发送请求resp self.login_api.login(usernamecase[username],passwordcase[password])# 断言assert resp.status_code case[expect_status]assert resp.json()[code] case[expect_code]assert case[expect_msg] in resp.json()[msg]5.在第6部分中提到了一个用于统一进行断言操作的工具。我们可以把那些经常被用到的断言相关的办法, 都给封装到那个叫作utils.py的文件里面去, 通过这样的方式, 来实现对断言逻辑方面的统一安排和统一处理:import requestsfrom typing import Anydef assert_status_code(resp: requests.Response, expect_code: int 200):断言响应状态码assert resp.status_code expect_code, f状态码错误预期{expect_code}实际{resp.status_code}def assert_response_code(resp: requests.Response, expect_code: int 0):断言业务响应码assert resp.json()[code] expect_code, f业务码错误预期{expect_code}实际{resp.json()[code]}def assert_response_contains(resp: requests.Response, key: str, value: Any):断言响应体包含指定键值对assert key in resp.json(), f响应体中不存在键{key}assert resp.json()[key] value, f键值错误预期{value}实际{resp.json()[key]}def assert_response_msg_contains(resp: requests.Response, expect_msg: str):断言响应消息包含指定内容assert expect_msg in resp.json()[msg], f响应消息不包含{expect_msg}实际{resp.json()[msg]}执行测试程序并生成相应的报告, 这一步骤中的第一项内容是关于基础性的执行命令。你需要在项目的目录里面, 找到那个根目录的地方, 然后执行下面提到的这个命令, 这样才可以把所有测试用例都运行起来。pytest -v2. 生成那个用来进行测试并且最后拿出来的报告。# 执行测试并生成 Allure 原始数据pytest -v --alluredirreports/allure-results# 启动本地服务查看报告allure serve reports/allure-results# 生成静态 HTML 报告可部署到服务器allure generate reports/allure-results -o reports/allure-report --clean全局配置通过在.ini这个文件里面进行配置, 把那些全局的参数都设定好, 这样做可以简化执行命令。[pytest]# 默认命令行参数-s 输出print信息 --tbshort 简化错误堆栈addopts -s --tbshort --alluredirreports/allure-results# 指定测试用例搜索路径testpaths testcases# 指定测试文件命名规则python_files test_*.py# 指定测试类命名规则python_classes Test*# 指定测试方法命名规则python_functions test_*# 标记用例用于分组执行markers smoke: 冒烟测试用例regression: 回归测试用例所谓的CI也就是持续集成, 还有CD那就是持续交付。要把这个框架集成到里面去, 好让代码提交以后能够自动把测试给触发了, 同时也能够实现定期的回归测试。进行插件的安装操作的话, 需要进入插件管理的环节里面去安装指定的那个内容, 然后再创建一个采用 Git 方式的新建的项目, 这个项目要设置为自由风格的类型, 在这一步中还要配置源码管理这个模块, 具体要做的事情就是把 Git 仓库的地址以及对应的分支信息给填写进去, 紧跟着还需要添加一个构建的步骤, 在这个步骤里执行 Shell 命令。# 安装依赖pip install -r requirements.txt# 执行测试pytest在配置构建之后的操作步骤时, 请添加该选项, 并将报告的路径指定为斜杠后加短横这种形式, 这是一种可选的配置项, 您可以参考常见的疑难杂症以及相关的常见问题解答内容来进行设置。安装失败怎么办在运行用例提示文件路径错误?中文乱码问题如何处理需要 Token 的接口结语做接口自动化这事, 绝对不是光管那个叫做写脚本的小动作这么随便, 而是要去搭一个能让以后一直修修补补、还能往后扩个更大的框子、最后能跟别的东西连在一起的保障质量的大体系。现在这篇文章给的方案呢, 就是一个打底用的基本架子, 你可以根据你们项目里真得需要的情况来接着变厚, 比如加上跟数据库打交道的那些功能, 再加个给接口签名确认的身份验证功能, 或者弄个能把文件上传上去和下载下来的那些操作能力等等这些额外事项。到现在为止, 这篇关于实现接口自动化测试方案的文章的介绍就到这里了, 如果你想要了解更多和接口自动化相关的内容的话请点击搜索脚本之家以前发表过的文章或者继续阅读下面将要呈现的相关文章内容, 衷心希望读者朋友们在以后的日子里能够多多支持一下脚本之家这个平台。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows下WebGoat 8.2.2安装实战:从JDK配置到漏洞靶场入门 2026/9/29 11:36:22

Windows下WebGoat 8.2.2安装实战:从JDK配置到漏洞靶场入门

如果你正在Windows上找一套能真正“手动玩起来”的Web安全训练环境,WebGoat 8.2.2应该会被很多人推荐。它是由OWASP维护的一套开源靶场,本质是一个故意写满漏洞的Java Web应用,内置了SQL注入、XSS、CSRF、路径穿越、身份认证缺陷、加密问题等…

阅读更多 →
GO学习笔记 2026/9/29 11:36:15

GO学习笔记

个人学习笔记,资源来自网上各位大佬 一、协程 1、coroutine M:1,一个协程阻塞,从属的协程也会阻塞 2、goroutine 有调度器,实现协程和线程的动态绑定和灵活调度栈空间动态伸缩(默认2KB)M&…

阅读更多 →
Cortex-M IAP中Vector Table Relocation死机避坑指南 2026/9/29 11:36:15

Cortex-M IAP中Vector Table Relocation死机避坑指南

1. 这不是个普通bug,是嵌入式系统里最隐蔽的“断电式”死机你有没有遇到过这样的情况:IAP升级完固件,设备能正常启动,串口也打印了第一行日志,但几毫秒后就彻底卡死,连调试器都连不上,SWD接口报…

阅读更多 →
Trae 项目实战:AI 智能开发环境在 Flask Web 开发中的性能评估与 TaoToken 接入 2026/9/29 11:36:08

Trae 项目实战:AI 智能开发环境在 Flask Web 开发中的性能评估与 TaoToken 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
WinDirStat v2.5.6 磁盘空间分析实战:从扫描到清理C盘 2026/9/29 11:35:49

WinDirStat v2.5.6 磁盘空间分析实战:从扫描到清理C盘

C盘又飘红了,任务栏右下角弹窗提醒空间不足,打开“此电脑”一看,C盘那根进度条已经贴到了最右边。我相信这种场景大家都不陌生,偏偏这时候你还找不到是什么东西把磁盘塞满了,只能靠猜:是下载文件夹&#xf…

阅读更多 →
考研高数背诵知识点全梳理:公式、定理与记忆技巧 2026/9/29 11:35:49

考研高数背诵知识点全梳理:公式、定理与记忆技巧

说句实在话,很多人一听到“考研高数背诵”这几个字,第一反应都是皱眉——数学不是靠理解的吗?怎么还跟政治、专业课一样需要背?但真正跟着张宇老师的资料走过一轮复习的人都清楚,高数里需要死记硬背的内容,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉