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

news2025/1/16 2:38:51

领取资料,咨询答疑,请➕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.coloradmin.cn/o/1653865.html

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

相关文章

探索 JavaScript 宇宙:DOM与BOM的星际邂逅

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 💯Web API🍀1 API的概念🍀2 Web API的概念…

JavaScript数字分隔符

● 如果现在我们用一个很大的数字,例如2300000000,这样真的不便于我们进行阅读,我们希望用千位分隔符来隔开它,例如230,000,000; ● 下面我们使用_当作分隔符来尝试一下 const diameter 287_266_000_000; console.log(diameter)…

xhs 旋转滑块流程分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 前言 之前搞过 x-s的纯…

CentOs9编译C指令报错的一种解决方案

今天使用centos9编译c代码时,显示bash: gcc: command not found... 下图是我的报错页面,依据提示信息安装gcc之后依旧显示失败 找到其中一种解决方式,完美解决,供参考 输入以下指令更新软件包列表,这里需要等待几分…

如何有效使用Tacotron系列语音合成模型

谷歌开发的Tacotron系列,主要用于文本到语音(TTS)的转换。模型基于端到端的序列到序列(Seq2Seq)架构,能够直接从文本中生成自然听起来的语音。Tacotron系列是基于神经网络的自回归语音合成模型,…

2024全国计算机专业大学排名前10强名单

根据2024软科中国大学专业排名——计算机科学与技术专业,全国计算机专业最好的5所大学分别是清华大学、浙江大学、北京大学、国防科技大学和北京航空航天大学等, 以下是上大学网(https://www.sdaxue.com/)整理的全国计算机专业&a…

IoTDB 入门教程 基础篇⑤——数据模型和基础概念

文章目录 一、前文二、数据模型2.1 关系型数据库MySQL。2.2 时序数据库TDengine2.3 时序数据库InfluxDB2.4 时序数据库IoTDB(本专栏的正主) 三、基础概念3.1 数据库(Database)3.2 设备模板(元数据模板)3.3 …

如何使用低代码快速创建一个复杂交叉报表?

前言 在当今数字化时代,数据是企业决策和发展的重要支柱。为了更好地理解和利用数据,生成清晰、全面的报表至关重要。而复杂交叉报表作为一种高级数据分析工具,能够帮助企业深入挖掘数据背后的价值,提供全面的数据概览和分析结果…

数据结构-线性表-链表-2.3-1

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。 void del(Linkllist &L,int x){LNode *p;if(LNULL){return;}if(L->datax){pL;LL->next;;free(p);del(L,x);}else{del(L->next,x);} } 时间复杂度为O(n)

算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 解题思路: 双指针…

重置密码之后无法ssh登录

背景描述 我这边有个服务器S,我从ServerA可以ssh上去,但是我从堡垒机B无法ssh上去;一开始以为是密码问题,手动重置密码,但是依然无法登录进去;一直提示密码错误;改了好几次密码都不行 问题原因…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述: Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

60*13薪,外包到新疆...去吗?

大家好,我是白露呀。 今天我在牛客上看到一篇帖子,一位网友说自己收到一个 offer ,薪资很高:60k*13,大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐,他拿不定主意,就在牛客上发了这个…

【无标题】基于GIS、Python机器学习技术的地质灾害风险评价、易发性分析与信息化建库及灾后重建中的实践技术

理解地质灾害形成机理与成灾模式;从空间数据处理、信息化指标空间数据库构建、致灾因子提取,空间分析、危险性评价与制图分析等方面掌握GIS在灾害危险性评价中的方法;运用地质灾害危险性评价原理和技术方法 原文链接:基于GIS、Py…

GitLab使用记录

GitLab 文章目录 1. 常用命令1.1 配置邮箱 用户名1.2 查看配置1.3 基本语法 2. 连接gitlab3. 直接拉去项目 1. 常用命令 1.1 配置邮箱 用户名 git config --global user.name ShangzheChen git config --global user.email 735511377qq.com1.2 查看配置 cat ~/.gitconfig这…

学习笔记:IEEE 1003.13-2003(POSIX实时与嵌入式规范)

一、文档 在线参考: IEEE 1003.13-2003 免费下载Draft 版本(pdf):IEEE Std. 1003.13 二、概念 1、POSIX标准 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX&a…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库,它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架,用于开发图形用户界面(GUI&…

智慧工厂管理系统

随着科技的飞速发展,传统工厂正经历着一场前所未有的变革。在这个以智能化、信息化为主导的新时代,HiWoo Cloud平台以其卓越的智慧工厂管理系统,成为了众多企业转型升级的首选工具。今天,就让我们一起走进HiWoo Cloud的世界&#…

vue3实现电子签名的方法

vue3实现电子签名且对电子签名可进行修改画笔粗细、画笔颜色、撤销、清屏、保存等功能。 实现效果&#xff1a;查看源码 第一种&#xff1a;通过canvas <div class"signaturePad-Box w100 h100 flex-center"><el-space class"mb10" size"…

【牛客】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…