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

自动化测试中使用Pytest Fixture?推荐10种常见用法!

Pytest 是一个功能强大的 Python 测试框架,其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据,这些环境和数据可以在多个测试用例中重复使用。通过使用fixture,你可以避免在每个测试函数中编写重复的设置和清理代码,使得测试更加干净、简洁,并提高代码的可维护性。

本文将介绍 Pytest Fixture 的概念、用途以及十种常见的使用方法,并提供相应的示例代码。

1、什么是 Fixture?

Fixture 是 Pytest 中用于提供测试环境的一种机制,它可以在测试函数执行前后进行一些准备工作和清理工作,如初始化数据库连接、创建临时文件等。Fixture 可以被多个测试用例共享使用,从而提高测试代码的复用性和可维护性。

2、Fixture用途

fixture的主要用途包括:

  1. 设置测试环境:例如,配置数据库连接、初始化外部服务等。

  2. 准备测试数据:提供测试所需的数据,如用户信息、产品列表等。

  3. 模拟外部依赖:当测试难以直接访问外部系统时,可以使用fixture来模拟这些系统的行为。

  4. 执行特定操作:在测试前后执行某些特定操作,如临时修改配置、记录日志等。

  5. 共享资源:在不同的测试用例之间共享资源,减少资源的创建和销毁开销。

3、10种常见用法及示例

1. 基础使用

import pytest@pytest.fixturedef sample_data():return [1, 2, 3]def test_example(sample_data):assert sum(sample_data) == 6
2. 带参数的fixture

import pytest@pytest.fixture(params=[1, 2, 3])def number(request):return request.paramdef test_number(number):assert number in [1, 2, 3]
3. 使用范围(scope)

在pytest中,fixture的作用域决定了测试夹具的生命周期以及它们能被哪些测试用例或测试类访问。以下是pytest中fixture的几种作用域及其用途:

  1. function:这是fixture的默认作用域。当不指定scope参数时,fixture会在每个测试函数执行前被调用,并在测试函数结束后清理。它适用于需要为每个测试准备和清理资源的场合。例如,打开和关闭数据库连接、初始化和释放内存空间等。

  2. class:当设置scope='class'时,fixture会在一个测试类开始前被调用一次,然后在整个类的所有测试方法运行完毕后被清理。这适用于整个测试类共享的准备工作,如创建共享的测试环境或对象。

  3. module:如果设置scope='module',则fixture会在整个模块的第一个测试开始前被调用,并在模块中的所有测试完成后被清理。这通常用于模块级别的资源管理,比如建立和断开与外部服务的连接。

  4. package/package.module:当设置为scope='package'scope='package.module'时,fixture将在整个包或指定的包的模块中运行一次。这适用于跨模块或跨包共享的测试资源,例如配置全局服务或执行一次性的环境设置。

  5. session:通过scope='session'设置,fixture将在整个测试会话中只运行一次。这适用于开销较大,且所有测试用例都可以共享的准备步骤,如复杂的系统级设置或一次性的资源分配。

  6. instance:如果设置了scope='instance',则可以为每个测试实例创建一个fixture实例。这允许在不同的测试用例之间共享状态,而不需要在每个测试用例中重新准备。

  7. classinstance:通过scope='classinstance',可以为每个测试类创建一个fixture实例。与instance类似,但适用于在类的不同方法间共享状态。

  8. once:使用scope='once'时,fixture只会被调用一次,无论被多少个测试用例或测试类引用。这对于单例资源管理或确保某些操作只执行一次非常有用。

例如:


import pytest@pytest.fixture(scope="class")def class_fixture():print("setup")yield "data"print("teardown")def test_use_fixture(class_fixture):assert class_fixture == "data"

通过合理选择不同的fixture作用域,可以有效地组织和管理测试代码,提高测试的效率和可维护性。

4. fixture的依赖

可以指定一个fixture依赖于其他fixture。


import pytest@pytest.fixturedef db():return "sqlite:///:memory:"@pytest.fixturedef session(db):return create_session(db)def test_database(session):assert isinstance(session, Session)

示例2:


import pytest@pytest.fixturedef login():user = User()user.login()yield useruser.logout()@pytest.fixturedef profile(login):return login.get_profile()
5. 使用autouse自动应用

通过设置autouse=True,无需手动将fixture作为参数传递到测试用例中。


import pytest@pytest.fixture(autouse=True)def print_hello():print("Hello, World!")def test_example():pass
6. 使用request对象访问fixture

request对象可以用来访问调用的fixture及其参数。


import pytest@pytest.fixture(params=[1, 2, 3])def numbers(request):return request.param * 2def test_numbers(numbers):assert numbers % 2 == 0
7. 异常处理

可以对fixture中的异常进行处理。


import pytest@pytest.fixture(autouse=True)def exception_handler():try:yield "some setup code"except Exception as e:print(f"Handled exception: {e}")raise edef test_example():raise ValueError("test error")
8. 使用indirect间接引用

indirect 参数是 Pytest 中 Fixture 的一个高级用法,在pytest中,indirect参数用于间接引用fixture。

indirect=True 是 @pytest.mark.parametrize 装饰器的一个可选参数。当设置为 True 时,它告诉 pytest,对应的参数值不是一个直接的输入值,而是一个用于请求 fixture 的名称。这意味着,pytest 会查找一个与参数值同名的 fixture,并使用该 fixture 的返回值作为测试用例的参数。

当使用indirect时,它允许你通过一个fixture的名称来引用另一个fixture,而不是直接使用它的返回值。这在某些情况下非常有用,比如当你需要将一个fixture的返回值作为另一个fixture的输入。

使用方法

  • 在测试函数的参数列表中指定需要间接引用的 Fixture 名称。

  • 在 @pytest.mark.parametrize 装饰器中使用 indirect=True 参数来启用间接引用。

示例1:


import pytest  @pytest.fixture  def test_data(request):  # 这里只是一个简单的示例,你可以根据需要生成更复杂的测试数据  data = request.param  return data * 2

然后,我们编写一个测试用例,并使用 @pytest.mark.parametrize 装饰器来参数化它。注意,我们在 indirect=True 时传递 fixture 名称 test_data,而不是直接的测试数据值:


def test_example(test_data):  assert test_data > 0

最后,我们使用 @pytest.mark.parametrize 来指定测试数据的范围,并将 indirect 设置为 True:


@pytest.mark.parametrize("test_data", [1, 2, 3], indirect=True)  def test_example(test_data):  assert test_data > 0

在这个例子中,pytest 会为每一组测试数据(1, 2, 3)调用 test_data fixture,并将 fixture 的返回值(即数据的两倍)作为 test_example 测试用例的参数。因此,test_example 测试用例实际上会运行三次,每次使用不同的参数值(2, 4, 6)。

通过这种方式,你可以使用 fixtures 来生成复杂的测试数据,并通过 @pytest.mark.parametrize 和 indirect=True 来参数化你的测试用例。

示例2:indirect间接引用fixture另外一种用法:

 

import pytest# 定义一个fixture,返回一个字符串@pytest.fixturedef string_fixture():return "Hello, World!"# 定义另一个fixture,接受一个字符串作为参数,并返回其长度@pytest.fixturedef length_fixture(request):string = request.getfixturevalue("string_fixture")return len(string)# 使用indirect间接引用length_fixture,并将结果传递给test_example测试函数def test_example(length_fixture):assert length_fixture == 13

在上面的示例中,我们定义了两个fixture:string_fixturelength_fixturestring_fixture返回一个字符串,而length_fixture接受一个字符串作为参数,并返回其长度。

test_example测试函数中,我们使用indirect间接引用了length_fixture,并将其结果传递给测试函数。这样,pytest会自动解析length_fixture的依赖关系,并获取string_fixture的返回值作为输入。

运行上述代码,将会执行test_example测试函数,并断言字符串的长度是否为13。由于使用了indirect间接引用,我们可以灵活地管理fixture之间的依赖关系,并在测试中使用它们的结果。

9. 使用fixtures获取所有fixtures

可以获取当前测试用例的所有fixtures。


import pytest@pytest.fixture(scope="module")def module_fixture():return "module data"def test_example(module_fixture, request):fixtures = request.getfixturevalue("module_fixture")assert fixtures == "module data"
10. 自定义fixture解析器

可以自定义解析器来控制如何解析fixture的名称。


import pytestfrom pytest_mock import MockerFixture@pytest.fixture(scope="module", autouse=True)def my_custom_parser(request, mocker: MockerFixture):mocker.patch("my_module.some_function", return_value="mocked value")request.addfinalizer(lambda: mocker.stop())

以上是pytest fixture的10种常见用法及示例,它们涵盖了从基本使用到高级技巧的各个方面。掌握这些用法可以帮助你编写更加高效和易于维护的测试代码。

最后感谢每一个认真阅读我文章的人,下方这份完整的软件测试教程已经整理上传完成,需要的朋友们可以文末自行领取:【保证100%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

自动化测试中使用Pytest Fixture?推荐10种常见用法!

Pytest 是一个功能强大的 Python 测试框架,其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据,这些环境和数据可以在多个测试用例中重复使用。通过使用fixture,你可以避免在每个测试函数中编写重复的…...

Spring中的ConversionService,为Spring提供数据转换服务

在Spring中经常需要各种数据类型之间进行转换,比如配置文件中的数据转换为代码所需要的数据类型,在使用SpringMvc的时候,将前台传来的参数自动转换为我们接收参数时定义的类型。 Spring中的ConversionService就是提供这种服务的 1.DefaultC…...

gdb和make工具

gdb工具: GDB的主要功能 断点设置:允许开发者在特定的代码行设置断点,当程序执行到该行时会自动暂停,方便开发者进行调试和分析。 变量查看与修改:在程序运行过程中,可以查看和修改变量的值,以…...

【d66】【Java】【力扣】174.寻找二叉搜索树中的目标节点

思路 反着的中序遍历,并计数 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNo…...

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…...

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解

文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …...

高效管理社团:Spring Boot在校园社团信息管理中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理校园社团信息管理系统的相关信息成为必然。…...

mysql约束和高级sql

约束 MySQL中的约束用于定义表中数据的规则&#xff0c;以确保数据的准确性和可靠性。以下是MySQL中常用的一些约束类型及其概述&#xff1a; PRIMARY KEY&#xff08;主键&#xff09;&#xff1a;唯一标识表中每条记录的字段或字段组合&#xff0c; 一个表中只能有一个主键…...

蓝桥杯真题——三角回文数(C语言)

问题描述 对于正整数 n, 如果存在正整数 k 使得 n123⋯kk(k1)2n123⋯kk(k1)/2​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯36366066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数…...

uni-app 封装图表功能

文章目录 需求分析1. 秋云 uchars2. Echarts 需求 在 uni-app 中使用图表功能&#xff0c;两种推荐的图表工具 分析 在 Dcloud市场 搜索Echarts关键词&#xff0c;会出现几款图表工具&#xff0c;通过大家的下载量&#xff0c;可以看到秋云这个库是比较受欢迎的&#xff0c;其…...

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一&#xff0c;什么是pod1.1pod在k8s中使用方法&#xff08;1&#xff09;使用方法一&#xff08;2&#xff09;使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理&#xff08;1&#xff09;pause容器的作用 1.4 Pod分类&#xff1a;&#xff08;1&#xff09;自主式…...

QT创建按钮篇

QT创建按钮篇 1.概述 这篇文章从创建一个按钮对QT开发流程熟悉。 2.代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) { // 第一种创建按钮方式 // QPushButton *btn new QPushButton(); /…...

初级软件测试工程师就别出口喊15K了,连自动化测试都不会,还不如应届生

一. 为什么学软件测试 零基础转行&#xff0c;为什么首选软件测试&#xff1f; 软件测试是软件开发的重要过程之一&#xff0c;是软件质量的保证。国外信息技术领域软件开发人员与测试人员的比例是1:1&#xff0c;而国内目前专业软件测试人员很少&#xff0c;属于紧缺型人才&a…...

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …...

SQL 视图:概念、应用与最佳实践

SQL 视图&#xff1a;概念、应用与最佳实践 SQL&#xff08;Structured Query Language&#xff09;视图是数据库管理中的一个重要概念&#xff0c;它允许用户以虚拟表的形式查看数据。视图在数据库中并不实际存储数据&#xff0c;而是提供了一个查询结果的快照&#xff0c;这…...

ubuntu交叉编译expat库给arm平台使用

1.下载expat库源码: https://github.com/libexpat/libexpat/release?page=2 wget https://github.com/libexpat/libexpat/release/download/R_2_3_0/expat-2.3.0.tar.bz2 下载成功: 2.解压expat库,并进入解压后的目录: tar xjf expat-2.3.0.tar.bz2 cd expat-2.3.0 <…...

成都郝蓉宜恺文化传媒有限公司以诚信经营赢得客户长期信赖

成都郝蓉宜恺文化传媒有限公司秉承深厚的企业文化和价值观&#xff0c;其中“以诚信经营为本”是其核心理念之一。以下是对该公司如何以诚信经营为基础&#xff0c;赢得客户长期信赖的几点客观分析&#xff1a; 1.建立信任基石&#xff1a;在商业领域&#xff0c;信任是客户与企…...

LabVIEW for Linux 介绍

LabVIEW for Linux 介绍 1. 兼容性 LabVIEW for Linux 设计用于多种 Linux 发行版&#xff0c;包括 CentOS、Ubuntu 等。在安装之前&#xff0c;务必检查与您特定发行版版本的兼容性。 2. 程序移植 可移植性&#xff1a;在许多情况下&#xff0c;LabVIEW 程序&#xff08;VI…...

一次32bit有符号数据类型转换为64bit无符号数据类型引发的溢出错误

现象&#xff1a; 在调试一款sensor&#xff0c;通过10帧->8帧->6帧,这样不断的降低帧率调试低照度下的图像效果。ISP配置文件上设置的最大曝光曝光参数为&#xff1a; EXP&#xff1a;15266 Again:15494 Dgain:714 ISPDGain:1360。 当达到最低帧率最低亮度时&#x…...

aosp安卓15新特性dump的wms窗口层级树优化的更加美观

背景&#xff1a; 近来在体验调试aosp15时候&#xff0c;使用了dumpsys activity containers时候&#xff0c;发现wms层级结构树有一个巨大的变化。 很多学员朋友对这个优化改进都给出巨大的点赞&#xff0c;有的学员朋友还想老版本自己实现一下这种树绘制&#xff1a; 对比…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...