Pytest中的fixture装饰器详解

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

fixture基础概念

  1. fixture的作用
  • 依赖注入:自动将资源(如数据库连接)注入到测试函数中
  • 资源管理:统一管理测试资源的创建和清理
  • 复用性:多个测试用例可以共享同一个fixture

2.基本语法

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

2.fixture核心特性

  1. 作用域控制
  • 通过scope参数控制fixture的生命周期:

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

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

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

  • package:每个包执行一次

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

csharp 复制代码
@pytest.fixture(scope="module")
def shared_resource():
    return create_expensive_resource()
  1. 自动使用

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

csharp 复制代码
@pytest.fixture
def db_connection():
    return connect_to_database()
@pytest.fixture
def user_repo(db_connection):
    return UserRepository(db_connection)
  1. 依赖其他fixture

fixture可以依赖其他fixture

csharp 复制代码
@pytest.fixture
def db_connection():
    return connect_to_database()
@pytest.fixture
def user_repo(db_connection):
    return UserRepository(db_connection)

3.fixture使用案例

1)API客户端初始化

csharp 复制代码
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)

csharp 复制代码
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

4.fixture高级技巧

1)动态fixture参数化

csharp 复制代码
@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组合

csharp 复制代码
@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
相关推荐
Lary_c1 天前
【测试自动化】pytest + Allure 完整学习指南
运维·自动化·pytest
我的xiaodoujiao3 天前
API接口自动化测试详细图文教程学习系列1--序章
python·学习·pytest
我的xiaodoujiao4 天前
API 接口自动化测试详细图文教程学习系列2--相关Python基础知识
python·学习·测试工具·pytest
H_unique5 天前
博客接口自动化测试--搭建测试环境&库的介绍&安装allure
python·pytest·测试
真智AI5 天前
MCP+pytest自动重构回归:复刻ARIS循环
重构·pytest
零基础的修炼6 天前
自动化测试---pytest
pytest
鲜于言悠9057 天前
博客系统测试报告
python·功能测试·selenium·jmeter·测试用例·集成测试·pytest
0和1的舞者7 天前
高并发论坛系统:单元测试 + 接口自动化 + 性能测试 + CI/CD 全链路测试报告
java·测试开发·测试工具·jmeter·pytest·测试·测试报告
独断万古他化8 天前
Python+Pytest 搭建博客系统接口自动化测试框架(全用例执行+完整代码)
pytest·接口自动化·测试·allure·requests
王夏奇8 天前
python-pytest学习
python·学习·pytest