pytest教程-36-钩子函数-pytest_collection_start

领取资料,咨询答疑,请➕wei:  June__Go

上一小节我们学习了pytest_unconfigure钩子函数的使用方法,本小节我们讲解一下pytest_collection_start钩子函数的使用方法。

pytest_collection_start(session) 是一个 pytest 钩子函数,它在开始收集测试用例之前被调用。这个钩子可以用来执行一些测试前的准备工作,比如设置测试环境、初始化数据库连接等。以下是如何使用这个钩子函数的具体方法和代码示例:

首先,你需要在你的项目中创建或编辑 conftest.py 文件。这个文件位于你的测试目录下,pytest 会自动加载这个文件中的钩子函数。

然后,在 conftest.py 文件中定义 pytest_collection_start 钩子函数:

# conftest.py

def pytest_collection_start(session):
    # 在这里执行你的测试前准备工作
    print("Collection is starting...")

    # 例如,初始化数据库连接
    # 这里只是一个示例,你需要根据实际情况来编写代码
    import some_database_module
    session.db_connection = some_database_module.connect_to_database()

    # 或者设置一些全局变量
    session.global_variable = "This is a global variable set during collection"

在这个例子中,我们在钩子函数中打印了一条消息,表示测试用例的收集即将开始。然后,我们模拟了一个数据库连接的初始化过程,并将连接对象存储在 session 对象中。这样,在后续的测试中,我们可以通过 session.db_connection 来访问数据库连接。同时,我们还设置了一个全局变量 global_variable

请注意,session 对象是一个 pytest 会话对象,它包含了当前测试会话的信息。你可以在这个对象上设置属性,以便在测试过程中的其他钩子函数或测试用例中访问。

最后,运行你的测试,pytest 会自动调用 pytest_collection_start 钩子函数,并执行你定义的代码。例如:

pytest

这样,每当 pytest 开始收集测试用例时,都会执行你在 pytest_collection_start 钩子中定义的代码。这为你提供了一个在测试开始之前执行自定义逻辑的机会。

当然,让我们通过一个更复杂的示例来展示 pytest_collection_start 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在测试开始前加载配置文件、初始化日志系统,并为所有测试用例设置一个共享的测试数据。

首先,确保你的项目中有一个 conftest.py 文件。然后,添加以下代码:

# conftest.py

import os
import json
import logging
from some_config_module import load_config  # 假设这是一个加载配置的模块

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def pytest_collection_start(session):
    # 打印开始收集测试用例的信息
    logging.info("Starting test collection...")

    # 加载配置文件
    config_path = os.path.join(os.path.dirname(__file__), 'config.json')
    if not os.path.exists(config_path):
        logging.error("Configuration file not found at path: %s", config_path)
        session.exitstatus = 1  # 设置退出状态,表示配置文件加载失败
        return

    try:
        with open(config_path, 'r') as config_file:
            config_data = json.load(config_file)
        session.config = config_data  # 将配置数据存储在 session 对象中
    except json.JSONDecodeError as e:
        logging.error("Failed to decode configuration file: %s", e)
        session.exitstatus = 1  # 设置退出状态,表示配置文件解析失败
        return

    # 初始化测试数据
    session.test_data = {
        'user': 'test_user',
        'password': 'test_password'
    }

    # 其他初始化操作...

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,我们尝试加载一个名为 config.json 的配置文件。如果配置文件不存在或无法解析,我们将记录错误信息,并设置 session.exitstatus 为 1,这将导致 pytest 停止执行后续的测试。

如果配置文件加载成功,我们将配置数据存储在 session.config 中,这样在其他钩子函数或测试用例中就可以访问这些配置信息。同时,我们还创建了一个名为 session.test_data 的字典,用于存储所有测试用例共享的测试数据。

请注意,some_config_moduleconfig.json 是假设存在的模块和文件,你需要根据你的项目实际情况来替换它们。此外,session.exitstatus 是一个 pytest 提供的属性,用于设置测试会话的退出状态。如果设置为非零值,pytest 会提前终止测试执行。

现在,当你运行测试时,pytest_collection_start 钩子函数会被调用,执行上述的初始化操作。这为所有测试用例提供了一个准备就绪的环境。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!领取资料,咨询答疑,请➕wei:  June__Go

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

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

相关文章

YOLO-World环境搭建推理测试

一、引子 CV做了这么多年,大多是在固定的数据集上训练,微调,测试。突然想起来一句话,I have a dream!就是能不能不用再固定训练集上捣腾,也就是所谓的开放词汇目标检测(OVD)。偶尔翻…

new mars3d.control.MapSplit({实现点击卷帘两侧添加不同图层弹出不同的popup

new mars3d.control.MapSplit({实现点击卷帘两侧添加不同图层弹出不同的popup效果: 左侧: 右侧: 说明:mars3d的3.7.12以上版本才支持该效果。 示例链接: 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 相关代…

C++进阶:AVL树

AVL树的概念 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下 。因此,两位俄罗斯的数学家 G.M. A delson- V elskii 和 E.M. L andis 在 1962 …

如何确定Unity/VNXe存储的主控制器(Primary SP)

DELL EMC的Unity或者VNXe存储都是双控的架构(VNXe 1代设备有部分支持单控配置),有些的CLI检查命令是必须在primary SP,也就是主控制器上执行的,那么问题来了,如何确定两个控制器中那个是主控制器呢&#xf…

FreeRTOS资源管理

1.以前临界资源的保护方式 有使用过静态局部变量来保护临界资源,也有用队列,信号量,互斥量来保护临界资源。这些都是在多个任务会共同使用临界资源的情况下我们的保护方式。 问题提出:如果有个传感器在读取数据时有严格的时序&a…

使用idea编辑器回退git已经push的代码

直接上结果 选择想要回退的那次/多次提交历史, 右击, 选中 revert commit git自动产生一个Revert记录,然后我们会看到git自动将我第三次错误提交代码回退了,这个其实就相当于git帮我们手动回退了代码。 后续,只需要我们将本次改动push到远…

js之DOM 文档对象模型

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),简称 DOM。DOM 模型被结构化为对象树,又称DOM 树。 DOM 实际上是以面向对象方式描述的对象模型,它将文档建模为一个个对象&#xf…

ChatGPT的真实能力如何?七大NLP任务一探究竟!

文章链接:https://arxiv.org/pdf/2405.00704 ChatGPT已经改变了人工智能社区,一个活跃的研究方向是ChatGPT的性能评估。评估的一个关键挑战是ChatGPT仍然是闭源的,传统的基准数据集可能已被ChatGPT用作训练数据。在本文中: 调查了最近的研究…

Linux 内核的操作系统确实需要一直运行

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 但是这并不是调度的基础。每…

【1小时掌握速通深度学习面试6】图神经网络-下

目录 23. GraphSage 24.简述图神经网络的推理机制在其他领域中的应用 与传统NN的区别(GNN优点) 23. GraphSage GraphSage出现之前的图网络方法需要图中所有的顶点在训练embedding的时候都出现,这些的方法本质上是transductive&#xff0c…

字节上岸成功,整理一波测试开发岗的基础知识,含答案

本科非科班,去年秋招找非技术岗工作失败(无法通过群面)。谁又能想到今年春招形势严峻比去年秋招还严峻…. 太难了!!!! 2月末开始投简历,3月份开始面了tplink、字节、美团、广立微电…

自编码器网络

1.自编码器网络 自动编码器是一种无监督的数据维度压缩和数据特征表达方法。 无监督 在海量数据的场景下,使用无监督的学习方法比有监督的学习方法更省力。 维度上的压缩 自编码网络可以根据输入的数据,对其进行表征学习。输入数据转换到隐藏层co…

简单介绍IIC通信协议

文章目录 一,简单介绍二,IIC物理层三,IIC通信时序1.起始位与停止位2.IIC读写地址位信号3.IIC应答信号4.IIC数据位收发信号 四,总线速率五,主机发送数据流程六,主机接收数据流程七,IIC的时钟延展…

ComfyUI 基础教程(十四):ComfyUI中4种实现局部重绘方法

在ComfyUI中有多种方式可以实现局部重绘,简单的方式是使用VAE内补编码器进行局部重绘,也可以用Fooocus inpaint进行局部重绘,还可以用controlNet的inpaint模型进行局部重绘,以及使用Clip seg蒙版插件! 本篇介绍使用VAE內补编码器进行局部重绘的方法。 1、VAE内补编码器 局…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务,可以请求独立的绘制帧率进行内容开发,如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明: 本范例是通过Drawing在Native侧实现图形的绘制,并将其呈现在NativeWindow上 1.定义Ark…

docker的commit命令使用制作镜像

docker run -it ubuntu 最基础的ubuntu启动后安装vim 的命令 apt-get update apt-get -y install vim docker commit -m"my_test_ubuntu" -a"za" 80977284a998 atljw/myubuntu:1.0 将本地镜像推送到阿里云 首先登录阿里云服务-控制台 记得一定要设定设…

免费领取!最新2024中国行政区划数据(Shp)!审图号:GS(2024)0650号

最新2024中国行政区划数据(Shp) 最近,在天地图官网对外公布了带审图号的行政区划矢量,包含省、市、县。官网提供GeoJSON格式下载。 数据介绍 分为省、市、县三级尺度。通过格式转换,形成shape格式的边界线数据和面数…

springboot版本升级,及解决springsecurity漏洞问题

背景: 项目中要解决 Spring Security RegexRequestMatcher 认证绕过漏洞(CVE-2022-22978) 漏洞问题,并且需要将项目的版本整体升级到boot版本2.1.7,升级改造过程非常的痛苦,一方面对整个框架的代码不是很熟…

关于视频号小店,常见问题解答,开店做店各方面详解

大家好,我是电商笨笨熊 视频号小店作为今年风口,一个新推出的项目,凭借着自身流量加用户群体的优势吸引了不少的电商玩家。 但对于很多玩家来说,视频号小店完全是一个新的项目、新的领域,因此也会存在很多的疑问&…

后缀字串排序

直接sort: #include <iostream> #include <cstring> #include <algorithm> #include <vector>using namespace std;int main() {string str;cin >> str;int len str.size();vector<string> strings;for(int i 0; i < len; i){strin…