pytest的fixture速查手册

1️⃣ 定义与作用

  • 定义:用 @pytest.fixture 装饰的函数,用来 准备测试环境或数据。
  • 作用:提供测试数据、对象或状态执行 setup(测试前)和 teardown(测试后)支持依赖和复用改善测试函数可读性(减少重复代码)


2️⃣ Fixture 的使用方式

a. 基本用法

import pytest

@pytest.fixture
def sample_data():
    return [1, 2, 3]

def test_sum(sample_data):
    assert sum(sample_data) == 6
  • 通过参数名 sample_data 自动注入 fixture。


b. 使用 yield 进行 teardown

@pytest.fixture
def resource_yield():
    print("Setup: 打开资源")
    res = {"conn": "数据库连接"}
    yield res  # yield 前是 setup
    print("Teardown: 关闭资源")
    res["conn"] = None

c. 使用 request.addfinalizer 进行 teardown

@pytest.fixture
def resource_finalizer(request):
    print("Setup: 打开资源")
    res = {"conn": "数据库连接"}

    # 注册清理函数
    def teardown():
        print("Teardown: 关闭资源")
        res["conn"] = None

    request.addfinalizer(teardown)
    return res
  • 区别:yield:fixture 函数写成“生成器”,yield 前是 setup,yield 后是 teardown。addfinalizer:注册一个函数,在测试结束后执行 teardown。


d. 使用 fixture 的测试函数

def test_yield_fixture(resource_yield):
    print("使用资源(yield):", resource_yield)

def test_finalizer_fixture(resource_finalizer):
    print("使用资源(finalizer):", resource_finalizer)

执行顺序示意

Setup: 打开资源
使用资源(yield): {'conn': '数据库连接'}
Teardown: 关闭资源

Setup: 打开资源
使用资源(finalizer): {'conn': '数据库连接'}
Teardown: 关闭资源


3️⃣ Fixture 范围(Scope)

scope生命周期使用场景
function每个测试函数调用一次每次测试独立数据
class每个测试类调用一次类级别共享资源
module每个模块调用一次模块级别共享数据
session整个 pytest 会话调用一次全局资源,如数据库连接


4️⃣ Fixture 的依赖

@pytest.fixture
def user():
    return {"name": "Alice"}

@pytest.fixture
def admin_user(user):
    user["role"] = "admin"
    return user

def test_admin(admin_user):
    assert admin_user["role"] == "admin"
    assert admin_user["name"] == "Alice"


5️⃣ 自动使用 fixture

@pytest.fixture(autouse=True)
def setup_env():
    print("自动 setup 环境")
  • 设置 autouse=True 后,所有测试函数自动使用。


6️⃣ Teardown 与资源释放总结

  • yield:yield 后代码自动执行
  • request.addfinalizer:注册函数,测试结束后自动调用
  • 注意:pytest 不会自动调用对象的 close(),需要在 teardown 中显式调用


💡 记忆口诀

Fixture = 准备 + 注入 + Teardown@pytest.fixture → 定义参数名 → 自动注入yield / addfinalizer → 自动清理


文章标签:

评论(0)