当前位置: 首页 > news >正文

Pytest之fixture的常见用法

文章目录

  • 1.前言
  • 2.使用fixture执行前置操作
  • 3.使用conftest共享fixture
  • 4.使用yield执行后置操作

1.前言

在pytest中,fixture是一个非常强大和灵活的功能,用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等,
与setup和teardown类似。

2.使用fixture执行前置操作

示例:

import pytest@pytest.fixture()
def fixture():print('执行前置操作')def test_01(fixture):assert 1==1def test_02():assert 2==2if __name__ == '__main__':pytest.main()

运行结果中可以看到第一条测试用例执行时,输出了“执行前置操作”:
在这里插入图片描述

  • 定义fixture:使用@pytest.fixture装饰器来定义一个fixture函数。

注意测试用例中传递的fixture是将定义好的函数名传过去的

作用域:fixture的作用域决定了它在测试中的生命周期和应用范围,通过scope参数来指定,有以下几种常见的作用域:

  • function(默认):每个测试函数都会调用一次fixture。
  • class:每个测试类中的所有测试方法共享同一个fixture实例,在测试类的所有测试方法执行前创建,执行完后销毁。
  • module:在整个测试模块中只创建一次fixture实例,模块中的所有测试函数和测试类共享。
  • session:在整个测试会话期间只创建一次fixture实例,所有测试模块、测试类和测试函数都共享。

除了之外,可以通过params参数为fixture传递不同的参数值,实现参数化测试。

import pytest@pytest.fixture(params=[1, 2, 3])
def parameter_fixture(request):return request.paramdef test_parameterized(parameter_fixture):print(f"测试参数: {parameter_fixture}")assert parameter_fixture > 0
  • fixture函数中的变量名必须为request。

运行结果:
在这里插入图片描述

如果觉得每次使用fixture函数的时候都需要将fixture函数当参数传入测试用例中比较麻烦,可以在fixture

import pytest@pytest.fixture(autouse = True)
def test_fixture():print('执行前置操作')def test_01():assert 1==1def test_02():assert 2==2if __name__ == '__main__':pytest.main()

运行结果:
在这里插入图片描述

3.使用conftest共享fixture

在 pytest 中,conftest.py 是一个非常重要的文件,它主要用于在多个测试文件之间共享 fixture、钩子函数等,帮助组织和管理测试代码。
使用conftest.py注意事项:

  1. conftest.py为固定写法,不能修改名字
  2. 使用conftest.py文件方法无需倒入
  3. 位于项目的根目录,那么它定义的 fixture 和钩子函数对整个项目的测试文件都有效。
  4. 如果 conftest.py 位于某个子目录下,那么它定义的内容只对该子目录及其子目录下的测试文件有效。

示例:
创建conftest.py文件在根目录下,并输入以下内容

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service@pytest.fixture(scope='session')
def driver():driver = webdriver.Chrome()driver.maximize_window()return driver

创建一个文件测试conftest中fixture函数
代码如下:

import pytestdef test_01(driver):driver.get('https://www.baidu.com/')title = driver.titleassert title == '百度一下,你就知道'def test_02(driver):driver.get('https://www.bilibili.com/')url = driver.current_urlassert url == 'https://www.bilibili.com/'if __name__ == '__main__':pytest.main()

执行结果:
在这里插入图片描述
可以看出fixture函数成功运行了,但是上述代码中虽然有前置获取浏览器驱动的操作,但没有关闭浏览器驱动,虽然会自动关闭,但最好还是自己手动释放一下。如果想要执行后置操作,就需要使用yield

4.使用yield执行后置操作

在 pytest 的 fixture 函数里,yield 关键字用于分隔测试的前置和后置操作。在 yield 之前的代码会在测试用例执行前运行,起到初始化环境、准备数据等前置操作的作用;yield 之后的代码会在测试用例执行完毕后运行,用于清理资源、恢复环境等后置操作。

将conftest.py中代码修改一下:

@pytest.fixture(scope='session')
def driver():driver = webdriver.Chrome()driver.maximize_window()print('打开浏览器')yield driverprint('关闭浏览器')driver.quit()

注意这里是yield driver而不是return driver

  • 当 fixture 函数中使用 return driver 时,函数执行到 return 语句就会立即返回 driver 对象并终止函数的执行,不会再执行 return 语句之后的代码。
  • yield 关键字使 fixture 函数成为一个生成器函数。当执行到 yield driver 时,函数会暂停执行并返回 driver 对象给测试用例使用。当测试用例执行完毕后,fixture 函数会从 yield 语句的下一行继续执行。

再次执行刚才的测试用例
在这里插入图片描述
可以看到有输出语句,说明yield后面的代码被执行到了

相关文章:

Pytest之fixture的常见用法

文章目录 1.前言2.使用fixture执行前置操作3.使用conftest共享fixture4.使用yield执行后置操作 1.前言 在pytest中,fixture是一个非常强大和灵活的功能,用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等, 与setup和te…...

FFmpeg入门:最简单的视频播放器

FFmpeg入门:最简单的视频播放器 FFmpeg入门第一篇,制作一个简单的MP4视频播放器。 整体流程 话不多说,直接上流程图 视频播放速率控制 这里可以直接看图中的帧率同步模块,可以分为如下几步 获取到当前帧的预期播放时间&…...

GitHub 语析 - 基于大模型的知识库与知识图谱问答平台

语析 - 基于大模型的知识库与知识图谱问答平台 GitHub 地址:https://github.com/xerrors/Yuxi-Know 📝 项目概述 语析是一个强大的问答平台,结合了大模型 RAG 知识库与知识图谱技术,基于 Llamaindex VueJS FastAPI Neo4j 构…...

Linux《基础开发工具(上)》

在之前的篇章当中我们已经了解了Linux当中基本的指令以及相关的知识,那么接下来在本篇当中就开始学基本的开发工具,在此我们一共要了解6大开发工具,在此将这些工具的学习分为上中下篇,在本篇当中我们首先要来学习的是yun以及vim,一…...

【考试大纲】初级信息系统运行管理员考试大纲

目录 引言一、考试要求1、 考试说明2、 考试要求3、 本考试设置的科目包括:二、考试范围考试科目1:信息系统基础知识(初级)考试科目2:信息系统运行管理(应用技术)引言 最新的信息系统运行管理员考试大纲出版于 2018 年 9 月,本考试大纲基于此版本整理。 一、考试要求…...

《每天搞懂一道Hard》之数独终结者(LeetCode 37)

📌《每天搞懂一道Hard》之数独终结者(LeetCode 37) 🔗原题链接:https://leetcode.com/problems/sudoku-solver/ 今天我们来解剖一个经典回溯算法问题——数独求解器!这道题在算法面试中出现频率高达35%&a…...

LangChain原理解析及开发实战指南(2025年最新版)

一、LangChain核心架构解析 1.1 框架设计理念 LangChain是基于提示工程(Prompt Engineering)构建的LLM应用开发框架,其核心思想是通过模块化组件实现大语言模型与业务系统的无缝对接。该框架采用分层设计: 接口层:统一对接OpenAI、DeepSee…...

YoloV8改进策略:Block改进|CBlock,Transformer式的卷积结构|即插即用

摘要 论文标题: SparseViT: Nonsemantics-Centered, Parameter-Efficient Image Manipulation Localization through Spare-Coding Transformer 论文链接: https://arxiv.org/pdf/2412.14598 官方GitHub: https://github.com/scu-zjz/SparseViT 这段代码出自SparseViT ,代码如…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file

ngx_open_file 定义在src/os/unix/ngx_files.h #define ngx_open_file(name, mode, create, access) \open((const char *) name, mode|create, access)#define NGX_FILE_RDONLY O_RDONLY #define NGX_FILE_WRONLY O_WRONLY #de…...

测试金蝶云的OpenAPI

如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中,我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧! 2. 下载所需的SDK文件 2.1 获取SDK 首先&…...

C语言408考研先行课第一课:数据类型

由于408要考数据结构……会有算法题…… 所以,需要C语言来进行一个预备…… 因为大一贪玩,C语言根本没学进去……谁能想到考研还用得到呢?【手动doge(bushi) 软件用的是Clion,可以自行搜索教程下载使用。…...

11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?

Redis 中跳表的实现原理是什么? Redis 中的跳表(Skip List)是一种基于有序链表的高效数据结构,通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理: 1. 基本概念 节点结构:跳…...

单细胞分析(19)—— 单细胞转录组基因集评分方法

下面是每种基因集评分方法的原理介绍代码示例,适用于R语言和Python两种主流生信分析环境。可以直接应用于单细胞转录组(scRNA-seq)数据分析中。 🔬 单细胞转录组基因集评分方法(附代码示例) 在单细胞RNA测…...

010 rocketmq批量消息

文章目录 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量发送可以提⾼发送性能,但有⼀定的限制: topic 相同 waitStoreMsgOK 相同 (⾸先我们建设消息的iswaitstoremsgoktrue(默认为true), 如果没有异常,我们将始终收到"O…...

JavaWeb后端基础(3)

原打算把Mysql操作数据库的一些知识写进去,但是感觉没必要,要是现在会的都是简单的增删改查,所以,这一篇,我直接从java操作数据库开始写,所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件…...

Oracle数据库基础入门(三): DQL 深入解析与实践

在 Oracle 数据库的知识体系中,数据查询语言(DQL)无疑是最为常用且关键的部分之一。对于 Java 全栈开发者而言,熟练掌握 DQL 不仅能高效地从数据库中获取所需数据,更是构建强大后端应用的基石。通过 DQL,我…...

P9231 [蓝桥杯 2023 省 A] 平方差

P9231 [蓝桥杯 2023 省 A] 平方差 - 洛谷 题目描述 给定 L,R,问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 xy2−z2。 输入格式 输入一行包含两个整数 L,R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 输…...

贪心算法 求解思路

贪心算法简介 贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时(看起来是)最佳的选择。这种启发式策略并不是总能产生出最优解,但它常常能给出最优解。 在实际设计贪心算法时&#xff0…...

2025/2/25,字节跳动后端开发一面面经

一、双方简单自我介绍 面试官先自我介绍,之后属于面试官看简历过程,基本不听。 二、实习中遇到最难的事情,怎么解决的 主要问的还是实习中做过的项目,项目难点在哪里(自己参与的地方),面对困难是怎么思考,怎么实际操作解决的。 三、项目实现细节 掌握自己项目的实…...

Buildroot 添加自定义模块-内置文件到文件系统

目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统,适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...