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

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

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

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

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

# conftest.py

import 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.py

import 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

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

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

相关文章

【深度学习】序列模型

深度学习(Deep Learning)是机器学习的一个分支领域:它是从数据中学习表示的一种新方法,强调从连续的层中进行学习,这些层对应于越来越有意义的表示。 1. 为什么选择序列模型? 循环神经网络(RNN…

与 Apollo 共创生态:Apollo 7 周年大会的启示与心得

文章目录 前言Apollo X 全新征程Application X 企业预制套件总结 前言 在过去的七年中,Apollo 开放平台经历了一段令人瞩目的发展历程。从最初的构想到如今的成熟阶段,Apollo 已经推出了 13 个版本,吸引了来自全球 170 多个国家和地区的 16 …

曼奇立德10节春季插画研修课

课程介绍 课程探讨了存在主义心理学的基本原理和方法。通过学习该课程,您将了解到存在主义的核心概念,如自由意志、责任感和意义寻求。您将学会运用存在主义理论和技巧来帮助个人面对挑战、追求自我实现,并寻找生活的意义。这门课程将启发您的…

JS基础:JS语法规范详解(最全!)

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端基础路线”,可获取完整web基础…

Netty核心线程模型源码分析

文章目录 一、Netty线程模型简介二、Netty线程模型源码分析1. 服务端源码分析 一、Netty线程模型简介 Netty的线程模型图如下所示: 具体细节看这篇博客 二、Netty线程模型源码分析 1. 服务端源码分析 首先我们在写Netty服务端程序的时候最开始是下面两句代码&a…

React + 项目(从基础到实战) -- 第11期

目标 问卷编辑器的开发 设计UI - 拆分布局 水平垂直居中 画布 y方向滚动 自定义问卷组件 后端 返回组件数据 //获取单个问卷信息{url: /api/question/:id,method: get,response: () > {return {errno: 0,data: {id: Random.id(),title: Random.ctitle(),componentList:[//…

1W 3KVDC 隔离双输出 DC/DC 电源模块 ——TPD 系列

TPD系列提供双独立输出电压,并且两组电压可以不同,这样就节省一个电源模块,特别适合一块板上有多个不同电压要求的设计,而外形尺寸和TPA一样,工作温度范围广-40℃到 105℃。

【go项目01_学习记录05】

学习记录 1 依赖管理 Go Modules1.1 弃用 $GOPATH1.2 Go Modules 日常使用1.2.1 初始化生成go.mod文件1.2.2 Go Proxy代理1.2.3 go.mod文件查看1.2.4 go.sum文件查看1.2.5 indirect 含义1.2.6 go mod tidy 命令1.2.7 清空 Go Modules 缓存1.2.8 下载依赖1.2.9 所有 Go Modules …

sip转webrtc方案

技术选型 由于很多企业会议协议用的主要是webrtc,但是项目上很多时候的一些旧设备只支持sip协议,并不支持webrtc协议。所以sip和webrtc的相互转换就很有必要。 流媒体服务mediasoup本身并不支持sip协议。那么如何实现sip转webrtc呢? 根据调研…

攻防世界-xff-referer

题目信息 分析过程 显示ip必须为123.123.123.123,则进行伪造 解题过程 打开repeator 提示必须来自https://www.google.com,则再次构造Referer 相关知识 x-forwarded-for 和 referer的区别: x-forwarded-for 用来证明ip的像是“127.0.0.1”这种&a…

迭代器解释(C++)

一、什么是迭代器 为了提高C编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector、list、map、set等。然而有些容器(vector)可以通过下标索引的方式访问容器里面的数据,但是…

【论文泛读】如何进行动力学重构? 神经网络自动编码器结合SINDy发现数据背后蕴含的方程

这一篇文章叫做 数据驱动的坐标发现与方程发现算法。 想回答的问题很简单,“如何根据数据写方程”。 想想牛顿的处境,如何根据各种不同物体下落的数据,写出万有引力的数学公式的。这篇文章就是来做这件事的。当然,这篇论文并没有…

流畅的python-学习笔记_对象引用、可变性、垃圾回收

变量不是盒子 即变量是引用,而不是实际内存,多个标识赋值相同变量时,多余标识是引用 标识、相等性、别名 比较对象的值,is比较对象的id。实际调用对象的__eq__方法。is速度比快,因为is不能重载,省去了寻…

TypeScript学习日志-第十九天(namespace命名空间)

namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问,如图: 二、 嵌套 namespace 可以进行嵌套使用,如图: 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…

4+1视图,注意区分类图与对象图

注意区分类图和对象图。对象图标记的是对象名,命名形式 对象名:类名,或者:类名。这里没有出现冒号,表示的是类图。 对象图(object diagram)。 对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一…

创造未来知识管理新篇章:Ollama与AnythingLLM联手打造个人与企业的安全知识库!

一 Ollama 1.1 简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程,使得用户能够快速地在本地运行大…

软件测试,软件评测师

如果你想考软件评测师证书,那这篇文章可以帮你少走很多弯路,估计你用别人一半的时间备考就可以通过考试,以下为本人亲身经验哈,你可以先收藏后看哦,提前祝你考试过过过。 如果以后想从事一份软件测试工程师的工作&…

浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents 该文提出一种基于层级式扩散模型的由文本生成图像的方法,也就是大名鼎鼎的DALLE2。在DALLE2之前呢,OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了,其中DALLE是基…

fabric部署调用合约示例

一 打包智能合约 ①进入fabric-samples文件夹下的chaincode/fabcar/go目录下执行 GO111MODULEon go mod vendor下载依赖(文件夹下已经有go.mod,不需要使用go mod init生成该module文件)②进入到test-network文件下使用以下命令将二进制文件…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据计算过程计算结果) 1、时间:2002-2021年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、人均受教育年…