pytest教程-37-钩子函数-pytest_collection_finish

ops/2024/9/23 14:30:07/

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

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

pytest_collection_finish(session) 是一个 pytest 钩子函数,它在所有测试用例收集完成后被调用。这个钩子可以用来执行一些测试后的清理工作,比如关闭数据库连接、清理临时文件等。以下是如何使用这个钩子函数的具体方法和代码示例:

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

# conftest.pyimport logging# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def pytest_collection_finish(session):# 打印测试用例收集完成的信息logging.info("Test collection has finished.")# 关闭数据库连接# 假设在 pytest_collection_start 钩子中已经建立了数据库连接if hasattr(session, 'db_connection'):session.db_connection.close()logging.info("Database connection closed.")# 清理临时文件# 假设我们在测试过程中创建了一些临时文件temp_files = ['temp_file1.txt', 'temp_file2.txt']for file_name in temp_files:try: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}")# 其他清理操作...

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,在 pytest_collection_finish 钩子函数中,我们首先打印了一条消息,表示测试用例的收集已经完成。

接下来,我们检查 session 对象是否有一个名为 db_connection 的属性,这个属性假设是在 pytest_collection_start 钩子中创建的数据库连接。如果有,我们就关闭这个连接,并记录关闭操作的信息。

此外,我们还模拟了一个清理临时文件的过程。我们定义了一个临时文件列表 temp_files,然后遍历这个列表,尝试删除每个文件。如果文件删除成功,我们记录一条信息;如果删除失败,我们记录错误信息。

请注意,这个示例中的数据库连接关闭和临时文件清理都是假设的操作,你需要根据你的项目实际情况来实现这些功能。hasattr 函数用于检查 session 对象是否有特定的属性,这是一种安全的方式来避免属性不存在时抛出 AttributeError

现在,当你运行测试时,pytest_collection_finish 钩子函数会在所有测试用例收集完成后被调用,执行上述的清理操作。这有助于确保测试环境在测试结束后保持干净。

我们再通过一个更复杂的示例来展示 pytest_collection_finish 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在测试用例收集完成后执行一些复杂的清理工作,包括关闭多个资源、清理日志文件、以及执行一些最终的验证。

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

# conftest.pyimport logging
import os
import shutil
from some_database_module import close_database_connection  # 假设这是一个关闭数据库连接的函数
from some_file_module import delete_files  # 假设这是一个删除文件的函数# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def pytest_collection_finish(session):# 打印测试用例收集完成的信息logging.info("All test cases have been collected and are ready for execution.")# 关闭数据库连接if 'db_connection' in session:close_database_connection(session['db_connection'])logging.info("Database connection has been closed.")# 清理日志文件log_files = ['log1.log', 'log2.log']  # 假设我们在测试过程中生成了一些日志文件for log_file in log_files:try:os.remove(log_file)logging.info(f"Log file {log_file} has been deleted.")except OSError as e:logging.error(f"Failed to delete log file {log_file}: {e}")# 执行最终的验证# 假设我们有一个验证函数来确保所有资源都已被正确清理try:assert verify_resources_are_cleaned(), "Some resources were not cleaned up properly."logging.info("All resources have been verified and cleaned up."except AssertionError as e:logging.error(f"Validation failed: {e}")# 清理临时目录temp_dir = 'temp_directory'  # 假设我们在测试过程中创建了一个临时目录try:shutil.rmtree(temp_dir)logging.info(f"Temporary directory {temp_dir} has been removed.")except OSError as e:logging.error(f"Failed to remove temporary directory {temp_dir}: {e}")# 其他清理操作...# 假设的资源清理验证函数
def verify_resources_are_cleaned():# 这里应该包含实际的资源清理验证逻辑# 为了示例,我们假设所有资源都已清理return True# 假设的临时目录清理函数
def cleanup_temp_directory():# 这里应该包含实际的临时目录清理逻辑# 为了示例,我们假设临时目录已经不存在pass

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,在 pytest_collection_finish 钩子函数中,我们首先打印了一条消息,表示所有测试用例已经收集完成。

我们检查 session 对象是否有一个名为 db_connection 的属性,并调用 close_database_connection 函数来关闭数据库连接。我们还定义了一个 log_files 列表,用于存储需要删除的日志文件。我们遍历这个列表,尝试删除每个文件,并记录操作结果。

接下来,我们定义了一个 verify_resources_are_cleaned 函数,用于验证所有资源是否已经被正确清理。这个函数应该包含实际的资源清理验证逻辑。在这个示例中,我们假设所有资源都已清理。

最后,我们尝试删除一个名为 temp_directory 的临时目录。这个目录应该在测试过程中被创建,现在我们需要在测试结束后清理它。

请注意,这个示例中的数据库连接关闭、日志文件清理、资源验证和临时目录清理都是假设的操作,你需要根据你的项目实际情况来实现这些功能。这个示例展示了如何在测试用例收集完成后执行一系列复杂的清理工作。

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


http://www.ppmy.cn/ops/35320.html

相关文章

AI工具如何改变我们的工作与生活

AI工具在当今社会中扮演着越来越重要的角色,它们已经开始改变着我们的工作方式和生活方式。在接下来的2000字篇幅中,我将详细探讨AI工具如何影响我们的工作和生活。 AI工具在工作中的影响: 自动化和智能化生产流程: AI工具可以通…

鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证

文章目录 系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环…

redis stream 作为消息队列的最详细的命令说明文档

简介 stream 作为消息队列,支持多次消费,重复消费,ack机制,消息异常处理机制。 涉及到以下几个概念,消息流,消费者组,消费者。 涉及到以下命令 # 添加消息到流中 XADD key [NOMKSTREAM] [&…

第二章数据处理伦理练习

单选题 (每题1分,共12道题) 1、 [单选] 以下哪种活动中,混淆是不足以保护数据的? A:数据共享 B:数据转换 C:数据脱敏 D:以上都正确 2、 [单选] 定义雇员如何理解现有做法在建立和维护客户、合伙人和其他利益相关方之间信任方面的伦理影响,属于建立数据伦理文化的哪…

Linux网络-部署YUM仓库及NFS共享服务

目录 一.YUM仓库服务 1.YUM概述 1.1.YUM(Yellow dog Updater Modified) 2.准备安装源 2.1.软件仓库的提供方式 2.2.RPM软件包的来源 2.3.构建CentOS 7 软件仓库 2.4.在软件仓库中加入非官方RPM包组 3.一键安装软件包的工具: 好处&a…

C++中list的使用

文章目录 一、 list简介二、 构造函数1. 默认构造函数2. 拷贝构造3. 迭代器区间初始化4. 插入n个值为x的数据5. 代码示例 三、 容量和元素访问1. empty()2. size()3. max_size()3. back()4. front()5. 代码示例 四、 增删查改1. push_back()2. push_front()3. emplace_back()4.…

详细分析Java中的@Service注解

目录 1. 基本知识2. Demo2.1 传统形式2.2 注解形式 3. 总结 1. 基本知识 Service 是 Spring Framework 中的一个注解,用于标识一个类为服务层组件 服务层(Service Layer): 服务层是应用程序的一个层次结构,位于控制层…

网络文件共享

存储类型分三类 直连式存储:DAS存储区域网络:SAN网络附加存储:NAS 三种存储架构的应用场景 DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业SAN多适用于文件服务器&#xff0c…