当前位置: 首页 > news >正文

自动化测试|Pytest中的fixture装饰器详解

pytest是Python生态中最流行的自动化测试框架,它通过简洁的语法、强大的功能(如fixture、参数化、插件扩展等)和丰富的插件生态,帮助开发者高效完成单元测试、集成测试和端到端测试。fixture是pytest框架中最核心、最强大的功能之一,它提供了一种优雅的方式来管理测试依赖项(如数据库连接、测试数据、API客户端等),实现了测试代码的模块化和复用。

1fixture基础概念

1. fixture的作用

  • 依赖注入:自动将资源(如数据库连接)注入到测试函数中

  • 资源管理:统一管理测试资源的创建和清理

  • 复用性:多个测试用例可以共享同一个fixture

2. 基本语法

import pytest @pytest.fixture def fixture_name(): # 初始化代码 resource = create_resource() yield resource # 返回资源给测试用例使用 # 清理代码(测试完成后执行) resource.cleanup()

2fixture核心特性

1. 作用域控制

通过scope参数控制fixture的生命周期:

  • function(默认):每个测试函数执行一次

  • class:每个测试类执行一次

  • module:每个Python模块执行一次

  • package:每个包执行一次

  • session:整个测试会话执行一次

@pytest.fixture(scope="module") def shared_resource(): return create_expensive_resource()

2. 自动使用

通过autouse=True让fixture自动执行,无需显式调用​​​​​​​

@pytest.fixture def db_connection(): return connect_to_database() @pytest.fixture def user_repo(db_connection): return UserRepository(db_connection)

3. 依赖其他fixture

fixture可以依赖其他fixture​​​​​​​

@pytest.fixture def db_connection(): return connect_to_database() @pytest.fixture def user_repo(db_connection): return UserRepository(db_connection)

3fixture使用案例

1)API客户端初始化​​​​​​​

import pytest import requests @pytest.fixture(scope="module") def api_client(): client = requests.Session() client.base_url = "https://api.example.com" client.headers = {"Authorization": "Bearer test_token"} yield client # 整个测试模块共享同一个客户端 client.close() # 模块测试完成后关闭 def test_get_user(api_client): response = api_client.get("/users/1") assert response.status_code == 200 assert response.json()["name"] == "Alice"

2)Web浏览器实例管理(结合Selenium)​​​​​​​

import pytest from selenium import webdriver @pytest.fixture(scope="class") def browser(): driver = webdriver.Chrome() driver.implicitly_wait(10) yield driver # 整个测试类共享同一个浏览器实例 driver.quit() # 类测试完成后关闭浏览器 class TestWebLogin: def test_login(self, browser): browser.get("https://example.com/login") browser.find_element("#username").send_keys("admin") browser.find_element("#password").send_keys("secret") browser.find_element("#submit").click() assert "Dashboard" in browser.title

4fixture高级技巧

1)动态fixture参数化​​​​​​​

@pytest.fixture(params=["sqlite", "mysql", "postgres"]) def database(request): return create_db_connection(request.param) def test_db_operations(database): assert database.execute("SELECT 1") == 1

2)多个fixture组合​​​​​​​

@pytest.fixture def auth_token(): return "test_token_123" @pytest.fixture def authenticated_client(api_client, auth_token): api_client.headers["Authorization"] = f"Bearer {auth_token}" return api_client def test_protected_endpoint(authenticated_client): response = authenticated_client.get("/protected") assert response.status_code == 200
http://www.cnnetsun.cn/news/1668665.html

相关文章:

  • 30美元终极方案:揭秘如何将普通眼镜快速改造成AI智能眼镜
  • 网站 SEO 优化包年一般多少钱_网站 SEO 优化包年后如何提高网站流量
  • 别再只删聊天记录了!个人数字遗产与隐私保护指南:电子数据取证视角下的实用建议
  • 本科论文救星?实测百考通AI写作:把论文难题变“填空题”
  • 答辩PPT有救了!百考通AI:毕业季的智能助手,高效打造专业学术演示
  • 3步掌握百度网盘秒传链接:全平台网页工具使用指南
  • 自用超香的 Navidrome 音乐库搭建分享,告别听歌各种糟心事!
  • SkeyeVSS开发心得-SSE架构与注意事项
  • 基于Spring Boot的旅游行程规划系统的设计与实现
  • 3个突破暗黑破坏神2存档限制的核心工具:d2s-editor技术解析与实践指南
  • 用C++手搓拓扑排序:从邻接矩阵到完整代码,一个头文件搞定OJ题
  • 【树莓派开发】gcc编译器下#pragma once报错解析与条件编译替代方案
  • JIT加速不生效?你漏掉了这4个强制启用开关,3.14新增--enable-jit-unsafe-mode正在被92%团队忽略
  • 三步掌握ChemCrow:从零基础到化学AI实践的完整路径
  • OpenClaw技能扩展实战:Qwen3-32B驱动公众号Markdown发布
  • Gemma 4重磅发布:多模态AI模型性能大突破
  • slam_toolbox进阶实战:从零构建动态地图与长期定位(ROS1 Melodic)
  • Arduino红外遥控库:让硬件设备听懂遥控器的语言
  • 用CasADi C++库为ROS2机器人写个NMPC控制器:从安装到倒立摆仿真实战
  • Citra模拟器完全指南:免费在PC上畅玩3DS游戏的终极解决方案
  • 那本你以为读懂了的芯片手册,其实只读了一半
  • Project Eye:高效保护视力的终极Windows护眼软件解决方案
  • 5步构建智能文献处理系统:面向科研工作者的Zotero AI插件应用指南
  • Delphi网络编程:工程化日志与调试落地(精简篇)
  • Delphi网络编程:10分钟快速搭建可商用的TCP通信小项目
  • Delphi网络编程:项目优化与性能调优实战
  • ai辅助python入门:让快马平台成为你的智能编程导师与答疑助手
  • Klipper固件技术解密:从问题诊断到性能优化的实战指南
  • 5个高效步骤:用Pylance提升Python开发效率 | Pylance使用指南
  • Meixiong Niannian画图引擎VisualStudio开发:Windows平台集成