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

devtools/2024/12/22 21:54:08/

文章目录

      • 官方概念
      • 概念分析
      • 官方示例
      • 示例分析
      • 验证indirect为True但不指定fixture
      • 验证indirect为True但不存在fixture


请添加图片描述

官方概念

请添加图片描述

概念分析

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'

执行结果

请添加图片描述


http://www.ppmy.cn/devtools/2207.html

相关文章

C++初阶学习第一弹——C++入门(上)

前言: 很高兴,从今天开始,我们就要步入C的学习了,在这之前我们已经对C语言有了不错的了解,对数据结构也有了一些自己的认识,今天开始,我们就进入这个新的主题的学习——C 目录 一、C的发展即其特…

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下,虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同,虚拟试衣节省时间、方便客户,并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

序列化和反序列化

一 概念理解 先前已经可以利用sock套接字通信了,但是数据如何处理就是我们应用层协议的内容了,之前都是发送一些字符串,但是实际上我们发送的消息可能是个结构化的数据。 那我们能不能直接发结构体呢? 可以但是会浪费空间,你想想…

opencv+python(顶帽+黑帽)

1、顶帽运算:去除目标图像外的噪声,原图-开运算; morphologyEx(src, op, # 为形态变换的类型 MORPH_TOPHAT:顶帽,又称礼帽 kernel, dst: , anc…

日常项目管理和开发中经常使用的Git统计命令

日常项目管理和开发中经常使用的Git统计命令 引言应用场景一:统计项目整体提交次数应用场景二:按开发者统计提交数量应用场景三:统计每日/每周提交活动应用场景四:统计单个文件或目录的修改频率应用场景五:按照commitI…

linux应急响应基础命令

一、cpu使用率-top top -c -o %CPU -c 显示进程的命令行参数 -o 按照CPU占用从大到小排序二、用户信息 1、查看系统所有用户信息 [rootcentos7 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nol…

Qt | 对象树与生命期(对象的创建、销毁、擦查找)

一、组合模式与对象树 1、组合模式指的是把类的对象组织成树形结构,这种树形结构也称为对象树,Qt 使用对象树来管理 QObject 及其子类的对象。注意:这里是指的类的对象而不是类。把类组织成树形结构只需使用简单的继承机制便可实现。 2、使用组合模式的主要作用是可以通过…

NSA发布《在数据支柱中推进零信任成熟度》报告

4月9日,美国国家安全局(NSA)发布了题为《在数据支柱中推进零信任成熟度》的报告,旨在于数据安全层面提供指导,以增强数据整体安全性并保护静态和传输中的数据。(如下图) 一、主要内容 报告中的建议侧重于将…