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

embedded/2024/9/25 13:17:39/

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.parametrizepytest.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


http://www.ppmy.cn/embedded/8367.html

相关文章

HTML的学习-通过创建相册WEB学习HTML-第一部分

文章目录 一、设置中文1.1、添加中文插件1.2、配置显示中文语言 二、学习开始2.1、创建项目文件夹2.2、h1标签示例:生成HTML框架示例:添加h1标签 2.3、h2标签示例:在h1标签下添加h2标签 2.4、h1标签到h6标签层次解析2.5、p标签示例&#xff1…

复合升降机器人教学科研平台——技术方案

一:功能概述 1.1 功能简介 复合升降机器人是一款集成移动底盘、机械臂、末端执行器、边缘计算平台等机构形成的教学科研平台,可实现机器人建图导航、路径规划,机械臂运动学、动力学、轨迹规划、视觉识别等算法功能和应用,提供例如…

LeetCode in Python 55. Jump Game (跳跃游戏)

跳跃游戏的游戏规则比较简单,若单纯枚举所有的跳法以判断是否能到达最后一个下标需要的时间复杂度为O(),为此,本文采用贪心策略,从最后一个下标开始逆着向前走,若能跳到第一个元素则表明可以完成跳跃游戏,反…

武汉星起航:深耕自营亚马逊,一站式孵化引领跨境风潮

公司创始人张振邦先生,是电子商务行业的资深专家。他深耕电子商务领域多年,积累了丰富的运营经验和敏锐的市场洞察力。在国家大力发展跨境电商行业的背景下,张振邦先生敏锐地捕捉到了这一行业的巨大潜力,于是毅然决然地创立了武汉…

cross-env 与 vue-cli-service 的区别

cross-env 与 vue-cli-service 的区别 一、cross-env用法多环境基本内容配置 (非必要,全局变量的一种方式) 二、vue-cli-service:用法 一、cross-env 它是为了解决跨平台环境变量设置的问题而开发的。 cross-env是一个用于设置跨…

实用VBA:19.Excel一键修复文件链接

1.需求场景 此前与大家分享过一键提取文件目录和文件名的方法,并且VBA中加一句语句就可以使提取出来的文件名带有链接,这样很方便在对大量文件进行检查时不必在资源管理器里到处翻目录,所见即所得,点击文件名即可打开文件。是个实…

JavaSE——常用API进阶二(7/8)-DateTimeFormatter、Period、Duration(常见方法、用法示例)

目录 DateTimeFormatter 主要方法 用法示例 Period 常见方法 用法示例 Duration 常见方法 用法示例 接下来继续要学习的是JDK 8之后新增的代替SimpleDateFormat的一个API——DateTimeFormatter 同样是用来格式化和解析时间的,与SimpleDateFormat相比较来说…

010Node.js自定义模块通过exports的使用,两种暴露的方法及区别(二)

module/request.js var obj{get:function(){console.log(从服务器获取数据);},post:function(){console.log(提交数据);} }exports.xxxxobj;//方法一 { xxxx: { get: [Function: get], post: [Function: post] } }//module.exportsobj;//方法二 //{ get: [Function: g…