Pytest教程:Fixture详解

news/发布时间2024/5/18 14:16:57

什么是 Fixture?

Fixture 是 Pytest 中用于提供测试环境的一种机制。它可以被用来模拟资源,例如数据库连接、临时文件、网络连接等,以及执行一系列的设置和清理操作,从而使测试用例能够在可控的环境下运行。

Fixture 的基本用法

在 Pytest 中,我们可以通过 @pytest.fixture 装饰器定义 fixture。fixture 可以在测试函数中作为参数传递,并在需要时自动执行。以下是一个简单的例子:

import pytest@pytest.fixture
def setup():print("Performing setup")yieldprint("Performing cleanup")def test_example(setup):print("Executing test")assert 1 + 1 == 2

在上面的例子中,setup 函数是一个 fixture。在 test_example 测试用例执行前,setup 函数会被调用。当测试用例执行完成后,setup 函数会执行清理操作。

Fixture 的作用域

Fixture 可以具有不同的作用域,以控制其生命周期和共享程度。Pytest 支持四种作用域:functionclassmodulesession

  • function:默认的作用域,每个测试函数执行前后调用一次 fixture。
  • class:在测试类中所有方法执行前后调用一次 fixture。
  • module:在每个模块(.py 文件)中的所有测试函数执行前后调用一次 fixture。
  • session:在整个测试会话中只调用一次 fixture。
import pytest@pytest.fixture(scope="module")
def setup_module():print("Module setup")yieldprint("Module cleanup")def test_example1(setup_module):print("Executing test 1")assert Truedef test_example2(setup_module):print("Executing test 2")assert False

在上面的例子中,setup_module fixture 的作用域被设置为 module,因此在整个模块中的测试函数执行前后只会调用一次。

参数化 Fixture

有时候,我们希望 fixture 能够根据不同的参数化条件提供不同的行为。Pytest 允许 fixture 接受参数,并在测试函数中使用 pytest.mark.parametrize 进行参数化。

import pytest@pytest.fixture
def setup(request):value = request.paramprint(f"Setup with parameter: {value}")yield value * 2print("Cleanup")@pytest.mark.parametrize("setup", [1, 2], indirect=True)
def test_example(setup):assert setup == 2 or setup == 4

在上面的例子中,setup fixture 被参数化为 1 和 2,并在测试函数中使用间接参数化 (indirect=True) 进行引用。这样,测试函数会分别以 2 和 4 作为 setup 的值运行。

Fixture 的 Fixture

有时候,我们可能需要在 fixture 中使用其他 fixture。Pytest 允许在 fixture 中注入其他 fixture。

import pytest@pytest.fixture
def setup_data():return [1, 2, 3]@pytest.fixture
def setup_complex(setup_data):return {"data": setup_data, "count": len(setup_data)}def test_example(setup_complex):assert setup_complex["count"] == 3

在上面的例子中,setup_complex fixture 依赖于 setup_data fixture。Pytest 会自动解析依赖关系,确保在调用 setup_complex 之前,setup_data 先被调用。

Fixture 的延迟加载

有时候,我们可能需要在测试函数中动态地请求 fixture。Pytest 允许在测试函数参数中使用字符串来引用 fixture,从而实现延迟加载。

import pytest@pytest.fixture
def setup():print("Setup")yield 42print("Cleanup")def test_example(setup):assert setup == 42def test_example_with_fixture_string(setup):assert setup == 42

在上面的例子中,test_example_with_fixture_string 测试函数直接使用了 setup 字符串来引用 setup fixture。Pytest 会自动解析这种引用并加载相应的 fixture。

Fixture 的 Fixture Finalizer

有时候,我们可能需要在 fixture 的生命周期结束时执行一些额外的清理操作。Pytest 允许使用 request.addfinalizer() 来注册这样的清理函数。

import pytest@pytest.fixture
def setup(request):print("Setup")def teardown():print("Teardown")request.addfinalizer(teardown)yield 42def test_example(setup):assert setup == 42

Fixture实战

# content of conftest.pyimport pytest
from myapp import MyApp  # 假设有一个名为 myapp 的应用,需要进行测试@pytest.fixture
def app():# 在这里创建并返回应用的实例return MyApp()@pytest.fixture
def logged_in_user(app):# 模拟已登录的用户,并返回用户对象user = app.login("testuser", "password")return user

上述示例中,我们创建了两个 Fixture:applogged_in_user

  • app Fixture 创建了一个 MyApp 的实例,它代表我们的应用。在测试中,可以通过传递 app 参数来获取应用实例,以便进行测试。

  • logged_in_user Fixture 则利用了 app Fixture,模拟了一个已登录的用户,并返回用户对象。这个 Fixture 可以在需要已登录用户的测试中使用。

接下来,我们可以编写测试来使用这些 Fixture:

# content of test_myapp.pydef test_app_creation(app):assert app is not Noneassert app.is_running()  # 假设 MyApp 类有一个检查应用是否正在运行的方法def test_user_login(logged_in_user):assert logged_in_user is not Noneassert logged_in_user.is_logged_in()  # 假设用户对象有一个检查是否已登录的方法

在这个示例中,我们编写了两个测试函数,它们使用了上面定义的 Fixture。通过传递 applogged_in_user 参数,测试函数可以访问预先设置好的资源,使得测试更加简洁和可维护。

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

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

相关文章

【深度学习笔记】3_4 逻辑回归之softmax-regression

3.4 softmax回归 Softmax回归(Softmax Regression),也称为多类逻辑回归(Multinomial Logistic Regression),是一种用于多分类问题的分类算法。虽然名字里面带回归,实际上是分类。 前几节介绍的…

Unity中URP实现水体效果(泡沫)

文章目录 前言一、给水上色1、我们在属性面板定义两个颜色2、在常量缓冲区申明这两个颜色3、在片元着色器中,使用深度图对这两个颜色进行线性插值,实现渐变的效果 二、实现泡沫效果1、采样 泡沫使用的噪波纹理2、控制噪波效果强弱3、定义_FoamRange来控制…

在 Windows 上使用 VC++ 编译 OpenSSL 源码的步骤

在 Windows 上使用 VC 编译 OpenSSL 源码的步骤如下: 准备工作 安装 Visual Studio 2017 或更高版本。安装 Perl 脚本解释器。安装 NASM 汇编器。 编译步骤 下载 OpenSSL 源码。解压 OpenSSL 源码。打开命令行工具,并进入 OpenSSL 源码目录。运行以下…

消息中间件之RocketMQ源码分析(十七)

Broker CommitLog索引机制的数据结构 ConsumerQueue消费队列 主要用于消费拉取消息、更新消费位点等所用的索引。源代码参考org.apache.rocketmq.store.ConsumerQueue.该文件内保存了消息的物理位点、消息体大小、消息Tag的Hash值 物理位点:消息在CommitLog中的位点值消息体…

Spring篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、不同版本的 Spring Framework 有哪些主要功能?二、什么是 Spring Framework?三、列举 Spring Framework 的优点。四、Spring Framework 有哪些不同的功能?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

Python和Jupyter简介

在本notebook中,你将: 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性,我们将在之后教程中使用。 这是什么? 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…

HTML+CSS+JS:轮播组件

效果演示 一个具有动画效果的卡片元素和一个注册表单&#xff0c;背景为渐变色&#xff0c;整体布局简洁美观。 Code <div class"card" style"--d:-1;"><div class"content"><div class"img"><img src"./i…

强烈建议!网络安全人员一定要在2024年必考下这几本证书

曾零基础备考2个月拿下CISP证书&#xff0c;年收入增加了不少&#xff0c;作为一个网络安全工程师&#xff0c;我真诚的建议有入行想法朋友们&#xff1a;在2024年把这几类证书选考下来&#xff01; 在网络安全行业含金量最高的当属CISSP——注册信息系统安全专家。但这个认证…

FPGA领域顶级学术会议

FPGA领域顶级学术会议主要有FPGA,FCCM,FPL和FPT。 1 FPGA 会议全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 网站是:https://dl.acm.org/conference/fpga FPGA常年在美国举办,每年2月,偏FPGA基础研究; 该会议的论文免费下载。这个比…

el-table增加/编辑打开el-dialog内嵌套el-form,解决编辑重置表单不成功等问题

需求&#xff1a;在做表格的增删改查&#xff0c;其中新增和编辑弹窗都是同一个弹窗&#xff0c;之后有个重置按钮&#xff0c;需要用户输入的时候可以重置清空等。本文章解决如下问题 1.就是在编辑数据回填后点击重置表单没有清空也没有报错 2.解决清空表单和表格数据相互影响…

数据库增删改查

DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库用户、控制数…

YOLOv5 + Flask + Vue实现基于深度学习算法的垃圾检测系统源码+数据库

✨界面展示 登录 注册 垃圾检测 用户管理 404 Not Found页面 403 拒绝访问页面 黑暗模式 深蓝模式 灰色模式 色弱模式 ✨技术特性 深度学习 YOLOv5&#x1f680;&#xff1a;高效、准确的目标检测算法&#xff0c;实时识别检测图像和视频中的各种对象PyTorch&#xff1a;机器…

多模态表征—CLIP及中文版Chinese-CLIP:理论讲解、代码微调与论文阅读

我之前一直在使用CLIP/Chinese-CLIP&#xff0c;但并未进行过系统的疏导。这次正好可以详细解释一下。相比于CLIP模型&#xff0c;Chinese-CLIP更适合我们的应用和微调&#xff0c;因为原始的CLIP模型只支持英文&#xff0c;对于我们的中文应用来说不够友好。Chinese-CLIP很好地…

C 嵌入式系统设计模式 08:硬件代理模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之一&…

Redis在java中的使用

Spring Data Redis中提供了一个高度封装的类&#xff1a;RedisTemplate&#xff0c;对相关api进行了归类封装,将同一类型操作封装为operation接口&#xff0c;具体分类如下&#xff1a; ValueOperations&#xff1a;string数据操作SetOperations&#xff1a;set类型数据操作ZS…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

使用HiveMQ实现Android MQTT

MQTT官网&#xff1a;https://mqtt.org/ 百度Android MQTT&#xff0c;或者B站上搜索&#xff0c;发现大多使用https://github.com/eclipse/paho.mqtt.android&#xff0c;这是Eclipse的一个Android MQTT客户端实现库&#xff0c;但是我发现这个库在运行到高版本的手机上时报错…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作&#xff1a; 选中虚拟机&#xff0c;打开设置&#xff0c;点击CD/DVD。在连接处选择使用ISO镜像文件

Linux之部署前后端分离项目

Nginx配置安装 1.安装依赖 我们这里安装的依赖是有4个的 [rootlocalhost opt]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.上传解压安装包 [rootlocalhost opt]# tar -xvf nginx-1.13.7.tar.gz -C /usr/local/java/3.安装Nginx &#xff0…

Cloudera虚拟机配置(虚拟机环境自带Hadoop、Impala等大数据处理应用)

上学期的大数据处理课程&#xff0c;笔者被分配到Impala的汇报主题。然而汇报内容如果单纯只介绍Impala的理论知识&#xff0c;实在是有些太过肤浅&#xff0c;最起码得有一些实际操作来展示一下Impala的功能。但是Impala的配置实在是有些困难与繁琐&#xff0c;于是笔者通过各…
推荐文章