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

news2025/1/15 13:08:35

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

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

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

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

# conftest.py

import 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 = None

def 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_connection
    db_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.py

import 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 = None

def 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.duration
    logging.info(f"Test {item.name} executed in {execution_time} seconds.")

# 在测试用例执行前执行的代码
def pytest_runtest_setup(item):
    # 初始化数据库连接
    global db_connection
    db_connection = DatabaseConnection()
    logging.info("Database connection initialized.")

    # 初始化网络资源
    global network_resource
    network_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):
        # 初始化网络资源
        pass

    def close(self):
        # 关闭网络资源
        pass

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

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

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

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

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

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

相关文章

【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】

目录 前端文件操作与文件上传前端接受后端传输文件指南 前端文件操作与文件上传 一、前端文件上传有两种思路: 二进制blob传输:典型案例是formData传输,相当于用formData搭载二进制的blob传给后端base64传输:转为base64传输&…

【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析

文章目录 一、内核中通用hid触摸驱动二、probe过程剖析(1)hid_parse()函数(2)hid_hw_start()函数(3)hid_connect()函数三、hid-multitouch.c应用场景一、内核中通用hid触摸驱动 在linux内核中,为HID触摸面板实现了一个通用的驱动程序,位于/drivers/hid/hid-multitouch.c文件…

连续活跃天数统计

连续活跃天数统计 需求说明 什么是连续出现? 假设有如下日期信息: 20230401,20230402,20230403,20230405,20230406,20230407,20230410,20230411 则: 20230401-20230403 为一次连续出现,连续出现天数为 3 20230405-20230407 为一次…

【Qt QML】ComboBox组件

ComboBox 是一个组合的按钮和弹出列表。它提供了一种以最小的屏幕空间呈现选项列表给用户的方式。ComboBox 使用数据模型填充。数据模型通常是一个 JavaScript 数组、一个 ListModel 或一个整数,但也支持其他类型的数据模型。 下面是一个简单的使用方式。 import …

关于Anaconda常用的命令

常用命令 查看当前环境下的环境:conda env list查看当前conda的版本;conda --version conda create -n your_env_name pythonX.X(2.7、3.6等)命令创建python版本为X.X。名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装…

专题五_位运算(3)

目录 137. 只出现一次的数字 II 解析 题解 面试题 17.19. 消失的两个数字 解析 题解 137. 只出现一次的数字 II 137. 只出现一次的数字 II - 力扣(LeetCode) 解析 注意这里指的是比特位上的01来进行统计的 题解 class Solution { public:int sin…

二叉排序树(二叉搜索树)BST增删改查操作

一、定义 二叉搜索树(Binary Search Tree,BST)是一种常用的二叉树数据结构,具有以下特点: 1. **排序性质**:对于树中的每个节点,其左子树中的所有节点值都小于该节点的值,而右子树…

类和对象(中篇)(未完结)

文章目录 类的6个默认成员函数构造函数析构函数 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 class Date {};空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默…

《QT实用小工具·六十一》带动画的三角形指示箭头

1、概述 源码放在文章末尾 该项目实现了一个带动画效果的三角形指示箭头,项目demo演示如下所示: 用法 interestingindicate.h interestingindicate.cpp 放到工程中,直接使用即可。 注意:建议绝对布局,手动指定 wid…

分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报

伊利47万股东,又等来了一个好消息。 4月29日,伊利股份发布2023年报,实现营业总收入1261.79亿元,归母净利润104.29亿元,双创历史新高,实现连续31年稳健增长。 在递交亮眼成绩单的同时,乳业巨头伊…

Linux系统编程--网络编程

一、OSI网络七层模型 OSI模型将整个网络通信过程分解为七个层次,每个层次都为网络通信提供了特定的功能。以下是OSI模型的七个层次,从上到下依次是: 应用层(Application Layer):为应用软件提供网络服务&am…

MySQL部署系列-centos离线安装MySQL

MySQL部署系列-centos离线安装MySQL 文章目录 MySQL部署系列-centos离线安装MySQL1. 查看是否已经安装 Mysql3. 下载官方 Mysql 包3. 下载之后上传到服务器4. 创建用户组5. 创建数据目录并赋予权限6. 修改配置文件 vim /etc/my.cnf7. 初始化数据库(数据库安装)8. 加入到系统服务…

多个开源的js补环境框架测试

原文链接:https://mp.weixin.qq.com/s/uEMFGpE5bqmTvzSgX2twvA 前言 在做js逆向时肯定会遇到补环境的情况,看到github开源了好几个补环境用的框架,这篇文章做个测试,看看哪个比较好用。 https://github.com/pysunday/sdenvhttp…

word格式技巧

文章目录 论文格式技巧论文交叉引用怎么弄论文的页码怎么弄 论文格式技巧 论文交叉引用怎么弄 1.取消文献原有的编号 2.定义新编号 3.具体编号设置 4.在引用的地方插入,具体引用选项卡–>交叉引用–>选择后插入 2. 4. 论文的页码怎么弄 假设我们有这样一…

探索DeepSeek平台:新一代MoE模型的深度体验

简介 DeepSeek是一个创新的人工智能平台,它最近推出了其最新版本的模型——DeepSeek-V2 MoE(Mixture of Experts)。这个平台不仅提供了一个交互式的聊天界面,还提供了API接口,让用户可以更深入地体验和利用这一先进的…

scala速通(精简版)

1.变量和常量 var name [:VariableType] value // variable val name [:ConstantType] value // constant1.声明变量时,类型可以省略 2.类型定义后就不能修改言 3.变量声明必须有初始值 4.变量,常量分别用var,val声明修饰 2.标识符命名…

构建自己的docker镜像node.js

学习资源: 构建自己的 Docker 镜像_哔哩哔哩_bilibili 针对其中的一些比较困难的点写篇文章。 以下是对app.js的注释: // 使用 Koa 框架搭建 Node.js 应用的示例代码// 这两行代码引入了 koa 模块,并创建了一个新的 Koa 应用实例&#xf…

vue2项目升级到vue3经历分享4

后端重构,如果接口做好抽象封装,只需要考虑jar之间的兼容性问题,jdk版本不变,基本不用做太大的调整,但是前端就不一样,除了vue框架本身,css的调整,改起来更是让人头疼。前面写了vue2…

如何让vim支持python3

首先删除旧的vim。 sudo apt-get remove vim //输入re按下tab直接显示remove sudo apt-get remove vim-runtime sudo apt-get remove vim -tiny sudo apt-get remove vim-common 然后下载vim8源码: git clone https://github.com/vim/vim.git 进行编译安装…

一键剪辑1000条视频的矩阵系统小魔推到底有多牛?

小魔推是一款短视频营销工具,主要针对想做短视频营销的实体商家与企业。通过BGC、PGC、UGC流量的打造,帮助更多实体行业实现流量裂变与转化。通过小魔推不需要做额外的拍摄剪辑创作动作,只需要通过小魔推宣传码,就能一键发布带有门…