fixture固件和装饰器@pytest.mark.parametrize的参数化差异

fixture固件中有params参数可以进行参数化配置,装饰器@pytest.mark.parametrize也可以为用例进行参数化配置,它们都是pytest框架中用于参数化测试的机制,但它们之间还是有很大差异的,该篇文章就来讲一讲这二者的区别使用:

一、作用上的差异

pytest.fixture 是用于提供测试依赖项(如初始化数据、资源、环境状态等)的函数。它们可以用来设置测试前的初始状态、准备必要的测试数据、创建和清理临时资源(如数据库连接、文件、网络连接等),确保测试的隔离性和可重用性。

pytest.mark.parametrize 是一个装饰器,用于直接为测试函数指定一组或多组具体的输入参数和(可选的)预期输出。它使测试函数能够根据提供的数据集执行多次,每次使用不同的参数值,从而实现测试用例的参数化。

二、生命周期上的差异

pytest.fixture 可以定义不同的作用域(如 function、class、module、session),决定其在何时被创建、何时被销毁。同一个 fixture 在其作用域内对所有使用它的测试函数都是共享的,除非显式指定为每次使用时重新创建(使用 autouse=True 或 scope='function')。

pytest.mark.parametrize 每个使用 pytest.mark.parametrize 的测试函数实例仅在其自身的执行期间存在,不涉及任何共享状态或资源管理。参数化数据只影响测试函数的调用次数和传入的参数。

三、使用方式上的差异

pytest.fixture 通过在测试函数的参数列表中直接引用 fixture 函数名,pytest 会在运行测试函数前调用对应的 fixture 函数来获取所需资源,测试完成后执行 fixture 中的 yield(或 return,对于异步 fixture 使用 async def 和 await)语句之后的清理代码。

pytest.mark.parametrize 将 pytest.mark.parametrize 装饰器放置在测试函数定义之上,指定参数名和参数值列表(或生成器)。测试函数内部根据这些参数编写测试逻辑。

四、 参数化方式差异

pytest.fixture 自身可以通过 params 参数进行参数化,这样同名 fixture 会为每个参数值生成一个独立的版本,对应到不同的测试用例中。测试函数通过接收这些参数化的 fixture 来执行针对不同数据或环境状态的测试。

pytest.mark.parametrize 参数化数据直接在装饰器中定义,可以是静态的列表、元组、字典等,也可以是从外部源(如文件、数据库、API)动态获取的数据。测试函数根据参数化数据的不同组合生成多个独立的测试用例。

五、 差异总结

  1. 目的不同:fixture 主要用于管理和提供测试所需的依赖和资源,确保测试的可重复性和环境一致性;而 pytest.mark.parametrize 专注于对测试函数的输入参数进行多样化,以覆盖多种特定的测试场景。
  2. 生命周期管理:fixture 有明确的作用域概念,负责资源的创建、共享和清理;pytest.mark.parametrize 不涉及资源管理,只影响测试函数本身的执行次数。
  3. 使用位置:fixture 通过在测试函数参数列表中引用其名称来使用;pytest.mark.parametrize 通过装饰测试函数并指定参数名和参数值来使用。
  4. 参数化方式:fixture 通过自身定义中的 params 参数实现参数化;pytest.mark.parametrize 直接在装饰器中定义参数化数据。

两者可以结合使用,一个测试函数既可以通过引用参数化的 fixture 来获取准备好的测试资源,又可以使用 pytest.mark.parametrize 来接收一组或多组不同的直接参数值,从而实现复杂测试场景的细粒度覆盖。这样的组合使用可以充分利用 pytest 提供的参数化能力,以灵活、高效的方式组织和执行测试用例。

希望这篇文章能有效帮助大家区分固件fixture的参数化和装饰器pytest.mark.parametrize

相关推荐
Ronin-Lotus1 小时前
深度学习篇---Opencv中的机器学习和深度学习
python·深度学习·opencv·机器学习
信阳农夫1 小时前
Django解析跨域问题
后端·python·django
m0_371356152 小时前
【测试语言基础篇】Python基础之List列表
开发语言·python·list
大0马浓2 小时前
训练大模型LLM选择哪种开发语言最好
人工智能·python·训练
风筝超冷3 小时前
AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘
python
onejason3 小时前
如何利用爬虫获取腾讯新闻详情数据:实战指南
前端·python
yicode3 小时前
Python基础:列表与元组详解
后端·python
梦丶晓羽3 小时前
自然语言处理:无监督朴素贝叶斯模型
人工智能·python·自然语言处理·tf-idf·贝叶斯定理·词袋模型·无监督朴素贝叶斯模型
Y雨何时停T4 小时前
使用 Python 批量提取 PDF 书签:一款实用工具的实现
python·pdf