Pytest精通指南(07)跨模块共享fixture(conftest.py)


文章目录

      • conftest.py 简介
      • conftest.py 用途和含义
      • conftest.py 注意事项
      • 跨模块共享 Fixture
      • 局部共享
        • conftest.py文件代码
        • test_case_01.py文件代码
        • test_case_02.py文件代码
        • 执行效果
      • 全局共享
        • 根目录中的conftest.py文件代码
        • 子目录中的conftest.py文件代码
        • test_case_01.py文件代码
        • test_case_02.py文件代码
        • 执行效果
      • 全局和局部中存在同名fixture
      • 指定引用全局fixture


请添加图片描述

conftest.py 简介

conftest.py 文件在 pytest 测试框架中是一个特殊的文件,用于存放 fixture 定义、插件注册以及测试配置等。

pytest 发现一个目录中包含 conftest.py 文件时,它会自动加载该文件,并应用其中的配置和 fixture。

这使得 conftest.py 文件成为了一个中心化的地方,用于管理和配置测试相关的各种设置。

conftest.py 用途和含义

Fixture 定义

  • conftest.py 文件主要用于定义fixture
  • Fixture 是 pytest 中用于设置和清理测试环境的特殊函数,它们可以在多个测试函数和类之间共享,并且可以跨文件使用。
  • 通过在 conftest.py 文件中定义fixture,可以确保这些fixture在整个测试会话中都可以被访问。

插件注册

  • conftest.py 还可以用于注册自定义的 pytest 插件。
  • 插件可以用于扩展 pytest 的功能,比如添加新的命令行选项、修改测试报告的格式等。

测试配置

  • conftest.py 文件可以包含测试配置相关的代码,比如设置测试数据的路径、配置日志等。

钩子函数(Hook Functions)

  • conftest.py 允许你定义 pytest 的钩子函数,这些函数会在测试的不同阶段被调用,比如测试开始前、测试结束后等。
  • 通过定义钩子函数,可以控制测试的执行流程,或者添加自定义的行为。

conftest.py 注意事项

文件命名

  • conftest.py 的名称是固定的,不能更改。
  • pytest 只会加载名为 conftest.py 的文件。

作用域

  • conftest.py 中定义的fixture具有全局作用域,可以在同一目录下的所有测试文件中使用。
  • 如果需要在多个包或目录下共享fixture,可以在每个包的根目录下都放置一个 conftest.py文件,并在其中定义相应的fixture

命名冲突

  • 如果多个 conftest.py 文件定义了同名的fixturepytest 会按照特定的优先级规则来选择使用哪个fixture
  • 通常情况下,离测试文件更近的 conftest.py 文件中的fixture会被优先选择。

导入和依赖

  • conftest.py 文件中定义的fixture和其他函数可以被测试文件直接导入和使用,但是需要注意避免循环依赖的问题。

性能考虑

  • 由于 conftest.py 中的fixture可能会在整个测试会话中被多次调用,因此需要注意 fixture 的性能和效率。
  • 尽量避免在 fixture 中执行耗时的操作,或者考虑使用缓存机制来减少重复的计算。

版本兼容性

  • 不同的 pytest 版本可能会有不同的行为或特性,因此在编写 conftest.py 文件时需要注意与当前使用的 pytest 版本的兼容性。

跨模块共享 Fixture

  • pytest 中,当多个模块或文件需要共享相同的 fixture 时,可以将这些 fixture 定义在 conftest.py 文件中。
  • conftest.py 文件允许跨多个模块和文件共享 fixture,这样可以避免在每个测试模块中重复定义相同的 fixture
  • conftest.py 文件可以位于项目的根目录,也可以位于子目录中,只要 pytest 能够发现它。
  • pytest 运行测试时,它会递归地搜索当前目录及其子目录中的 conftest.py 文件,并加载它们。

conftest.py 文件中定义跨模块的 fixture步骤如下:

  1. 在项目的根目录或适当的子目录中创建 conftest.py 文件。
  2. conftest.py 文件中定义 fixture
  3. 在其他测试模块中,通过直接引用或使用 @pytest.mark.usefixtures 装饰器来使用这个 fixture

局部共享

conftest.py文件创建在需要共享的子目录中

conftest.py文件代码
import pytest


@pytest.fixture(scope="session")
def shared_data():
    # 假设这是一些需要跨模块共享的数据
    data = {
        "key1": "value1",
        "key2": "value2"
    }
    yield data
    # 这里可以执行一些清理工作
    # ...

test_case_01.py文件代码
def test_function1(shared_data):
    # 在这里可以使用 shared_data fixture
    assert "value1" == shared_data["key1"]
test_case_02.py文件代码
def test_function2(shared_data):
    # 在这里也可以使用 shared_data fixture
    assert "value2" == shared_data["key2"]
执行效果

请添加图片描述

全局共享

conftest.py文件创建在项目的根目录中

根目录中的conftest.py文件代码
import pytest


@pytest.fixture(scope="session")
def global_session_data():
    """全局共享的 session 级别 fixture"""
    print("\n前置:给测试函数设置一个session")
    data = {"session": "10086"}
    yield data
    print("\n后置:清理环境、删除session")
    # 清理代码可以在这里添加

# 其他的全局 fixture 可以继续添加

子目录中的conftest.py文件代码
import pytest


@pytest.fixture(scope="session")
def shared_data():
    # 假设这是一些需要跨模块共享的数据
    data = {
        "key1": "value1",
        "key2": "value2"
    }
    yield data
    # 这里可以执行一些清理工作
    # ...

test_case_01.py文件代码
def test_function1(shared_data, global_session_data):
    # 在这里可以使用 shared_data fixture
    assert "value1" == shared_data["key1"]
    assert "10086" == global_session_data["session"]
test_case_02.py文件代码
def test_function2(shared_data, global_session_data):
    # 在这里也可以使用 shared_data fixture
    assert "value2" == shared_data["key2"]
    assert "10086" == global_session_data["session"]
执行效果

请添加图片描述

全局和局部中存在同名fixture

在根目录中的conftest.py文件中添加

@pytest.fixture(scope="session")
def shared_data():
    # 假设这是一些需要跨模块共享的数据
    data = {
        "key1": "value1",
        "key2": "value2"
    }
    print("子目录中的fixture被调用")
    yield data
    # 这里可以执行一些清理工作
    # ...

执行效果(查找fixture的顺序为就近原则)

请添加图片描述

指定引用全局fixture

首先,应该避免同名fixture,因为当定义多个同名fixtrue会显得混乱和难以维护;

其次,我们可以通过@pytest.mark.usefixture(NAME)来指定当前测试函数需要引用的fixture

前提,这个被引用的fixtureuseauto参数不为True,因为如果为True,对于能看到该夹具的所有测试,夹具将自动使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树(完全二叉树、满二叉树)

树的概念及结构 树的概念 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 树的特点 有一个 …

Linux 秋招必知必会(四、信号、高级 I/O)

八、信号 57. 信号的基本特征 定义:信号是事件发生时对进程的通知机制,也可以把它称为软件中断信号处理方式 忽略信号 大多数信号都可以使用这种方式进行处理,但 SIGKILL 和 SIGSTOP 绝对不能被忽略如果忽略某些由硬件异常产生的信号&#…

lv_micropython to download and building

想要在ESP32-C3使用Micropython开发GUI,所以需要编译lv_micropython,当前github上的版本是9.1.0。 一、开发环境 因为编译lv_micropython需要在linux系统下,但是我的电脑是windows系统,所以我在windows系统上安装了VMware虚拟机&…

【matlab非线性规划工具箱安装1 SeDuMi 1.3工具箱】

【matlab非线性规划工具箱安装1 SeDuMi 1.3工具箱】 该博客是非线性手眼标定代码中所依赖的matlab工具箱的安装内容,除了进行手眼标定以外,该工具箱还可以用于其他的非线性规划问题 手眼标定传送门: 【从零开始进行高精度手眼标定 eye in …

Steam平台游戏发行流程

Steam平台游戏发行流程 大家好我是艾西,一个做服务器租用的网络架构师也是游戏热爱者,经常在steam平台玩各种游戏享受快乐生活。去年幻兽帕鲁以及雾锁王国在年底横空出世,幻兽帕鲁更是在短短一星期取得了非常好的成绩,那么作为游戏…

计算机网络——CSMA/CD协议以及相关习题

目录 前言 引言 CSMA/CD协议 CSMA与CSMA/CD的区别 CSMA/CD流程 前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 引言 最早的以太网,许多计算机都连接在一根总线上工作——广播通信方式。 总线的特点想…

JavaScript教程(十二)--- 使用‘类’

使用类 JavaScript 是一个基于原型的语言——一个对象的行为取决于它自身的属性及其原型的属性。对类来说,相较于与其他面向对象的语言,譬如 Java,创建对象的多层级结构及其属性的继承关系需要更多的代码行。本节,我们将展示如何…

windows搭建ftp服务器

安装iis 点击安装即可,搜索iis打开 创建ftp服务器 身份验证:只勾选匿名,不勾选基本,网上的很多教程会添加基本,导致的问题会出现浏览提需要输入账号密码的情况,这里为了方便大家更直观的感受FTP建立的过程&#xff0…

新手做抖店这个操作赶快停止!不听“废店”只是早晚的事!

哈喽~我是电商月月 互联网的发展,做什么事情都是公开透明的,做抖音小店也是 大家都会在网上搜索教程,技巧,但最终还是有好多人都失败了 那是因为这些流程技巧不正确吗?其实并不是,很多小技巧都是有用的&…

CTF-遗留的压缩包

题目描述:小蓝同学给你发来了他自己开发的网站链接,他说他故意留下了一个压缩包文件,里面有网站的源代码,他想考验一下你的网络安全技能。 下发容器,访问链接,发现都是无关内容 联想到标题说有遗留的压缩…

数模 线性规划模型理论与实践

线性规划模型理论与实践 1.1 线性规划问题 在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支一数学规划,而线性规划(Linear Programming 简记LP)则是数学规划的一个…

openjudge_2.5基本算法之搜索_166:The Castle

题目 166:The Castle 总时间限制: 1000ms 内存限制: 65536kB 描述 Figure 1 shows the map of a castle.Write a program that calculates how many rooms the castle hashow big the largest room is The castle is divided into m * n (m<50, n<50) square modules.…

Linux 内核学习(1) --- 时钟子系统

标题 时钟系统说明时钟树Clock Provider时钟通用数据结构clock_device 的注册clock_provider DTS配置和注册clock consumer时钟系统总结 时钟系统说明 时钟就是 SoC 中的脉搏&#xff0c;由它来控制各个部件按各自的节奏跳动。比如&#xff0c;CPU主频设置&#xff0c;串口的波…

切面条(蓝桥杯)

目录 题目 分析 代码实现 题目 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xff0c;连续对折1…

【报名指南】2023-2024学年AILD劳动技能大赛初赛报名流程

温馨提示&#xff1a; 1.AILD劳动技能大赛免费报名参赛。报名网址&#xff1a;aild.org.cn 2.报名时间即日起至5月31日。&#xff08;上海赛区线下挑战项目4月25日报名截止&#xff0c;线上挑战项目5月31日报名截止&#xff09;。 3.指导教师只能为行政备案学校的在职教师。…

C语言 数据输入输出

本文 我们来说 数据的输入与输出 及数据的运算 在程序的运算工程中 往往需要输入一些数据 而程序的运算 所得到的运算结果又需要输出给用户 因此 数据的输入与输出 就显得非常重要 在C语言中 不提供专门的输入输出语句 所有的输入输出 都是通过对标准库的调用 来实现的 一般 …

itop4412内核编译_编译自定义函数到内核

我的itop4412开发板是半路捡的&#xff0c;所以没办法加他们的售后群&#xff0c;遇到的问题只好一点点记录吧 内核驱动编译 在日常工作过程中&#xff0c;编写内核程序可能机会不多&#xff0c;但是将厂商提供的内核源码编译到固件中&#xff0c;这个技能还是必须掌握的。 i…

认识异常(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

系统架构最佳实践 -- 一般优惠券平台系统架构设计

优惠券是商城的一种基础的营销工具&#xff0c;在目前c端用户对于电子优惠券已经非常熟悉的情况下&#xff0c;一般自营商城的营销活动系统&#xff0c;都是从优惠券开始搭建。 一、名词定义 基于个人理解&#xff0c;为方便表述&#xff0c;首先对可能产生歧义的名词进行如下…

十九.案例演示---天猫订单分析

目录 1.数据预处理 2.对订单状况进行分析 3.不同省份订单数详情 4.省份地图绘制 5.不同星期&#xff0c;订单分布 6.订单金额与订单数量 本次案例演示数据条数为:28010 import pandas as pd from pyecharts import options as optsdf_data pd.read_excel(../data/天猫订单…