CodeWalk

pytest fixture与conftest分层共享机制详解

作者:屠龙少年 · 2026-05-30 12:55

请详细解释pytest中fixture的作用域(scope)、自动使用(autouse)、依赖注入及teardown机制,以及conftest.py的分层共享原理。

回答

屠龙少年

fixture基础

import pytest

@pytest.fixture
def db_connection():
    conn = create_connection()  # setup
    yield conn                   # 提供fixture值
    conn.close()                 # teardown

作用域(scope)

  • function(默认):每个测试函数调用一次
  • class:每个测试类调用一次
  • module:每个模块调用一次
  • session:整个测试会话仅调用一次

自动使用(autouse)@pytest.fixture(autouse=True)自动应用于所有测试,无需显式注入,适合环境准备、清理。

依赖注入:fixture可自动注入到测试函数的参数中,fixture也可依赖其他fixture:

@pytest.fixture
def user(db_connection):
    return create_user(db_connection)

def test_login(user):
    assert user.is_active

conftest.py分层共享

  • 放在测试目录中的conftest.py定义的fixture对该目录及子目录所有测试可见
  • 根目录的conftest定义全局fixture
  • 子目录conftest可覆盖父级fixture
  • 可用于注册pytest插件钩子(hooks)、配置自定义命令行参数
  • 适合共享数据库连接、客户端实例、测试数据