pytest教程-38-钩子函数-pytest_runtest_protocol

news2024/10/6 0:26:51

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

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

pytest_runtest_protocol 钩子函数在 pytest 运行单个测试用例之前和之后被调用。这个钩子可以用来执行测试用例的前置和后置处理,例如设置测试环境、执行测试前的准备工作、清理测试后的状态等。以下是如何使用这个钩子函数的具体方法和代码示例:

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

# conftest.py

import pytest

def pytest_runtest_protocol(item, nextitem):
    # 在测试用例执行前执行的代码
    if item.parent.name == "my_test_suite":  # 假设我们只对特定测试套件执行操作
        print(f"Setting up for test: {item.name}")
        # 执行测试前的准备工作,例如初始化数据库、创建临时文件等
        # ...

    # 在测试用例执行后执行的代码
    if nextitem is not None:
        if nextitem.parent.name == "my_test_suite":
            print(f"Tearing down after test: {nextitem.name}")
            # 执行测试后的清理工作,例如关闭数据库连接、删除临时文件等
            # ...

    # 如果你想在测试失败时执行特定的操作,可以使用 pytest_runtest_teardown 钩子
    # ...

    # 返回值:如果设置为 True,则 pytest 将不会调用其他实现的钩子函数
    return False

在这个示例中,我们首先检查当前测试用例是否属于特定的测试套件(在这个例子中是 my_test_suite)。如果是,我们在测试用例执行前打印一条设置信息,并执行一些准备工作。同样,如果 nextitem(下一个测试用例)存在,并且也属于相同的测试套件,我们在测试用例执行后执行清理工作。

请注意,这个钩子函数的返回值是一个布尔值。如果返回 True,则 pytest 将不会调用其他实现的 pytest_runtest_protocol 钩子函数。在这个例子中,我们返回 False,这意味着 pytest 可以继续调用其他可能存在的钩子实现。

现在,当你运行测试时,pytest_runtest_protocol 钩子函数会在每个测试用例执行前后被调用,执行你定义的前置和后置处理代码。这为你提供了一个在测试用例执行前后执行自定义逻辑的机会。

我们再通过一个更复杂的示例来展示 pytest_runtest_protocol 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在每个测试用例执行前后进行数据库操作的模拟,以及在测试用例执行失败时记录错误信息。

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

# conftest.py

import pytest
import logging
from some_database_module import (  # 假设这是我们的数据库操作模块
    DatabaseConnection,
    execute_query,
    close_connection
)

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

# 假设我们有一个全局数据库连接对象
db_connection = None

def pytest_runtest_protocol(item, nextitem):
    global db_connection

    # 在测试用例执行前执行的代码
    setup_success = True
    try:
        print(f"Setting up for test: {item.name}")
        # 模拟数据库查询
        db_connection = DatabaseConnection()
        execute_query(db_connection, "SELECT * FROM test_table WHERE id=1")
    except Exception as e:
        logging.error(f"Failed to set up test: {item.name} - {e}")
        setup_success = False

    # 如果设置失败,跳过当前测试用例
    if not setup_success:
        pytest.skip(f"Skipping test {item.name} due to setup failure.")

    # 在测试用例执行后执行的代码
    if nextitem is not None:
        teardown_success = True
        try:
            print(f"Tearing down after test: {nextitem.name}")
            # 模拟数据库查询
            execute_query(db_connection, "SELECT * FROM test_table WHERE id=2")
            # 关闭数据库连接
            close_connection(db_connection)
            db_connection = None
        except Exception as e:
            logging.error(f"Failed to tear down test: {nextitem.name} - {e}")
            teardown_success = False

        # 如果清理失败,记录错误信息
        if not teardown_success:
            print(f"Teardown failed for test: {nextitem.name}. Error: {e}")

    # 返回值:如果设置为 True,则 pytest 将不会调用其他实现的钩子函数
    return False

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,我们定义了一个全局变量 db_connection 来模拟数据库连接。

pytest_runtest_protocol 钩子函数中,我们在测试用例执行前尝试建立数据库连接并执行一个查询。如果设置失败,我们使用 pytest.skip 跳过当前测试用例,并记录错误信息。

在测试用例执行后,我们尝试执行另一个查询并关闭数据库连接。如果清理失败,我们记录错误信息,但不会跳过任何测试用例,因为我们希望其他测试用例能够继续执行。

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

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

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

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

相关文章

不上班,我靠这5份赚钱副业养活了自己

在这个快节奏的社会里,很多人都在为生活奔波忙碌。今天,就让我来跟大家分享一下我的“躺平”秘籍吧! 这一个月来,我没有上班,但好在有副业养活自己。有时候,我真的觉得有一份自己喜欢的自媒体副业挺好的。…

开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制

参考文献: [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…

1688工厂货源API接口:用于商品采集、商品搜索、商品详情数据抓取

item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品(拍立淘)item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_password 获得淘口令…

独有病眼花,春风吹不落。 (二维坐标压缩成一个点,并查集)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 3 8 1 1 D 1 1 R 1 2 D 2 1 D 2 2 R 3 1 R 3 2 R 2 3 D 输出 8 思路: 根据题意,要求连接线段后,操作多少次,连接的线段闭合&…

在QEMU上运行OpenSBI+Linux+Rootfs

在QEMU上运行OpenSBILinuxRootfs 1 编译QEMU2 安装交叉编译工具3 编译OpenSBI4 编译Linux5 创建根文件系统5.1 编译busybox5.2 创建目录结构5.3 制作文件系统镜像5.3.1 创建 ext2 文件5.3.2 将目录结构拷贝进 ext2 文件5.3.3 取消挂载 6 运行OpenSBILinuxRootfs 本文所使用的版…

第二证券|集合竞价915到920能成交吗?

不能,买卖日9点15分到9点20分是集合竞价申报时刻,还没有发生集合竞价。 在这个时刻段内,投资者能够申报,也能够撤单,但这些挂单并不会立即成交。9:25时,系统会对一切收到的挂单进行一次性促成处理&#xf…

外网禅道配置

exportfs -avrf 修改代码,避免启动太慢:vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop

windows 双网卡同时接入内外网

在公司使用wifi接入使用桌面云,但是公司wifi不能上外网,查资料不方便,通过手机同时接入外网。 同一台电脑设置同时连接内外网(wifi或共享的网络)_win7电脑同时使用手机和usb网卡使用wifi-CSDN博客 route print查看当前…

SolidWorks进行热力学有限元分析二、模型装配

1.先打开软件,新建装配体 2.选中你要装配的零件,直接导入就行 3.鼠标点击左键直接先放进去 4.开始装配,点配合 5.选择你要接触的两个面,鼠标右键确定,然后把剩下的面对齐一下就行了 6.搞定

【C 数据结构-动态内存管理】4. 无用单元收集(垃圾回收机制)

文章目录 【 1. 问题描述与解决方法 】【 2. 中断回收机制 】 【 1. 问题描述与解决方法 】 问题描述 动态存储管理的运行机制可以概括为:当用户发出申请空间的请求后,系统向用户分配内存;用户运行结束释放存储空间后,系统回收内…

5月5日智渍洁对江苏某公司冷却塔清洗-智渍洁

简报:5月5日智渍洁对江苏某公司冷却塔清洗 5月5日智渍洁对江苏某公司冷却塔清洗 - 重庆智渍洁环保科技有限公司简报:5月5日智渍洁对江苏某公司冷却塔清洗https://www.zhizijie.com/hl/zixun/gongsi/236.html

Python Dash库:一个Web应用只需几行代码

大家好,在数据科学领域,数据可视化是将数据以图形化形式展示出来,帮助我们更直观地理解数据。Python中有一个非常流行的数据可视化库叫做Dash,Dash以其简洁、高效和强大的功能而闻名,它允许开发者快速构建交互式Web应用…

Vulnhub项目:NAPPING: 1.0.1

1、靶机介绍 靶机地址:Napping: 1.0.1 ~ VulnHub 2、渗透过程 老规矩,先探测,靶机ip:192.168.56.152 本机ip:192.168.56.146 来看一看靶机开放哪些端口,nmap一下 nmap -sS -sV -A -T5 192.168.56.152 开…

Zookeeper服务

一、什么是Zookeeper Zookeeper 是一个分布式应用程序的协调服务,它提供了一个高性能的分布式配置管理、分布式锁服务和分布式协调服务。它是 Apache 软件基金会的一个项目,被设计用来处理大规模的分布式系统中的一些关键问题。 Zookeeper的组成员关系&…

java10基础(this super关键字 重写 final关键字 多态 抽象类)

目录 一. this和super关键字 1. this关键字 2. super关键字 二. 重写 三. final关键字 四. 多态 五. 抽象类 1. 抽象方法 2. 抽象类 3. 面向抽象设计 一. this和super关键字 1. this关键字 this 当前对象的引用 this.属性 this.方法名() this() -- 调用构造函数 …

2024 AI中转计费平台系统源码

简介: 2024 AI中转计费平台系统源码 文件下载https://www.skpan.cn/CNZjzyC4txX 图片:

荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 3 4 2 .... ***. ..a. 输出 yes 思路: 根据题意,这里 1 s 可以移动多次,我们将每次可以移动避开雪的的位置存储起来,判断当…

运维开发工程师教程之MongoDB单机版设置

MongoDB单机版设置 一、创建虚拟机 在VMware Workstation软件中新建一个虚拟机,具体操作步骤如下: ①运行VMware Workstation软件,进入到主界面,单击“创建新的虚拟机”来创建新的虚拟机,如图3-1所示。 图3-1 VMware…

3D相机及应用

无论是2D相机和3D相机,在工业应用中都有着不可或缺的作用。3D相机与2D相机的最大区别在于,3D相机可以获取真实世界尺度下的3D信息,而2D相机只能获取像素尺度下的2D平面图像信息。通过3D相机得到的数据,我们可以还原出被测量物体的…

shell脚本脚本变量

shell脚本的概念: 1.讲要执行的命令按顺序保存到一个文本文件 2.给文件可执行权限 3.可以结合各种shell控制语句以完成更复杂的操作 linux中包含shell的文件有 [rootlocalhost ~]# cat /etc/shells /bin/sh #UNIX最初使用的 shell,已经被…