pytest教程-39-钩子函数-pytest_runtest_setup

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

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

pytest_runtest_setup 钩子函数在每个测试用例的 setup 阶段被调用。这个钩子可以用来执行测试用例的前置准备,例如创建测试数据、设置测试环境等。以下是如何使用这个钩子函数的具体方法和代码示例:

首先,确保你的项目中有一个 conftest.py 文件。然后,在 conftest.py 文件中定义 pytest_runtest_setup 钩子函数:

# conftest.pyimport pytest
import logging# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 假设我们有一个函数来创建测试数据
def create_test_data():# 这里模拟创建一些测试数据return {"key1": "value1", "key2": "value2"}def pytest_runtest_setup(item):# 在测试用例执行前执行的代码logging.info(f"Setting up for test: {item.name}")# 创建测试数据test_data = create_test_data()# 将测试数据作为属性添加到 item 对象上,以便在测试用例中使用item.test_data = test_data# 执行其他必要的设置操作,例如初始化数据库连接等# ...# 如果设置过程中出现错误,可以使用 pytest.skip 或 pytest.xfail 来处理# ...# 返回值:如果设置为 True,则 pytest 将不会调用其他实现的钩子函数return False

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,我们定义了一个 create_test_data 函数来模拟创建测试数据的过程。

pytest_runtest_setup 钩子函数中,我们在每个测试用例执行前调用 create_test_data 函数,并创建测试数据。然后,我们将这些测试数据作为属性添加到 item 对象上,这样在测试用例中就可以通过 item.test_data 访问这些数据。

请注意,这个示例中的 create_test_data 函数和数据库操作都是假设的,你需要根据你的项目实际情况来实现这些功能。这个示例展示了如何在测试用例执行前执行前置准备,并处理可能出现的异常情况。

让我们通过一个更复杂的示例来展示 pytest_runtest_setup 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在每个测试用例执行前设置一个复杂的测试环境,包括初始化数据库连接、创建测试数据、配置日志记录器等。我们还将处理可能出现的异常,并在测试用例执行失败时记录详细的错误信息。

首先,确保你的项目中有一个 conftest.py 文件。然后,在 conftest.py 文件中定义 pytest_runtest_setup 钩子函数:

# conftest.pyimport pytest
import logging
import os
from some_database_module import DatabaseConnection, execute_query  # 假设这是我们的数据库操作模块
from some_logging_module import configure_logger  # 假设这是我们的日志配置模块# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 假设我们有一个全局数据库连接对象
db_connection = Nonedef pytest_runtest_setup(item):# 在测试用例执行前执行的代码logging.info(f"Setting up for test: {item.name}")# 配置日志记录器configure_logger(item.name)# 初始化数据库连接try:db_connection = DatabaseConnection()execute_query(db_connection, "CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY, value VARCHAR(255))")logging.info("Database connection initialized and test table created.")except Exception as e:logging.error(f"Failed to initialize database connection for test: {item.name} - {e}")# 如果数据库初始化失败,跳过当前测试用例pytest.skip(f"Skipping test {item.name} due to database initialization failure.")return True  # 阻止其他钩子函数执行# 创建测试数据try:test_data = {"key1": "value1","key2": "value2"}item.test_data = test_datalogging.info("Test data created.")except Exception as e:logging.error(f"Failed to create test data for test: {item.name} - {e}")# 如果测试数据创建失败,标记测试用例为预期失败pytest.xfail(f"Test data creation failed for test: {item.name} - {e}")return True  # 阻止其他钩子函数执行# 如果所有设置操作都成功,继续执行测试用例return False  # 允许其他钩子函数执行# 在测试用例执行后执行的代码
def pytest_runtest_teardown(item, nextitem):# 在这里执行测试用例执行后的清理工作if 'test_data' in item:del item.test_data  # 清理测试数据if db_connection:try:execute_query(db_connection, "DROP TABLE test_table")logging.info("Test table dropped.")except Exception as e:logging.error(f"Failed to drop test table - {e}")finally:db_connection.close()  # 关闭数据库连接logging.info("Database connection closed.")

在这个示例中,我们在 pytest_runtest_setup 钩子函数中首先配置了日志记录器,然后尝试初始化数据库连接并创建一个测试表。如果数据库初始化失败,我们使用 pytest.skip 跳过当前测试用例。如果测试数据创建失败,我们使用 pytest.xfail 标记测试用例为预期失败。

我们还定义了一个 pytest_runtest_teardown 钩子函数来执行测试用例执行后的清理工作,包括删除测试表和关闭数据库连接。

请注意,这个示例中的数据库操作和日志配置都是假设的,你需要根据你的项目实际情况来实现这些功能。这个示例展示了如何在测试用例执行前后执行一系列复杂的操作,并处理可能出现的异常情况。

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

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

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

相关文章

代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

文章目录 完全背包理论基础完全背包问题的定义与01背包的核心区别为什么完全背包的循环顺序可以互换?CPP代码 ⭐️518.零钱兑换II思路CPP代码 ⭐️377. 组合总和 Ⅳ思路CPP代码 扩展题 完全背包理论基础 卡码网第52题 文章链接:完全背包理论基础 视频链接…

练习题(2024/5/7)

1验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 …

互联网十万个为什么之什么是云计算

云计算是一种通过互联网提供计算资源和服务的技术。它允许用户随时随地访问和使用云平台上的数据、软件和硬件资源。在数字化时代,互联网已经成为基础设施。云计算使得数据中心能够像一台计算机一样去工作。通过互联网将算力以按需使用、按量付费的形式提供给用户&a…

城市二手房数据分析与房价预测

实现功能 数据分析 二手房价格-时间分析 二手房数量-时间分析 二手房分布-区域分析 二手房户型分析 二手房朝向分析 二手房价格-区域分析 二手房热词词云 房价预测 采用合适的算法模型,对模型进行评估。通过输入影响因素输出预测价格。 采用技术与框架 M…

【MM32F3270 Micropython】pwm输出

文章目录 前言一、PWM脉宽调制技术介绍二、machine.PWM 类2.1 machine.PWM 类的构造对象2.2 PWM 对象初始化2.3 关闭PWM设备2.4 设置pwm的周期2.5 设置占空比 三、pwm示例代码总结 前言 MicroPython是一种精简的Python 3编程语言实现,旨在在微控制器和嵌入式系统上…

从0到1提审苹果商店(appstore)上线一款新APP

本篇主要复盘和介绍一款APP如何从0到1上线到苹果商店,将我自己项目遇到的坑跟大家分享,希望能为同样做开发或者运营的你提供经验,少走弯路。 如果你是24年1月1日之后开始首次提审APP,还需要先将自己的APP在工信部备案,苹果后台增加了工信部备案号的填写,备案方法和经验如…

揭秘 IEEE/ACM Trans/CCF/SCI,谁才是科研界的王者?

会议之眼 快讯 在学术探索的浩瀚星海中,每一篇论文都像是一颗璀璨的星辰,而那些被顶级期刊或会议收录的论文,则无疑是最耀眼的几颗。 在众多评价标准中,IEEE/ACM Transactions、CCF推荐期刊和会议、SCI分区期刊,它们…

18 内核开发-内核重点数据结构学习

课程简介: Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。 课程特点: 1. 入门级别&…

Qt---day2-信号与槽

1、思维导图 2、 拖拽式 源文件 #include "mywidget.h" #include "ui_mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MyWidget) { ui->setupUi(this); //按钮2 this->btn2new QPushButton("按钮2",th…

什么是多模态大模型,有了大模型,为什么还要多模态大模型?

随着人工智能技术的愈演愈烈,其技术可以说是日新月异,每隔一段时间就会有新的技术和理念被创造出来;而多模态大模型也是其中之一。 什么是多模态 想弄明白什么是多模态大模型,那么首先就要弄明白什么是多模态。 简单来说&#x…

【Git】Commit后进行事务回滚

起因 因为一直使用git add .,在学习pytorch中添加了一个较大的数据集后,导致git push失败,而这个大数据集并不是必须要上传到仓库的,但是因为自己在设置.gitignore前已经进行了git comit,所以,需要进行事务…

嵌入式linux学习第三天汇编语言点灯

嵌入式linux学习第三天汇编语言点灯 今天学习如何在linux板子上点灯。 I.MX6U GPIO 详解 我们发现I.MX6U GPIO是分为两类的,:SNVS 域的和通用的。在讨论i.MX6U或类似的复杂微处理器时,了解其GPIO(通用输入输出)引脚…

Windows环境编译 VVenC 源码生成 Visual Studio 工程

VVenC介绍 Fraunhofer通用视频编码器(VVenC)的开发是为了提供一种公开可用的、快速和有效的VVC编码器实现。VVenC软件基于VTM,其优化包括软件重新设计以减轻性能瓶颈、广泛的SIMD优化、改进的编码器搜索算法和基本的多线程支持以利用并行。此外,VVenC支…

深度学习之基于YOLOv5目标检测可视化系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着深度学习技术的快速发展,目标检测在多个领域中的应用日益广泛,包括…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

很快就可以试用Domino 15了

大家好,才是真的好。 前几天在比利时的安普卫特举办的Engage2024大会已经结束,流出的现场照片很多,主要是会议场地照片很多,说是令人震撼;可惜这次一手的PPT和会议内容不多.是的,本来我也是在等与会者写的…

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高,CPU也出现异常 关闭虚拟机重新开启,还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

如何提取视频二维码链接?二维码在线提取链接的方法

随着现在二维码用途的不断增多,很多不同的内容都可以生成二维码来展示,比如现在视频二维码就是比较常见的一种类型,一般用于产品介绍、教程演示、宣传推广等等。二维码的方式在某些情况下也有局限性,当无法扫码时就无法查看内容&a…

Linux信号捕捉

要处理信号, 我们进程就得知道自己是否收到了信号, 收到了哪些信号, 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表, 什么时候进行检测呢? 当我们的进程从内核态返回到用户态的时候&…

荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 3 4 2 .... ***. ..a. 输出 yes 思路: 根据题意,这里 1 s 可以移动多次,我们将每次可以移动避开雪的的位置存储起来,判断当…