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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开发之路——node.js安装

1. 安装node.js 最新Node.js安装详细教程及node.js配置 (1)默认的全局的安装路径和缓存路径 npm安装模块或库(可以统称为包)常用的两种命令形式: 本地安装(local):npm install 名称全局安装(global):npm install 名称 -g本地安装和全局安装…

【Leetcode】string类刷题

🔥个人主页:Quitecoder 🔥专栏:Leetcode刷题 目录 1.仅反转字母2.字符串中第一个唯一字符3.验证回文串4.字符串相加5.反转字符串I I6.反转字符串中的单词III7.字符串相乘8.把字符串转换为整数 1.仅反转字母 题目链接:…

一篇文章带您了解面向对象(java)

1.简单理解面向过程编程和面向对象编程 面向过程编程:开发一个一个的方法,有数据需要处理,我们就可以调用方法来处理。 package com.web.quictstart;public class demo1 {public static void main(String[] args) {totalScore("张三&q…

mac上VMware fusion net模式无法正常使用的问题

更新时间:2024年04月22日21:39:04 1. 问题 环境: intel芯片的macbook pro VMware fusion 13.5.1 无法将“Ethernet0”连接到虚拟网络“/dev/vmnet8”。在这里显示这个之后,应该是vmnet8的网段发生了冲突,所以导致无法正常使用…

前端开发攻略---拖动归类,将元素拖拽到相应位置

1、演示 2、代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-…

2024年Q1季度平板电视行业线上市场销售数据分析

Q1季度平板电视线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;平板电视累计销量约360万件&#xff0c;环比下降12%&#xff0c;同比下降30%&#xff1b;累计销售额约99亿元&#xff0c;环比下降28%&a…

学习STM32第十七天

备份域详解 一、简介 在参考手册的电源控制章节&#xff0c;提到了备份域&#xff0c;BKPR是在RTC外设中用到&#xff0c;包含20个备份数据寄存器&#xff08;80字节&#xff09;&#xff0c;备份域包括4KB的备份SRAM&#xff0c;以32位、16位或8位模式寻址&#xff0c;在VBAT…

C++初阶学习第二弹——C++入门(下)

C入门&#xff08;上&#xff09;&#xff1a;C初阶学习第一弹——C入门&#xff08;上&#xff09;-CSDN博客 目录 一、引用 1.1 引用的实质 1.2 引用的用法 二、函数重载 三、内敛函数 四、auto关键字 五、总结 前言&#xff1a; 在上面一章我们已经讲解了C的一些基本…

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录 1、TCP通信 1.1、Socket 和 ServerSocket 1.3、TCP通信示例 2、UDP的三种通信&#xff08;数据传输&#xff09;方式 1、TCP通信 TCP通信协议是一种可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象 通信之前要保证连接已经建立&#xff08;注意TCP是一…

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑&#xff0c;又可以称为 k-ary n-cubes&#xff0c;在规则的 n 维网格中包裹着 N k^n 个节点&#xff0c;每个维度都有 k 个节点&#xff0c;并且最近邻居之间有通道。k-ary n-c…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/21]

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

《HCIP-openEuler实验指导手册》1.3Apache动态功能模块加载卸载练习

1.3.1 配置思路 mod_status 模块可以帮助管理员通过web界面监控Apache运行状态&#xff0c;通过LoadModule指令加载该模块&#xff0c;再配置相关权限&#xff0c;并开启ExtendedStatus后&#xff0c;即可使用该模块。 1.3.2 配置步骤 检查mod_status模块状态&#xff08;使…

net模块

建立TCP的链接 1 发送消息的服务 2 接收消息 2 建立http的链接让浏览器进行访问 import net from netconst html <h1>TCP</h1>const respinseHeaders [HTTP/1.1 200 OK,Content-Type:text/html,Content-Length: html.length,\r\n,html]const http net.create…

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

Spring(下)

接上篇&#xff0c;从第八个问题讲起 八.Spring工厂创建复杂对象 1.什么是复杂对象 简单对象就是可以直接new出来的&#xff0c;也就是直接调用构造方法创建 所以复杂对象就是不能直接通过调用构造方法创建。就比如JDBC中的Connection 2.三种方法 &#xff08;1&#xff…

【华为 ICT HCIA eNSP 习题汇总】——题目集18

1、SSH默认工作使用的TCP端口号是&#xff08;&#xff09;。 A、20 B、21 C、22 D、23 考点&#xff1a;①传输层 ②应用层 解析&#xff1a;&#xff08;C&#xff09; SSH为建立在应用层和传输层上的安全协议&#xff0c;是对TCP/IP协议的传输层以上的SSH会话流程进行加密的…

必应搜索广告与谷歌搜索广告对比那个更好?

搜索引擎广告作为企业获取潜在客户的重要渠道之一&#xff0c;其效果直接关系到营销策略的成功与否。两大搜索引擎巨头——谷歌&#xff08;Google&#xff09;和必应&#xff08;Bing&#xff09;各自提供了广告平台&#xff0c;即谷歌广告&#xff08;Google Ads&#xff09;…

【Web】2022DASCTF X SU 三月春季挑战赛 题解(全)

目录 ezpop calc upgdstore ezpop 瞪眼看链子 fin#__destruct -> what#__toString -> fin.run() -> crow#__invoke -> fin#__call -> mix.get_flag() exp <?php class crow {public $v1;public $v2;}class fin {public $f1; }class what {public $a; }…

力扣hot100(python解析)

文章目录 13. 合并区间14. 轮转数组 13. 合并区间 合并区间 数组 排序 思路&#xff1a; 代码&#xff1a; class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort() # 默认按照区间的左边界进…