Python的pytest框架(3)--fixtrue固件

fixture是pytest的一项核心特性,它提供了一种组织和管理测试依赖项(如初始化环境、创建资源、清理操作等)的有效机制。下面将对fixture进行深入讲解,包括其基本概念、作用、使用方式、特性以及高级应用:

目录

一、基本概念

二、fixture的定义与使用

三、fixture特性

fixture 生命周期

fixture参数:

scope(作用域)

autouse(是否自动执行)

params(参数化)

ids(参数别名)

name(固件别名)

fixture依赖:

四、conftest.py--集中管理fixture固件

创建conftest.py文件

使用conftest.py中的内容

五、什么情况下使用fixture?


一、基本概念

fixture 是指在执行特定测试之前设置特定环境或状态,以及在测试完成后清理或还原这些状态的一种机制。它可以用来准备任何测试所需的共享资源,如数据库连接、临时文件、网络服务、模拟数据等。fixture的核心价值在于:

  1. 标准化测试环境:确保每次运行测试时,都基于一致的初始条件,提高测试的可重复性和可靠性。
  2. 资源管理:自动处理资源的创建、使用和销毁,避免测试间资源泄漏或污染。
  3. 代码复用:通过模块化的设计,让多个测试能够共享相同的fixture,减少冗余代码。

二、fixture的定义与使用

fixture在pytest中通过装饰器 @pytest.fixture 标记。一个基本的fixture定义如下:

import pytest@pytest.fixture
def example_fixture():# 准备阶段:执行创建或初始化资源的逻辑resource = create_some_resource()yield resource  # 这里yield语句使得测试函数可以在运行时访问到fixture返回的对象# 清理阶段:在测试结束后执行清理逻辑cleanup_resource(resource)

要使用fixture,只需将其作为参数传递给测试函数:

def test_example_usage(example_fixture):# 测试函数在执行时,example_fixture对应的fixture会先被调用,# 然后将返回值传递给测试函数作为参数assert do_something_with(example_fixture) == expected_result

三、fixture特性

fixture 生命周期

fixture 的生命周期主要包括三个阶段:

setup: 当测试函数需要某个 fixture 时,pytest 会先调用对应的 fixture 函数。fixture 函数负责初始化所需资源、创建数据或设置特定环境状态。如果 fixture 依赖其他 fixture,那么这些依赖的 fixture 会按照依赖顺序先被 setup。

use: fixture 函数通过 yield 语句返回的值或对象,会在测试函数执行期间作为参数传入并使用。测试函数可以自由操作这些资源,执行测试逻辑。

teardown: 测试函数执行完毕后,pytest 会继续执行 yield 语句之后的清理代码,这里负责释放资源、删除临时文件、关闭数据库连接、恢复环境状态等操作,确保测试的副作用得到清除。

fixture参数:

@pytest.fixture(scope="作用域",autouse="是否自动执行",params="参数化",ids="参数别

名",name="固件别名")

我们分开来讲述这些参数的具体作用

scope(作用域)

控制fixture的作用域,可选值包括 "function"(默认为function)、"class"、"module"、"package" 或 "session"。作用域决定了fixture的生命周期和复用范围:

function: 每当有测试函数请求此fixture时,pytest会为其创建一个新的fixture实例。这意味着每个测试函数都会得到一个独立的fixture副本。

class: 在类中首个依赖此fixture的测试函数执行前,pytest会创建一个fixture实例。该实例会被类中所有依赖此fixture的测试函数共享。
module: 在模块中首个依赖此fixture的测试函数执行前,pytest会创建一个fixture实例。该实例会被模块内所有依赖此fixture的测试函数共享。
package: 在包中首个依赖此fixture的测试函数执行前,pytest会创建一个fixture实例。该实例会被包内所有依赖此fixture的测试函数共享。
session: 在测试会话开始时,pytest会创建一个fixture实例。该实例会被会话中所有依赖此fixture的测试函数共享。

@pytest.fixture(scope="module")
def module_level_fixture():...#scope='module' 只创建一次,会作用到整个模块

autouse(是否自动执行)

如果设为 True,则无需显式在测试函数签名中指定该fixture,它会自动应用于所有匹配其作用域的测试,默认为False。

@pytest.fixture(autouse=True)
def always_used_fixture():print("测试前准备前置操作")yieldprint("测试完毕释放资源操作")def test_example_usage():# 测试函数在执行时,无需传入always_used_fixture对应的fixture也会被调用,pass@pytest.fixture(autouse=False)
def always_used_fixture():print("测试前准备前置操作")yieldprint("测试完毕释放资源操作")def test_example_usage(always_used_fixture):# 测试函数在执行时,需传入always_used_fixture对应的fixture才被调用,pass

params(参数化)

pytest 支持对 fixture 进行参数化,这意味着一个 fixture 可以根据不同的输入参数产生多种不同的预备状态。参数化 fixture 可以极大地提高测试的覆盖范围和灵活性。要实现参数化 fixture,可以使用 pytest.mark.parametrize 装饰器同时装饰 fixture 函数和依赖它的测试函数,或者直接在 fixture 函数上使用 params 关键字参数。以下是一个参数化 fixture 的示例:

import pytest@pytest.fixture(params=[1, 2, 3])
def input_fixture(request):value = request.paramreturn valuedef test_multiply_by_two(input_fixture):assert input_fixture * 2 == input_fixture + input_fixture

在这个例子中,input_fixture是一个参数化的fixture,其params关键字参数设置为列表[1, 2, 3]。这意味着每次test_multiply_by_two函数运行时,input_fixture将会接收到列表中的一个不同值。因此,test_multiply_by_two函数会被执行三次,分别使用参数值1, 2 和 3。

ids(参数别名)

为参数化fixture的每个实例提供易于识别的标识,便于在测试报告中区分。

@pytest.fixture(params=[1, 2, 3], ids=["one", "two", "three"])
def named_parametrized_fixture(request):value = request.param...

name(固件别名)

自定义fixture的名称,仅在需要覆盖默认生成的fixture名称时使用。

@pytest.fixture(name="custom_name")
def my_fixture():...

fixture依赖:

fixture之间可以相互依赖。一个fixture在其定义中可以通过接受其他fixture作为参数来声明依赖关系。当依赖的fixture被请求时,pytest会确保先执行依赖fixture的setup部分,再执行当前fixture,最后在测试结束时按照相反顺序执行清理操作。

@pytest.fixture
def database_connection():conn = establish_db_conn()yield connclose_db_conn(conn)@pytest.fixture
def initialized_table(database_connection):create_table(database_connection)populate_table(database_connection)yieldtruncate_table(database_connection)def test_query(initialized_table):rows = execute_query(initialized_table)assert len(rows) > 0

在这里,initialized_table fixture依赖于database_connection fixture。当test_query函数请求initialized_table时,pytest会确保先执行database_connection的setup部分(建立数据库连接),然后执行initialized_table的setup(创建表并填充数据)。测试结束后,先清理initialized_table(清空表),再清理database_connection(关闭连接)。

四、conftest.py--集中管理fixture固件

conftest.py 是 pytest 测试框架中一个特殊且非常重要的文件,主要用于存放与测试相关的配置、全局设置以及可复用的fixture(固件)

创建conftest.py文件

在需要使用fixture或进行特定配置的目录下创建名为 conftest.py 的文件。可以创建在项目根目录下(影响整个项目),也可以创建在特定的测试子目录下(仅影响该目录及其子目录)

在conftest.py文件中可以定义fixture固件,也可以通过 pytest.mark 装饰器为所有测试添加标记(markers)

使用conftest.py中的内容

无需在测试代码中显式导入或引用 conftest.py。pytest会自动发现并加载所有有效的 conftest.py 文件根据其位置确定其作用域,并在相应范围内应用其中定义的fixture和配置。

总结而言,conftest.py 文件是pytest框架中用于集中管理测试配置、定义可复用fixture以及定制测试执行流程的关键组件。通过在适当位置创建 conftest.py 并编写相应的代码,可以极大地提升测试代码的组织性、可维护性和执行效率。

五、什么情况下使用fixture?

需要共享资源或数据:当你有一组测试都需要访问同一个数据库、文件、网络连接或其他资源时,用fixture来统一管理和初始化这些资源,确保每个测试获得的是正确且独立的状态。

需要复杂的环境设置:如果你的测试需要复杂的环境配置,如启动服务、设置系统权限、模拟外部接口响应等,使用fixture来封装这些复杂的设置和清理逻辑,使测试代码聚焦于核心测试行为。

需要重复的初始化或清理:如果有多个测试需要进行相似的初始化(如填充固定测试数据)或清理(如删除临时文件、重置系统状态)操作,使用fixture可以避免在每个测试中重复编写这些代码。

需要参数化测试:当你希望一个测试用例针对不同输入参数运行多次时,可以使用参数化的fixture为测试函数提供一组或多组不同的预备环境或数据,从而增加测试覆盖率。

希望以上内容能帮助大家高效理解pytest框架的fixture固件,让fixture帮助测试变得更高效可靠

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

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

相关文章

微信小程序开发

微信小程序隶属于前端,因此我们只需要了解掌握一些基本的功能与业务逻辑即可。 HttpClient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议…

Java初学日记 十三 (GUI)

GUI编程 概述 GUI(Graphical Uers Interface)全称图形用户界面 swing指javax.swing包,该包中包含实现界面的类,这些类都可称为组件 组件可分为两大类: 容器组件 窗口 import javax.swing.*; ​ public class LoginFrame extends JFram…

深入理解与运用Vue 2中的插槽(Slots)

深入理解与运用Vue 2中的插槽(Slots) Vue.js作为一种强大的前端框架,以其组件化、声明式编程理念深受开发者喜爱。其中,Vue 2的插槽(Slots)机制更是极大地提升了组件复用性和灵活性。本文将深入探讨Vue 2中…

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制(LookLook)

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制 0、 界面预览1、本地媒体流获取session本地音频本地视频 2、远端媒体流获取媒体流远端音频远端视频 FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796 0、 界面预览 http…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

WP-AutoPostPro 汉化版: WordPress自动采集发布插件

WP-AutoPostPro 是目前最好用的WordPress自动采集发布插件,最大的特点是可以采集来自于任何网站的内容并自动发布到你的WordPress站点。真正做到可以采集任何网站的内容并自动发布,采集过程完全自动进行无需人工干预,并提供内容过滤、HTML标签…

libssh C++封装(一)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C封装。 libssh下载地址 2 设计 2.1 类图 类型说明: Session SSH连接…

【设计模式】9、facade 外观模式

文章目录 九、外观模式9.1 player9.1.1 player_test.go9.1.2 player.go 9.2 login_register9.2.1 account_test.go9.2.2 account.go 九、外观模式 https://refactoringguru.cn/design-patterns/facade 如果有一个复杂的系统, 内部有很多子系统, 可以用 facade 封装一层, 只暴…

WPF-关于动画Animation(及其常见问题)

目录 一、动画合集 常见动画类型 1、资源里添加动画资源 2、事件触发器里开始一个动画 3、Double型关键帧动画 4、Object型关键帧动画 5、Color型关键帧动画 6、String型关键帧动画 7、Matrix型沿路径动画 二、扩展 Ⅰ 动画常见问题 1、控制动画结束问题 Ⅱ 流动…

Centos7 的 Open Stack T 版搭建流程 --- (三)配置消息队列

配置消息队列 文章目录 配置消息队列(1)安装 RabbitMQ 服务并配置新用户权限controller (2)如何开启图形化(拓展) (1)安装 RabbitMQ 服务并配置新用户权限 controller yum install…

1115: 【C2】【字符串】【入门】最长最短单词

题目描述 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格是单词间的间隔。 试输出第1个最长的单词和第1个最短单词。 输入 一行句子。 输出 两…

天星金融消保课堂开讲,金融健康意识再提升

近年来,随着消费者对投资理财等金融服务需求的日益增长,金融广告成为消费者获取金融信息的重要途径。然而,一些不法分子通过投放非法金融广告,诱导消费者参与非法金融活动,给消费者的权益带来了严重威胁。为此&#xf…

开源AI智能名片源码:虚实融合引领品牌营销新篇章

随着数字时代的飞速发展,品牌营销已经步入了一个全新的纪元。在这个变革的时代,开源AI智能名片源码以其独特的虚实融合功能,正引领着品牌营销走向更加智能化、个性化的道路。 传统的品牌营销往往局限于单向的信息传播,难以与用户产…

成都污水处理站运维厂家服务商

选择污水处理运维服务厂家时,需要考虑以下几个关键的事项来确保您选择了合适的服务提供商: 1. **资质和认证:** 确认厂家是否具备国家或地方政府颁发的相关环保和水处理行业资质、证书,比如ISO认证、水污染治理资质等,…

Nacos服务注册中心的下载与使用

1. Nacos是什么? https://nacos.io/ 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动…

手写一个Spring IOC框架

目录 一,Spring IOC 二,流程图设计 三,设计思路解析 三,开始写代码 1.准备工作: 2.扫描并加载类信息 3.初始化bean 4.测试一下 一,Spring IOC Spring IoC容器是Spring框架的核心,它通过读取配置信息…

Scala 复习笔记

元组: 元素类型一致 存取有序可重复 Seq ​ 无序不可重复 Set ​ 键值对 Map (存储的就是Tuple2 ,对偶元组) 元素类型不一致 Tuple (至多22个元素) 代码: 定义 拆分 函数返回元组类型 遍历…

【每日刷题】Day20

【每日刷题】Day20 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 面试题 17.04. 消失的数字 - 力扣(LeetCode) 2. 189. 轮转数组 - 力扣&#…

随机森林(Random Forests)

通过5个条件判定一件事情是否会发生,5个条件对这件事情是否发生的影响力不同,计算每个条件对这件事情发生的影响力多大,写一个随机森林(Random Forests)模型程序,最后打印5个条件分别的影响力。 ChatGPT 下面是一个使…

后端获取请求体Body,将请求体进行解密放回Request请求,并能通过@RequestBody获取

目前系统发送的post和put请求都是没有加密数据。客户需要将请求体加密。而系统已经基本开发完成,不可能一个一个去修改发送的请求。就需要在发送请求时候在拦截器中将body进行加密。并且在后端进行请求过滤解密,并且能通过RequestBody继续获取对象。 1.…