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

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture

Fixture使用@pytest.fixture装饰,pytest有一些内置的fixture

命令可以查看内置fixture

pytest --fixtures

 

fixture范围

在pytest中,夹具(fixtures)具有不同的作用范围(scope),用于控制夹具在测试中的生命周期和重用性。可以通过使用`@pytest.fixture`装饰器并指定`scope`参数来定义夹具的作用范围。

以下是pytest中常用的夹具作用范围:

1. `function`(默认值):每个测试函数运行一次,即每个测试函数都会重新初始化和清理夹具。

2. `class`:每个测试类内的所有测试函数都共享同一个实例化的夹具。在测试类开始时初始化夹具,在测试类结束时清理夹具。

3. `module`:每个测试模块中所有测试函数都共享同一个实例化的夹具。在测试模块开始时初始化夹具,在测试模块结束时清理夹具。

4. `package`:每个测试包(包含多个模块)中的所有测试函数共享同一个实例化的夹具。在测试包开始时初始化夹具,在测试包结束时清理夹具。

5. `session`:整个测试会话中的所有测试函数共享同一个实例化的夹具。在测试会话开始时初始化夹具,在测试会话结束时清理夹具。

夹具的作用范围决定了夹具在测试过程中的生命周期和重用性。选择合适的作用范围可以提高测试的效率和性能,同时确保夹具在适当的时候进行初始化和清理。

要使用指定作用范围的夹具,请将`scope`参数传递给`@pytest.fixture`装饰器,例如:

```python
import pytest@pytest.fixture(scope="module")
def my_fixture():# 初始化夹具yield# 清理夹具
```

在上面的例子中,`my_fixture`被定义为模块级别的夹具,它将在测试模块开始时进行初始化,在测试模块结束时进行清理。

自动使用autouse

`autouse`是pytest夹具(fixture)的一个参数,用于指示夹具是否自动应用于所有测试函数,而无需在测试函数中显式调用夹具。

当你将`autouse=True`传递给夹具装饰器时,夹具将自动在每个测试函数运行前执行,并在测试函数运行后执行清理操作。这使得夹具的使用变得非常方便,无需在每个测试函数中添加装饰器或调用夹具函数。

例如,考虑以下的示例:

```python
import pytest@pytest.fixture(autouse=True)
def setup_and_teardown():# 在每个测试函数之前执行设置操作print("Setup")yield# 在每个测试函数之后执行清理操作print("Teardown")def test_one():print("Test one")def test_two():print("Test two")
```

在上述示例中,`setup_and_teardown`夹具被设置为`autouse=True`,因此它将自动应用于所有的测试函数。每个测试函数在运行之前都会执行`setup_and_teardown`夹具的设置操作,并在测试函数运行后执行清理操作。

运行上述示例的测试会产生以下输出:

```
Setup
Test one
Teardown
Setup
Test two
Teardown
```

注意,使用`autouse`参数应谨慎,确保夹具的设置和清理操作不会对每个测试函数产生意外的副作用,并且在确实需要自动应用于每个测试函数时使用它。否则,推荐在需要使用夹具的测试函数上显式添加夹具装饰器。

fixture可用性

夹具可用性是从测试的角度确定的。仅当测试位于定义了固定装置的范围内时,固定装置才可供测试请求。如果固定装置是在类内部定义的,则只能由该类内部的测试请求。但是,如果在模块的全局范围内定义了固定装置,则该模块中的每个测试(即使它是在类内部定义的)都可以请求它。

同样,如果测试与定义自动使用装置的范围相同,则该测试也只能受自动使用装置影响(请参阅 自动使用装置首先在其范围内执行)。

一个固定装置还可以请求任何其他固定装置,无论它是在哪里定义的,只要请求它们的测试可以看到涉及的所有固定装置。

例如,下面是一个带有固定装置 (outer ) 的测试文件,该夹具调用了一个不在它范围内的inner,但是inner在测试方法可调用的范围内,所以outer也可以调用inner。

import pytest@pytest.fixture
def order():return []@pytest.fixture
def outer(order, inner):order.append("outer")class TestOne:@pytest.fixturedef inner(self, order):order.append("one")def test_order(self, order, outer):assert order == ["one", "outer"]class TestTwo:@pytest.fixturedef inner(self, order):order.append("two")def test_order(self, order, outer):assert order == ["two", "outer"]

conftest.py: 跨多个文件共享固定装置

conftest.py是一个特殊的文件,它可以用于存放pytest的公共夹具(fixtures)和插件配置,以供项目中的多个测试文件共享和重用。

在pytest框架中,`conftest.py`文件需要放置在项目目录或测试目录的根目录下。当运行pytest时,它会自动加载这个文件,并提供其中定义的夹具和配置。

`conftest.py`文件通常包含以下内容:

1. 夹具定义:你可以在`conftest.py`中定义各种夹具,例如用于创建测试数据、配置测试环境或模拟外部依赖的夹具。这些夹具可以在项目中的任何测试文件中使用。

2. 共享夹具:`conftest.py`文件中定义的夹具可以在整个项目中共享和重用。这意味着你可以在多个测试文件中使用相同的夹具,而无需在每个文件中重新定义。

3. 配置选项:你可以在`conftest.py`中配置pytest的选项,例如设置报告的格式、启用特定的插件或定制断言行为。

4. 插件配置:如果你使用了一些pytest插件,你可以在`conftest.py`中配置这些插件的参数和行为。

使用`conftest.py`可以提高测试代码的可维护性和重用性,避免在每个测试文件中重复定义相同的夹具和配置。它使得夹具和配置可以在整个项目中共享,减少了冗余代码并提高了测试的效率。

根目录下的conftest.py可以被项目下的任何测试所使用,pytest会自动发现,不需要手动导入

可以有多个包含测试的嵌套目录/包,每个目录都可以有自己的conftest.py固定装置

夹具实例化顺序

当 pytest 想要执行测试时,一旦它知道将执行哪些装置,它就必须弄清楚它们的执行顺序。为此,它会考虑 3 个因素:

  1. 范围

  2. 依赖关系

  3. 自动使用

范围大的优先执行

import pytest@pytest.fixture(scope="session")
def order():return []@pytest.fixture
def func(order):order.append("function")@pytest.fixture(scope="class")
def cls(order):order.append("class")@pytest.fixture(scope="module")
def mod(order):order.append("module")@pytest.fixture(scope="package")
def pack(order):order.append("package")@pytest.fixture(scope="session")
def sess(order):order.append("session")class TestClass:def test_order(self, func, cls, mod, pack, sess, order):assert order == ["session", "package", "module", "class", "function"]

 

相同顺序的装置根据依赖关系执行

当一个装置请求另一个装置时,首先执行另一个装置。因此,如果fixturea请求fixture b,fixtureb将首先执行,因为a依赖于fixtureb并且没有它就无法运行。即使a 不需要 的结果b,它仍然可以请求b是否需要确保在 之后执行b

import pytest@pytest.fixture
def order():return []@pytest.fixture
def a(order):order.append("a")@pytest.fixture
def b(a, order):order.append("b")

执行顺序为order->a->b

自动使用的夹具调用的夹具也会自动使用

import pytest@pytest.fixture
def order():return []@pytest.fixture
def a(order):order.append("a")@pytest.fixture(autouse=True)
def b(a, order):order.append("b")

 夹具b为自动使用,那么它调用的a和order也会自动使用。

相关文章:

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰,pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中,夹具(fixtures)具有不同的作用范围(scope),用于…...

GNU make系列之介绍Makefile

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件五.在Makefile中使用变量 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译,并且执行相应的命令来…...

Java8新特性之——方法引用

文章目录 一、简介二、举例实例方法引用(实例对象::实例方法名)静态方法引用(类名::静态方法名)类成员方法引用(类名::实例方法名)构造方法引用(类名::new)数组构造方法引用&#xf…...

等保测评--安全区域边界--测评方法

安全子类--边界防护 a) 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信; 一、测评对象 网闸、防火墙、路由器、交换机和无线接入网关设备等提供访问控制功能的设备或相关组件 二、测评实施 1)应核查在网络边界处是否部署访问控制设备&#x…...

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息 文章目录 一、前言二、安装和基本使用三、实际业务中的用法四、完整示例五、总结 一、前言 在这篇博客中,我将为你介绍一个非常实用的 Flutter 插件:device_info_plus。这个插件…...

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构,以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架,它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础,架构原理可以分为以下四个部分:JobManager、TaskM…...

软考高级系统架构设计师系列论文八十三:论软件设计模式的应用

软考高级系统架构设计师系列论文八十三:论软件设计模式的应用 一、软件设计模式相关知识点二、摘要三、正文四、总结一、软件设计模式相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构...

CDH集群离线配置python3环境,并安装pyhive、impyla、pyspark

背景: 项目需要对数仓千万级数据进行分析、算法建模。因数据安全,数据无法大批量导出,需在集群内进行分析建模,但CDH集群未安装python3 环境,需在无网情况下离线配置python3环境及一系列第三方库。 采取策略&#xf…...

python并行操作(基于concurrent.futures.ThreadPoolExecutor)

文章目录 一、明确自身cpu可并行的核数二、根据所有任务计算在各个核上平均跑多少任务三、最后把任务划分在不同的核上跑四、拿来主义 此为利用cpu并行计算的能力,充分利用cpu在循环时并行计算。其实也是受C并行操作的影响,如果需要C版,可以移…...

Leetcode.73矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length, n matrix[0].length;boolean[] row new boolean[m];boolean[] col…...

jdk 04 stream的collect方法

01.收集(collect) collect,收集,可以说是内容最繁多、功能最丰富的部分了。 从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。 collect主要依赖java.util.stream.Collectors类内置的静态方…...

介绍REST API

REST (Representational State Transfer) 是一种基于 web 架构的 API 设计风格, 允许客户端应用程序通过 HTTP 请求与服务器进行交互。RESTful API就是按照REST风格设计的API。 RESTful API 的设计原则包括:使用统一资源标识符 (URI) 标识资源&#xff…...

【leetcode 力扣刷题】反转链表+递归求解

反转链表递归求解 206. 反转链表解法①:取下一个节点在当前头节点前插入解法②:反转每个节点next的指向解法③:递归 92.反转链表Ⅱ反转left到right间节点的next指向 234.回文链表解法①:将链表元素存在数组中,在数组上…...

一文读懂Redis配置,史上真香配置

文章目录 基本配置项AOF持久化配置项RDB持久化配置项淘汰策略配置项主从复制配置项鸣谢 让那些总为redis连接异常的小白指引明灯,少走弯路。为那些不知道如何进行高级配置的大佬整一杯小酒。 基本配置项 bind:用于设置Redis绑定的IP地址。默认情况下&…...

maven打出jar中动态替换占位符

使用场景&#xff1a; maven打出的jar中pom.xml动态替换占位符 有些时候某些公共工具jar包被项目引用后发现公共jar的pom.xml中的version依然还是占位符&#xff0c;例如下面 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…...

【Git游戏】通过游戏重新学习Git

在提交树上移动 HEAD HEAD:一个标志符号&#xff08;通常情况下指向当前分支&#xff0c;间接指向当前最新的提交记录&#xff09; 可以通过git checkout commitID从而指向提交记录 commitID 本身是一串哈希值&#xff08;基于 SHA-1&#xff0c;共 40 位&#xff09; 我们在…...

如何通过以太坊JSON-RPC方式获取ERC-20代币的信息?

目录 一、ERC-20介绍 二、ERC-20代币标准功能 1、可选功能 2、标准功能 三、获取代币信息...

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题&#xff1a;如何求逆矩阵&#xff1f; 1 EXCEL里&#xff0c;直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法&#xff1a;解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算&#xff08;未验证&#xff09; 5 A-1/|A|*A* &…...

【C#学习笔记】匿名函数和lambda表达式

文章目录 匿名函数匿名函数的定义匿名函数作为参数传递匿名函数的缺点 lambda表达式什么是lambda表达式闭包 匿名函数 为什么我们要使用匿名函数&#xff1f;匿名函数存在的意义是为了简化一些函数的定义&#xff0c;特别是那些定义了之后只会被调用一次的函数&#xff0c;与其…...

百度Apollo:引领自动驾驶技术创新的先锋

文章目录 前言一、内容总结 前言 大家好&#xff0c;我是萝卜头不吃萝卜头&#xff0c;今天和大家分享一下我学习百度Apollo自动驾驶的心得。 在七月份的时候&#xff0c;我收到了Apollo开发者社区的邀请&#xff0c;进行学习Apollo自动驾驶汽车的2023星火培训训练&#xff0c…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...