Pytest精通指南(14)Parametrize之indirect(间接参数)


文章目录


官方概念

概念分析

pytest@pytest.mark.parametrize装饰器中,indirect参数用于指示是否应该从fixtures中解析参数值,而不是直接使用提供的值。

当 indirect=False(默认值)时:

  • argnames参数被当成普通变量处理;
  • argvalues中提供的值会直接作为这些变量的值。
  • 此时,argnames中不需要引用任何已定义的fixture

当 indirect=True 时:

  • argnames参数被当成fixture函数处理;
  • pytest会尝试从定义的fixtures中查找具有相同名称的fixture
  • 如果存在则将argvalues值作为argnames函数中的参数传参给这个fixture
  • 之后将fixture函数的返回值作为参数化数据,
  • 因此,必须先行定义与之匹配的fixture函数。

理解indirect参数的关键是将其视为一个开关,用于控制argnames的解析方式。

这种机制使得我们可以灵活地管理测试数据,将复杂的数据生成逻辑封装在fixtures中,并通过参数化测试来复用这些数据。

官方示例

示例代码

python 复制代码
import pytest


@pytest.fixture(scope='function')
def x(request):
    return request.param * 3


@pytest.fixture(scope='function')
def y(request):
    return request.param * 2


@pytest.mark.parametrize('x,y', [['a', 'b']], indirect=['x'])
def test_x(x, y):
    assert x == 'aaa'
    assert y == 'b'


@pytest.mark.parametrize('x,y', [['a', 'b']], indirect=['x','y'])
def test_x_y(x, y):
    assert x == 'aaa'
    assert y == 'bb'

执行结果

示例分析

示例代码

python 复制代码
import pytest


@pytest.fixture(scope='function')
def x(request):
    return request.param * 3


@pytest.fixture(scope='function')
def y(request):
    return request.param * 2


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=['x'])
def test_x(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'b'


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=['x', 'y'])
def test_x_y(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'bb'

执行结果

验证indirect为True但不指定fixture

示例代码

python 复制代码
import pytest


@pytest.fixture(scope='function')
def x(request):
    return request.param * 3


@pytest.fixture(scope='function')
def y(request):
    return request.param * 2


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=['x'])
def test_x(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'b'


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=True)
def test_x_y(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'bb'

执行结果

验证indirect为True但不存在fixture

示例代码

python 复制代码
import pytest


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=['x'])
def test_x(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'b'


@pytest.mark.parametrize(argnames='x,y', argvalues=[['a', 'b']], indirect=True)
def test_x_y(x, y):
    print(f"x={x}, y={y}")
    assert x == 'aaa'
    assert y == 'bb'

执行结果

相关推荐
cnxy18811 小时前
围棋对弈Python程序开发完整指南:步骤1 - 棋盘基础框架搭建
开发语言·python
落叶,听雪12 小时前
河南建站系统哪个好
大数据·人工智能·python
石像鬼₧魂石12 小时前
HexStrike-AI人工智能 渗透测试学习(Metasploitable2 192.168.1.4)完整流程总结
学习·ubuntu
非凡ghost12 小时前
MusicPlayer2(本地音乐播放器)
前端·windows·学习·软件需求
极客小云12 小时前
【生物医学NLP信息抽取:药物识别、基因识别与化学物质实体识别教程与应用】
python·机器学习·nlp
南_山无梅落13 小时前
12.Python3函数基础:定义、调用与参数传递规则
python
蓝桉~MLGT13 小时前
Ai-Agent学习历程—— 阶段1——环境的选择、Pydantic基座、Jupyter Notebook的使用
人工智能·学习·jupyter
laocooon52385788614 小时前
插入法排序 python
开发语言·python·算法
杰米不放弃14 小时前
AI大模型应用开发学习-26【20251227】
人工智能·学习
执笔论英雄15 小时前
【RL】Megatron使学习forward_backward_func返回值
学习