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'

执行结果

相关推荐
StickToForever8 分钟前
第4章 信息系统架构(五)
经验分享·笔记·学习·职场和发展
Hylan_J2 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
莫忘初心丶2 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
leegong231114 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
Moonnnn.4 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
失败尽常态5234 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447744 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农4 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿5 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
南宫生5 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode