自动化测试中使用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%免费】

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java 调用淘宝 API 获取商品页面数据示例

在 Java 开发中&#xff0c;我们同样可以调用淘宝 API 来获取商品页面数据。以下是一个用 Java 实现的示例。 一、准备工作 1.引入相关依赖&#xff0c;这里我们使用 Apache HttpClient 来发送 HTTP 请求。可以在项目的 pom.xml 文件中添加以下依赖&#xff1a; <dependenc…

【网络】数据链路层

目录 以太网 以太网的帧格式 MSS 交换机 MTU对UDP的影响 ARP协议 数据链路层是软件层的最底层协议&#xff0c;它的下面就是物理层&#xff0c;那么下面我们就来介绍一下它负责在网络通信中完成什么工作 我们前面说的IP协议是解决如何进行跨网络转发的&#xff0c;也就是…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…

语音识别中的RPM技术:原理、应用与发展趋势

目录 引言1. RPM技术的基本原理2. RPM的应用领域3. RPM技术的挑战与发展趋势4. 总结 引言 在语音识别和音频处理领域&#xff0c;RPM&#xff08;Recurrent Phase Model&#xff0c;递归相位模型&#xff09;技术正逐渐崭露头角。它作为一种创新的信号处理方法&#xff0c;通过…

C语言程序的机器表示(逆向+函数调用栈详解版)

C语言程序的机器表示 1 基本数据类型 在Windows系统中&#xff0c;通常一个字等于两个字节&#xff0c;在32位程序和64位程序&#xff0c;在处理数据时&#xff0c;通常对8&#xff0c;4&#xff0c;2和1字节数据进行处理 x86使用的是浮点寄存器&#xff0c;Intel提供了8个128…

Linux 系统目录结构

1.ls /查看目录 &#xff08;1&#xff09;/bin&#xff1a;bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 &#xff08;2&#xff09;/boot&#xff1a;存放启动 Linux 使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 &#xff0…

基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真。本系统包括PV模块&#xff0c;电池模块&#xff0c;电池控制器模块&#xff0c;MPPT模块&#xff0c;PWM模…

matlab图像处理(1)

注意&#xff1a; 读取图像文件时需若图像不在工程目录文件下&#xff0c;需在代码中表明其其他路径的具体位置及名称

1.3 自然语言处理的应用

自然语言处理&#xff08;NLP&#xff09;在多个领域有广泛应用&#xff0c;如自动文摘、机器翻译、情感分析等。本实战将通过NLTK库&#xff0c;演示文本预处理的关键技术&#xff0c;包括小写转换、去噪、文本规范化、词干提取、词形还原、标记化以及删除停止词。这些技术为构…

更改lvgl图片的分辨率(减少像素)达到减小内存占用的目的

lvgl的内存占比过大&#xff0c;更改图片的分辨率&#xff08;减少像素&#xff09;达到减小内存占用的目的&#xff0c;可以用更多的空间去开发其他的功能 -- 由于lvgl中图片占的内存过大&#xff0c;所以需要更改图片的分辨率&#xff08;降低像素的方式&#xff09; --注意…

斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师)

斗破Qt目录&#xff1a; 斗破Qt编程入门系列之前言&#xff1a;认识Qt&#xff1a;Qt的获取与安装&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之一&#xff1a;认识Qt&#xff1a;初步使用&#xff08;四星斗师&#xff09; 参考书籍 《Qt5.9 C开发指南》 斗破观…

练习LabVIEW第四十二题

学习目标&#xff1a; 使用labview编写一个用户确认界面&#xff1a; 我们在程序中赋予5个人的账号密码&#xff0c;账号使用人名&#xff0c;密码随便&#xff0c;并规定相关权限。访问权限要在前面板显示&#xff0c;并且访问成功与否也要有显示。 开始编写&#xff1a; 前…

mqtt 传递和推送 温湿度计消息 js

mqtt 传递和推送 温湿度计消息 做了一个mqtt的小网站 包括设备管理&#xff0c;订阅管理&#xff0c;连接认证订阅授权 这里我新增了一个设备 订阅组温湿度里面有两个订阅 设备详情授权给设备使用 设备连接 和之前的wifi连接一样 温湿度也和之前的使用一样 require(u…

xinference 使用命令实践记录

1. qwen-chat 模型相关的参数组合&#xff0c;以决定它能够怎样跑在各种推理引擎上 命令 xinference engine -e http://0.0.0.0:9997 --model-name qwen-chat 结果 2. 将 qwen-chat 跑在 VLLM 推理引擎上&#xff0c;但是我不知道什么样的其他参数符合这个要求。 命令: xin…

【代码随想录day22】【C++复健】77. 组合;216.组合总和III; 17.电话号码的字母组合

77. 组合 这题做完之后还是有一种稀里糊涂的感觉。思考了半天什么范围合理&#xff0c;并且怎么设置才能让这个范围合理&#xff0c;然而一看答案&#xff0c;发现答案完全没考虑这些因素&#xff0c;直接暴力全遍历了。只能说确实这样能够放弃思考&#xff0c;比较省心一些.…

选择适合你的报表工具,山海鲸报表与Tableau深度对比

在数据分析和报表制作的领域&#xff0c;企业往往面临着选择合适工具的难题。尤其是当市场上有很多功能强大的工具时&#xff0c;如何从中挑选出最适合自己需求的报表软件成为了一个关键问题。今天&#xff0c;我们将对比两款报表工具——山海鲸报表和Tableau&#xff0c;看看它…

unity优化webgl下的textMeshPro字体大小

成果&#xff1a;优化前2.5M的字体文件优化后只有几百kb不到1m了 背景&#xff1a;unity微信小游戏要求字体文件在3m以内姑且我认为2.5m以内实际可以干到1M以内。微信小游戏要求尽可能的进游戏快&#xff0c;在这个背景下我们需要对字体进行优化&#xff0c;我采用的是3500字的…

Spark的学习-02

Spark Standalone集群的安装 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利用自己…

Vue前端框架

一.Vue概述 *Vue 是一套前端框架&#xff0c;用于免除原生JavaScript中的DOM 操作&#xff0c;简化书写。 *基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双 向绑定&#xff0c;将编程的关注点放在数据上。 *官网&#xff1a; https://cn.vuejs.org/ 二.Vue快速…

软件设计师 7日速成

数据流图和数据字典 数据流图 定义 数据流图是一种图形化的工具&#xff0c;用于描述系统中数据的流动情况。它可以帮助我们可视化数据在系统中的处理过程&#xff0c;包括数据的来源、去向、存储位置以及处理方式。 组成元素 数据流图通常包含以下四个基本元素&#xff1…