Pytest 如何给 Fixture 传递参数?

Pytest 给 fixture 传参的三种方式:@pytest.fixture(params=[...]) 参数化、间接参数化 @pytest.mark.parametrize 加 indirect=True、以及 request 对象读取上下文。本文给出完整示例。

最佳实践
Pytest 如何给 Fixture 传递参数?封面

两种主路径:fixture 自身参数化——@pytest.fixture(params=[...]) 中通过 request.param 取值;或测试侧间接传参——@pytest.mark.parametrize(..., indirect=True)

方式一:fixture 自带参数列表

import pytest

@pytest.fixture(params=["mysql", "postgres"])
def db(request):
    conn = create_connection(request.param)   # request.param 取当前参数
    yield conn
    conn.close()

def test_query(db):
    assert db.query("SELECT 1")               # 自动跑两遍:mysql 和 postgres

方式二:测试侧传参(indirect)

@pytest.fixture
def user(request):
    return create_user(role=request.param)

@pytest.mark.parametrize("user", ["admin", "guest"], indirect=True)
def test_permission(user):
    ...

参数从测试用例流向 fixture——测试控制数据,fixture 控制构造。

方式三:命令行/配置读取

@pytest.fixture
def base_url(request):
    return request.config.getoption("--env-url")

常见问题(FAQ)

Q:params 支持对象吗? 支持任意 Python 对象,用 ids 参数给每个参数起可读的名字。

Q:fixture 之间能传参吗? fixture 不能直接接收测试参数,间接路径:测试 parametrize + indirect 到中间 fixture。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台