pytest教程-40-钩子函数-pytest_runtest_call

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

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

pytest_runtest_call 钩子函数在 pytest 调用测试函数(即测试用例的执行阶段)之前被调用。这个钩子可以用来在测试函数执行之前进行一些准备工作,或者在测试函数执行之后进行一些清理工作。以下是如何使用这个钩子函数的具体方法和代码示例:

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

# conftest.py

import pytest
import logging

# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def pytest_runtest_call(item):
    # 在测试函数执行之前执行的代码
    logging.info(f"Running test: {item.name}")
    
    # 假设我们需要在每个测试用例执行前进行一些准备工作
    # 例如,设置测试数据、初始化资源等
    # ...

    # 执行测试函数
    yield  # 这是 pytest_runtest_call 钩子的一个特殊之处,它允许我们使用 yield
            # 来暂停执行,等待测试函数执行完成后继续执行后续代码

    # 在测试函数执行之后执行的代码
    # 例如,清理资源、验证测试结果等
    # ...

    # 如果测试函数执行成功,我们可以在这里进行一些后续处理
    # 如果测试函数执行失败,pytest 会调用 pytest_runtest_teardown 钩子来处理清理工作
    # ...

# 你也可以在 pytest_runtest_call 钩子中捕获异常,并进行相应的处理
def pytest_runtest_call(item, call):
    try:
        # 在这里执行测试前的准备工作
        # ...

        # 调用测试函数
        call()

        # 在这里执行测试后的清理工作
        # ...

    except Exception as e:
        # 如果在测试执行过程中发生异常,我们可以在这里捕获并处理
        logging.error(f"An error occurred during the test: {e}")

# 如果你想要在测试执行后立即执行某些操作,可以使用 pytest_runtest_teardown 钩子
def pytest_runtest_teardown(item, nextitem):
    # 在这里执行测试执行后的清理工作
    # ...

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,我们在 pytest_runtest_call 钩子函数中使用 yield 关键字来暂停执行,等待测试函数执行完成后继续执行后续代码。这样,我们可以在测试函数执行前后执行一些操作,例如设置和清理测试数据。

请注意,pytest_runtest_call 钩子函数的参数 call 是一个函数,它代表了要执行的测试函数。我们通过调用 call() 来执行测试函数。如果在测试执行过程中发生异常,我们可以在 pytest_runtest_call 钩子中捕获并处理这些异常。

这个示例展示了如何在测试用例执行前后执行一系列操作,并处理可能出现的异常情况。在实际应用中,你可能需要根据具体的测试需求来调整这些操作。

让我们通过一个更复杂的示例来展示 pytest_runtest_call 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在每个测试用例执行前后进行数据库操作的模拟,配置日志记录器,以及在测试用例执行失败时记录详细的错误信息。我们还将展示如何在测试用例执行后进行断言验证。

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

# conftest.py

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

def pytest_runtest_call(item):
    # 在测试用例执行前执行的代码
    logging.info(f"Setting up for test: {item.name}")
    
    # 配置日志记录器
    configure_logger(item.name)
    
    # 初始化数据库连接
    try:
        global db_connection
        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.xfail(f"Skipping test {item.name} due to database initialization failure.")
        return True  # 阻止其他钩子函数执行

    # 执行测试函数
    yield  # 允许测试函数执行

    # 在测试用例执行后执行的代码
    if db_connection:
        try:
            # 执行一些清理数据库的操作
            execute_query(db_connection, "TRUNCATE TABLE test_table")
            logging.info("Test table cleaned up.")
        except Exception as e:
            logging.error(f"Failed to clean up test table for test: {item.name} - {e}")
            # 如果清理失败,记录错误信息,但允许测试继续执行
        # 关闭数据库连接
        finally:
            db_connection.close()
            logging.info("Database connection closed.")

    # 在这里执行其他清理工作,例如删除临时文件等
    # ...

    # 如果测试用例执行成功,进行断言验证
    # 假设我们有一个断言验证函数
    if item.name == "test_assertion":
        assert item.test_data['key1'] == "value1", "Assertion failed in test_assertion"
        logging.info("Assertion check passed.")

# 在测试用例执行后执行的代码
def pytest_runtest_teardown(item, nextitem):
    # 在这里执行测试执行后的清理工作
    # 例如,验证测试结果、记录测试日志等
    # ...

在这个示例中,我们在 pytest_runtest_call 钩子函数中首先配置了日志记录器,然后尝试初始化数据库连接并创建一个测试表。如果数据库初始化失败,我们使用 pytest.xfail 跳过当前测试用例。在测试用例执行后,我们执行数据库清理操作,并关闭数据库连接。

我们还定义了一个 pytest_runtest_teardown 钩子函数来执行测试用例执行后的清理工作,例如验证测试结果和记录测试日志。

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

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

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

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

相关文章

JAVA栈相关习题3

1.将递归转化为循环 比如&#xff1a;逆序打印链表 // 递归方式void printList(Node head){if(null ! head){printList(head.next);System.out.print(head.val " ");}} // 循环方式void printList(Node head){if(nullhead){return;}Stack<Node> snew Stack<…

将大概的流程具体还是看源码

之前看源码的时候呢没有文字整理&#xff0c;想来还是写一个大概的流程吧&#xff0c;具体是无法用文字描述 spring源码真的yyds&#xff0c;数据结构 反射 父子类 接口…玩得溜到飞起 博大精深呐 后期不断喜欢ing&#xff01; springApplication.run方法 获取了一个Configu…

STC8增强型单片机开发——库函数

一、使用库函数点灯 导入库函数。 下载STC8H的库函数&#xff1a;&#x1f4ce;STC8G-STC8H-LIB-DEMO-CODE_2023.07.17_优化版.zip 来到库函数的目录下&#xff0c;拷贝以下文件&#xff1a; Config.hType_def.hGPIO.hGPIO.c 新建项目&#xff0c;将拷贝的4个文件放到项目目录…

【管理咨询宝藏96】企业数字化转型的中台战略培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏96】企业数字化转型的中台战略培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 数字化转型是指&…

代码审计-php篇之某CRM系统多处sql注入

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;3516 阅读时间: 35min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果…

科沃斯,「扫地茅」荣光恐难再现

作者 | 辰纹 来源 | 洞见新研社 科沃斯恐怕已经很难再回到被市场誉为“扫地茅”时的荣光了。 不久前&#xff0c;科沃斯发布2023年财报&#xff0c;报告期内营业收入155亿&#xff0c;同比仅增长1.16%&#xff0c;归母净利润6.12亿元&#xff0c;同比下降63.96%&#xff0c;直…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第11章 救砖方法

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

pycharm中导入rospy(ModuleNotFoundError: No module named ‘rospy‘)

1. ubuntu安装对应版本ros ubuntu20.04可参考&#xff1a; https://wiki.ros.org/cn/noetic/Installation/Ubuntuhttps://zhuanlan.zhihu.com/p/515361781 2. 安装python3-roslib sudo apt-get install python3-roslib3.在conda环境中安装rospy pip install rospkg pip in…

重定向_缓冲区

目录 重定向 文件属性操作 浅谈重定向​编辑 深入重定向 dup2 缓冲区 缓冲区的理论理解 代码分析 重定向 文件属性操作 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int fstat(i…

USB系列一:USB技术概念

在这里USB的历史就不赘述了&#xff0c;有兴趣可以自己去搜索。也省略掉USB接口的概述&#xff0c;这些都是一些飞技术性的常识性的知识&#xff0c;没必要浪费篇幅和文字来描述。 一、USB总线版本&#xff1a;&#xff08;从USB1.1说起&#xff09; 1、USB1.1 1998年9月23日…

教你如何高效使用Java中的ArrayList

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【vue+el-upload】当action=“#“,代表不使用默认上传,使用自定义上传,http-request获取文件流

el-upload有多种上传行为&#xff1a; 1、立即上传&#xff1a; 当 action 属性被赋予一个有效的 URL 时&#xff0c;一旦用户选择了文件&#xff0c;el-upload 组件会立即自动将文件上传到指定的服务器地址。 2、不立即上传&#xff08;自定义触发&#xff09;&#xff1a; 如…

杰发科技AC7840——软件Sent_HAL39X

0. 序 截止2024.5.8&#xff0c;杰发的MCU没有硬件Sent功能&#xff0c;因此使用PWM模拟Sent来试试。 测试下7840的软件sent功能。 参考链接&#xff1a;SENT协议应用笔记 - TechPlus汽车工坊的文章 - 知乎 SENT协议 1. Sent功能测试 使用提供的软件Sent代码在7840上测试&a…

正点原子Linux学习笔记(五)FrameBuffer 应用编程

FrameBuffer 应用编程 19.1 什么是 FrameBuffer19.2 LCD 的基础知识19.3 LCD 应用编程介绍使用 ioctl()获取屏幕参数信息使用 mmap()将显示缓冲区映射到用户空间 19.4 LCD 应用编程练习之 LCD 基本操作19.5 LCD 应用编程练习之显示 BMP 图片在 LCD 上显示 BMP 图像在开发板上测…

超强动画制作软件blender

blender中文手册&#xff1a;Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质&#xff0c;它拥有庞大的用户群体和活跃的开发者社区&#xff0c;这使得Blender的功能和性能得到了不断的提升和优化…

Windows内核开发:如何使用STL

前言 大家都知道应用层c的STL非常强大&#xff0c;非常好用&#xff0c;但是在内核下就没法用了。针对这个问题&#xff0c;经过我不懈的寻找&#xff0c;终于找到了解决内核无法使用STL的方法。 使用new/delete关键字 先说一下常用关键字如何在内核中使用。其实只需要在一个全…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是&#xff0c;当我们按下数字1快捷键&#xff0c;我们的技能按钮会进入倒计时&#xff0c;如下图演示&#xff1a; 一、新建场景和根节点设置 新建场景&#xff0c;选择TextureButton作为根节点&#xff0c;重名为SpellButton&#xff0c;保存场景…

啸叫抑制器采用什么处理芯片?ES56031或PH56031

会议系统或卡拉OK最头疼的就是啸叫了吧&#xff0c;来看看啸叫抑制器采用什么芯片 四通道啸叫抑制器&#xff0c;采用了2个电路板&#xff0c;每个板子处理2路信号&#xff0c;每块电路板有2个卡侬输入插座&#xff0c;2个卡侬输出插座 ES56031S&#xff0c;该啸叫抑制器为4通道…

【优选算法】——双指针——Leetcode——283.移动零

目录 ​编辑 1.题目 2. 解法&#xff08;快排的思想&#xff1a;数组划分区间-数组分两块&#xff09;&#xff1a; 1.算法思路&#xff1a; 2.算法流程&#xff1a; 3.代码实现 1.C语言 2.C 1.题目 283. 移动零 提示 给定一个数组 nums&#xff0c;编写一个函数将所有…

MySQL增删查改(进阶)

目录 数据库约束 表的设计 查询操作的进阶 查询搭配插入使用 聚合查询 1>count(*) 2>sum(*) 3>avg(*) 4>max(*) 5>min(*) group by分组分别进行聚合查询 联合查询 / 多表查询[重点] 外连接 自连接 子查询 合并查询 小结: 数据库约束 有时候…
最新文章