自动化测试 pytest 中 scope 限制 fixture使用范围!

导读

fixture 是 pytest 中一个非常重要的模块,可以让代码更加简洁。

fixture 的 autouse 为 True 可以自动化加载 fixture

如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办?可不可以只运行一次初始化方法?

答:可以使用 scope 。

举例

要先创建一个文件:conftest.py, 编写代码:

import pytestdata = {}@pytest.fixture(scope="session")
def add():"""相加"""return 5 + 8@pytest.fixture(scope="session")
def multiply():"""相乘"""return 5 * 8@pytest.fixture(scope="session", autouse=True)
def init_data():"""初始化数据"""print(f"start init_data: {data}")data["a"] = 5data["b"] = 8data["c"] = 13data["d"] = 40data["e"] = 53data["f"] = 520@pytest.fixture(scope="session", autouse=True)
def init_data2(add, multiply):"""初始化数据"""print(f"start init_data2: {data}")data["e"] = add * multiplydata["f"] = add + multiply

这里注意:init_data2 引用了 add 和 multiply 这两个fixture,所以这两个 fixture 都需要加上:

@pytest.fixture(scope="session")

如果不加上,就会报错:ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object

这是因为 init_data2 的作用域是 session,而  add 和 multiply 的作用域是 function。所以要在同级上才能使用。

新建测试文件:test_fixtures_scope.py, 编写测试代码:

from conftest import datadef test_first_fixture():# Actprint(f"a={data['a']}")print(f"b={data['b']}")print(f"a + b={data['c']}")print(f"a * b={data['d']}")# Assertassert data['c'] == data['a'] + data['b']def test_second_fixture():print(f"add * multiply={data['e']}")print(f"add + multiply={data['f']}")# Assertassert data['e'] != data['f']

测试

正确使用:

$ pytest -sv test_fixtures_scope.py
================================== test session starts ===================================
platform darwin -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0 -- /Users/hope/PythonVirtualenv/pytest-sample/bin/python
cachedir: .pytest_cache
rootdir: /Users/hope/PycharmProjects/pytest-sample
collected 2 itemstest_fixtures_scope.py::test_first_fixture start init_data: {}
start init_data2: {'a': 5, 'b': 8, 'c': 13, 'd': 40, 'e': 53, 'f': 520}
a=5
b=8
a + b=13
a * b=40
PASSED
test_fixtures_scope.py::test_second_fixture add * multiply=520
add + multiply=53
PASSED=================================== 2 passed in 0.01s ====================================

可以看到 这行日志只运行了一次:

start init_data: {}
start init_data2: {'a': 5, 'b': 8, 'c': 13, 'd': 40, 'e': 53, 'f': 520}

当两个fixture不在同一作用域:

$ pytest -sv test_fixtures_scope.py
================================== test session starts ===================================
platform darwin -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0 -- /Users/hope/PythonVirtualenv/pytest-sample/bin/python
cachedir: .pytest_cache
rootdir: /Users/hope/PycharmProjects/pytest-sample
collected 2 itemstest_fixtures_scope.py::test_first_fixture ERROR
test_fixtures_scope.py::test_second_fixture ERROR========================================= ERRORS =========================================
__________________________ ERROR at setup of test_first_fixture __________________________
ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object. Requesting fixture stack:
conftest.py:18:  def init_data(add, multiply)
Requested fixture:
conftest.py:6:  def add()
_________________________ ERROR at setup of test_second_fixture __________________________
ScopeMismatch: You tried to access the function scoped fixture add with a session scoped request object. Requesting fixture stack:
conftest.py:18:  def init_data(add, multiply)
Requested fixture:
conftest.py:6:  def add()
================================ short test summary info =================================
ERROR test_fixtures_scope.py::test_first_fixture - Failed: ScopeMismatch: You tried to access the function scoped fixture add with a ses...
ERROR test_fixtures_scope.py::test_second_fixture - Failed: ScopeMismatch: You tried to access the function scoped fixture add with a ses...
=================================== 2 errors in 0.02s ====================================

总结

fixtures 会在测试一开始的时候创建,会在定义的作用域销毁。

  • function: 默认的 scope,在测试用例(以test开头的方法)结束时销毁。

  • class: 在一个class类中最后一个测试用例结束时销毁。

  • module: 在一个模块(也就是一个py文件)中最后一个测试用例结束时销毁。

  • package: 在一个目录的最后一个测试用例结束时销毁。

  • session:所有测试用例都运行结束时销毁。


每日踩一坑,生活更轻松。

本期分享就到这里啦,祝君在测开之路上越走越顺,越走越远。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

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

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

相关文章

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…

【C++深度探索】AVL树与红黑树的原理与特性

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 前言 前…

渣土车与搅拌车安全问题解析及智能监控解决方案

一、背景分析 近年来,渣土车在货物运输中由于超载超速、违规驾驶、车辆盲区过大等问题导致的事故频发,严重影响了人们的生命财产安全。而搅拌车作为一种特殊的运输车辆,在混凝土输送过程中也存在类似的隐患。针对这些问题,对搅拌…

多维矩阵乘积运算和对应的广播机制

神经网络中的多维矩阵乘积运算: 遵循的原则是: 两张量前两维度应该是相同的,如果不同则其中一张量维度为1。 如果有论文中有遇到矩阵乘积的两项维度不一致,那就考虑它计算时是使用了广播机制(如YOLACT)。…

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者,其观点始终认为:工业自动化和智能化水平不断提高,人机界面(Human-Machine Interface,简称HMI&a…

Lombok的认识

Lombok的作用 Lombok是一个Java库,它可以通过简单的注解形式来帮助开发人员简化Java代码的编写,特别是减少模板代码的书写。具体来说,Lombok的主要作用包括: 减少模板代码:Lombok可以通过注解自动生成getter、setter、…

QT opencv常用代码备忘

最近在了解qt opencv的一些用法,把常用的代码记下来方便需要时复制使用 在默认.pro文件加入opencv包含路径和库文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecate…

网络钓鱼抓肉鸡实验

实验背景 网络钓鱼,攻击一台服务器或普通主机时,很可能会将这台服务器或主机变成“傀儡机”,帮助它攻击其它的主机,以达到窃取更多信息、组建僵尸网络、DDOS攻击等目的,危害性极大 其中僵尸网络(Botnet&a…

运维锅总详解NFS

NFS是什么?如何对NFS进行部署及优化?NFS工作流程是什么?NFS的性能及优缺点是什么?NFS发展历史又是怎样的?希望本文能帮您解答这些疑惑! 一、NFS简介 NFS (Network File System) 是由 Sun Microsystems 在…

rem实现屏幕适配(jQuery)

一、rem换算 1.根据视口宽度动态计算字体大小,如果宽度大于750px,则将字体大小设置为100px,否则按比例缩小。 tips:使用时记得引入jQuery.js // 在文档加载完成后执行函数,确保DOM已经准备就绪$(function () {// 定义一个自执行…

二叉树详解-第四篇 二叉树链式结构的实现

目录 1.二叉树的遍历 1.1前序遍历: 1.2 中序遍历: 1.3 后序遍历: 2.二叉树链式结构的实现 2.1 Tree.h 2.2 Tree.cpp 2.2.1 前序遍历 void PreOrder(TNode* Root) 2.2.2 中序遍历 void InOrder(TNode* Root) 2.2.3 后序遍历 void Bac…

【Python实战因果推断】58_因果推理概论8

目录 Identifying the Treatment Effect The Independence Assumption Identification with Randomization Identifying the Treatment Effect 现在你已经理解了问题所在,接下来该看看解决方案(至少是一个解决方案)了。识别(i…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率,并且最近微软官方也是开源了一下graphrag的源码,所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术,也就是我们提出问题的时候&…

网站漏洞扫描软件Burp suite和Xray安装应用及联合使用

目录 1、网站漏洞扫描软件应用-Burp suite 01 burp 扫描工具使用介绍: 02 burp 扫描工具安装过程: 1)获取扫描工具程序包 2)安装部署扫描工具 3)bp安装完毕的基础设置: 3.1)抓取浏览器访…

免费使用正版的Typora教程

1.来到Typora官网下载安装。 Typora官网: https://typoraio.cn/ 2.激活主程序 编辑修改Typora安装目录下文件 下面展示文件目录路径 : D:\SoftWare\Typora1.9.5\resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.js查找:e.hasAc…

huggingface里的模型如何下载呢?

HF-Mirror加速访问Hugging Face的门户。作为一个公益项目,我们致力于提供稳定、快速的镜像服务,帮助国内用户无障碍访问Hugging Face的资源。https://hf-mirror.com/ pip install -U huggingface_hub export HF_ENDPOINT=https://hf-mirror.com huggingface-cli download

别再浪费时间,快速实施项目管理软件的技巧

国内外主流的10款项目进度管理软件对比:PingCode、Worktile、蓝凌OA、用友、泛微OA、飞书、Asana、Trello、Smartsheet、Jira。 在快节奏的商业环境中,有效地管理项目进度常常是团队成功与否的关键。许多团队面临着项目管理过于复杂,难以迅速…

04 卷积神经网络

目录 1. 基本概念 1.1 卷积神经网络 1.2 卷积 1.3 汇聚(池化) 2. CNN网络架构及参数学习 2.1 网络架构 2.2 参数学习 3. 典型的卷积神经网络 3.1 LeNet-5 3.2 AlexNet 3.3 Inception网络 3.4 残差网络 4. 其他卷积方式 1. 基本概念 1.1 …

ElasticSearch搜索

ES搜索 elastic search 一套搜索引擎技术,主要技术栈包括 Elasticsearch:用于数据存储、计算和搜索 Kibana:用于数据可视化 在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同…

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…