pytest教程-41-钩子函数-pytest_runtest_teardown

news/2024/5/20 7:58:31

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

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

pytest_runtest_teardown 钩子函数在每个测试用例执行完成后被调用,无论是成功、失败还是跳过。这个钩子可以用来执行测试后的清理工作,例如关闭数据库连接、删除临时文件、恢复测试环境到原始状态等。以下是如何使用这个钩子函数的具体方法和代码示例:

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

# conftest.pyimport pytest
import logging
from some_database_module import DatabaseConnection, close_connection  # 假设这是我们的数据库操作模块# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 假设我们有一个全局数据库连接对象
db_connection = Nonedef pytest_runtest_teardown(item, nextitem):# 在测试用例执行后执行的代码logging.info(f"Tearing down after test: {item.name}")# 关闭数据库连接if db_connection and not db_connection.is_closed():close_connection(db_connection)logging.info("Database connection closed.")db_connection = None  # 确保 db_connection 不再被引用# 删除测试期间创建的临时文件temp_files = ['temp_file1.txt', 'temp_file2.txt']for file_name in temp_files:try:if os.path.exists(file_name):os.remove(file_name)logging.info(f"Temporary file {file_name} removed.")except OSError as e:logging.error(f"Failed to remove temporary file {file_name}: {e}")# 执行其他清理操作,例如恢复系统状态、清理缓存等# ...# 如果测试用例失败,记录详细的错误信息if item.failed:logging.error(f"Test {item.name} failed with the following exceptions:")for excinfo in item.trace:logging.error(excinfo.get_traceback())# 如果测试用例跳过,记录跳过的原因if item.skipped:logging.info(f"Test {item.name} was skipped: {item.parent.get_closest_marker('skip').arguments[0]}")# 在测试用例执行前执行的代码
def pytest_runtest_setup(item):# 初始化数据库连接global db_connectiondb_connection = DatabaseConnection()logging.info("Database connection initialized.")# 创建测试期间需要的临时文件for file_name in ['temp_file1.txt', 'temp_file2.txt']:open(file_name, 'w').close()logging.info(f"Temporary file {file_name} created.")

在这个示例中,我们在 pytest_runtest_teardown 钩子函数中首先关闭了数据库连接,并删除了测试期间创建的临时文件。我们还记录了测试用例失败时的详细错误信息,以及测试用例被跳过的原因。

pytest_runtest_setup 钩子函数中,我们初始化了数据库连接并创建了临时文件。这些操作在测试用例执行前执行,以确保测试环境准备就绪。

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

在这个更复杂的示例中,我们将使用 pytest_runtest_teardown 钩子函数来处理多种情况,包括资源清理、异常捕获、断言验证以及测试结果的记录。我们将模拟一个具有多个资源(如数据库、文件系统、网络服务)的测试环境,并在测试结束后确保所有资源都被正确清理。

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

# conftest.pyimport pytest
import logging
import os
import shutil
from some_database_module import DatabaseConnection, close_connection  # 假设这是我们的数据库操作模块
from some_network_module import close_network_connection  # 假设这是我们的网络操作模块# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 假设我们有一些全局资源对象
db_connection = None
network_resource = Nonedef pytest_runtest_teardown(item, nextitem):# 在测试用例执行后执行的代码logging.info(f"Tearing down after test: {item.name}")# 关闭数据库连接if db_connection and not db_connection.is_closed():try:close_connection(db_connection)logging.info("Database connection closed.")except Exception as e:logging.error(f"Failed to close database connection: {e}")# 关闭网络连接if network_resource:try:close_network_connection(network_resource)logging.info("Network resource connection closed.")except Exception as e:logging.error(f"Failed to close network resource: {e}")# 删除测试期间创建的临时文件和目录temp_files = ['temp_file1.txt', 'temp_file2.txt']temp_directories = ['temp_directory']for file_name in temp_files:try:if os.path.exists(file_name):os.remove(file_name)logging.info(f"Temporary file {file_name} removed.")except OSError as e:logging.error(f"Failed to remove temporary file {file_name}: {e}")for dir_name in temp_directories:try:if os.path.exists(dir_name):shutil.rmtree(dir_name)logging.info(f"Temporary directory {dir_name} removed.")except OSError as e:logging.error(f"Failed to remove temporary directory {dir_name}: {e}")# 验证测试结果if item.failed:logging.error(f"Test {item.name} failed with the following exceptions:")for excinfo in item.trace:logging.error(excinfo.get_traceback())# 如果测试用例跳过,记录跳过的原因if item.skipped:logging.info(f"Test {item.name} was skipped: {item.parent.get_closest_marker('skip').arguments[0]}")# 记录测试用例的执行时间execution_time = item.durationlogging.info(f"Test {item.name} executed in {execution_time} seconds.")# 在测试用例执行前执行的代码
def pytest_runtest_setup(item):# 初始化数据库连接global db_connectiondb_connection = DatabaseConnection()logging.info("Database connection initialized.")# 初始化网络资源global network_resourcenetwork_resource = SomeNetworkResource()  # 假设这是我们的网络资源对象logging.info("Network resource initialized.")# 创建测试期间需要的临时文件和目录for file_name in ['temp_file1.txt', 'temp_file2.txt']:open(file_name, 'w').close()logging.info(f"Temporary file {file_name} created.")try:os.makedirs('temp_directory')logging.info("Temporary directory created.")except OSError as e:logging.error(f"Failed to create temporary directory: {e}")# 假设的网络资源类
class SomeNetworkResource:def __init__(self):# 初始化网络资源passdef close(self):# 关闭网络资源pass

在这个示例中,我们在 pytest_runtest_teardown 钩子函数中处理了数据库连接和网络资源的关闭,以及临时文件和目录的删除。我们还记录了测试用例的执行时间,并在测试用例失败时记录了详细的错误信息。如果测试用例被跳过,我们也记录了跳过的原因。

pytest_runtest_setup 钩子函数中,我们初始化了数据库连接和网络资源,并创建了临时文件和目录。这些操作在测试用例执行前执行,以确保测试环境准备就绪。

请注意,这个示例中的数据库操作、网络操作和文件处理都是假设的,你需要根据你的项目实际情况来实现这些功能。这个示例展示了如何在测试用例执行前后执行一系列复杂的操作,并处理可能出现的异常情况。同时,它还展示了如何记录测试结果和执行时间,以及如何在测试用例跳过时记录原因。

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


http://www.mrgr.cn/p/55876144

相关文章

商务分析方法与工具(五):Python的趣味快捷-文件和文件夹操作自动化

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Web前端三大主流框架是什么?

Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位,各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架,最初版本称为AngularJS,后来升级为Angular。它是一个完整的…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 (1)白鲸优化算法BWO 参考文献:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. (2)龙格-库塔优化…

三维建模技术在AI去衣中的奇妙应用

引言: 随着计算机视觉和深度学习技术的迅猛发展,人工智能(AI)在图像处理和理解方面取得了显著进展。其中,一个颇具争议却技术上引人入胜的应用便是AI去衣——即使用AI技术从图片或视频中移除人物的衣物。尽管这技术常因…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段: 1. 概论 自动驾驶系统的认知中有一些模糊的地方,比如自动驾驶系统如何定义的问题,自动驾驶的研发为什么会有那么多的子模块,怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍,了解自动驾…

算法学习(6)-最短路径

目录 Floyd-Warshall算法 Dijkstra算法 Bellman-Ford算法 Bellman-Ford的队列优化 最短路径算法对比分析 Floyd-Warshall算法 现在回到问题:如何求任意两点之间的最短路径呢? 通过之前的学习, 我们知道通过深度或广度优先搜索可以求出两…

算法系列--多源BFS问题

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…

php基础知识快速入门

一、PHP基本知识 1、php介绍: php是一种创建动态交互性的强有力的服务器脚本语言,PHP是开源免费的,并且使用广泛。PHP是解释性语言,按顺序从上往下执行,无需编译,直接运行。PHP脚本在服务器上运行。 2、ph…

Unity 性能优化之光照优化(七)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、测试目的一、实时光源是什么?二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

C++ | Leetcode C++题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1, 0));for (int i 0; i < word1.size(); i) dp[i][0] i;for (int j…

JAVA学习笔记(第三周)

文章目录 继承概述使用场景继承的特点子类继承的内容成员变量访问特点成员方法访问特点方法的重写构造方法this super 多态多态的表现形式多态的前提成员变量和方法调用instanceof优势弊端 包包名的规则全类名final常量 权限修饰符代码块 继承 概述 继承就是子类继承父类的特征…

Error Code: 1449. The user specified as a definer (‘admin‘@‘%‘) does not exist

前言 在进行MySQL数据库迁移或存储过程部署时&#xff0c;您可能会遇到错误 [Err] 1449 - The user specified as a definer (admin%) does not exist。这篇文章将为您提供一个详细的解决方案&#xff0c;帮助您顺利解决这一问题。 错误背景 此错误通常发生在尝试执行一个存…

c语言实现贪吃蛇小游戏————附全代码!!!

目录 1.Win32 API 1.1控制台应用程序 1.2控制台的名称&#xff0c;控制台窗口大小 1.3设置控制台光标位置 COORD - 光标坐标 GetStdHandle - 获取句柄 SetConsoleCursorPosition - 设置光标位置 封装一个设置光标的函数 1.4设置控制台光标的属性 CONSOLE_CURSOR_INFO …

Git系列:Git Stash临时保存与恢复工作进度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展&#xff1a;意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用&#xff08;1&#xff09;意向锁的兼容互斥性&#xff08;2&#xff09;例子1&#xff08…

【Linux】gcc/g++的使用

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中gcc/g使用的相关内容。 如果看到最后您觉得这篇文章写得不错…

【iOS】-- 内存五大分区

【iOS】-- 内存五大分区 内存五大分区1.栈区优点&#xff1a; 2.堆区优点&#xff1a; 3.全局区4.常量区5.代码区 验证static、extern、const关键字比较1.static关键字static关键字的作用&#xff1a;全局静态变量局部静态变量 2.extern关键字对内的全局变量对外的全局变量 3.c…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日&#xff0c;备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天&#xff0c;真的攒足了眼球&#xff0c;不仅俄罗斯这边的很多媒体和自媒体有报道&#xff0c;展会第一天&#xff0c;很多参展商通过短视频平台将展会的盛况传到了国内&#…

近似消息传递算法(AMP)单测量模型(SMV)

1、算法解决问题 很多人致力于解决SLM模型的求逆问题&#xff0c;即知道观测值和测量矩阵&#xff08;字典之类的&#xff09;&#xff0c;要求未知变量的值。SLM又叫做标准线性模型&#xff0c;后续又在此基础上进行升级变为广义线性模型。即SLM是yAxe&#xff0c;这里是线性…