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'

执行结果

相关推荐
大丈夫立于天地间19 分钟前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信
通信.萌新35 分钟前
OpenCV边沿检测(Python版)
人工智能·python·opencv
Bran_Liu41 分钟前
【LeetCode 刷题】字符串-字符串匹配(KMP)
python·算法·leetcode
weixin_3077791343 分钟前
分析一个深度学习项目并设计算法和用PyTorch实现的方法和步骤
人工智能·pytorch·python
Chambor_mak1 小时前
stm32单片机个人学习笔记14(USART串口数据包)
stm32·单片机·学习
Channing Lewis2 小时前
flask实现重启后需要重新输入用户名而避免浏览器使用之前已经记录的用户名
后端·python·flask
Channing Lewis2 小时前
如何在 Flask 中实现用户认证?
后端·python·flask
PaLu-LI2 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉
水银嘻嘻2 小时前
【Mac】Python相关知识经验
开发语言·python·macos
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j