pytest教程-39-钩子函数-pytest_runtest_setup

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

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

pytest_runtest_setup 钩子函数在每个测试用例的 setup 阶段被调用。这个钩子可以用来执行测试用例的前置准备,例如创建测试数据、设置测试环境等。以下是如何使用这个钩子函数的具体方法和代码示例:

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

# conftest.py

import pytest
import logging

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

# 假设我们有一个函数来创建测试数据
def create_test_data():
    # 这里模拟创建一些测试数据
    return {"key1": "value1", "key2": "value2"}

def pytest_runtest_setup(item):
    # 在测试用例执行前执行的代码
    logging.info(f"Setting up for test: {item.name}")
    
    # 创建测试数据
    test_data = create_test_data()
    
    # 将测试数据作为属性添加到 item 对象上,以便在测试用例中使用
    item.test_data = test_data
    
    # 执行其他必要的设置操作,例如初始化数据库连接等
    # ...

    # 如果设置过程中出现错误,可以使用 pytest.skip 或 pytest.xfail 来处理
    # ...

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

在这个示例中,我们首先设置了日志系统,以便在测试过程中记录重要信息。然后,我们定义了一个 create_test_data 函数来模拟创建测试数据的过程。

pytest_runtest_setup 钩子函数中,我们在每个测试用例执行前调用 create_test_data 函数,并创建测试数据。然后,我们将这些测试数据作为属性添加到 item 对象上,这样在测试用例中就可以通过 item.test_data 访问这些数据。

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

让我们通过一个更复杂的示例来展示 pytest_runtest_setup 钩子函数的使用方法。在这个示例中,我们将模拟一个场景,其中我们需要在每个测试用例执行前设置一个复杂的测试环境,包括初始化数据库连接、创建测试数据、配置日志记录器等。我们还将处理可能出现的异常,并在测试用例执行失败时记录详细的错误信息。

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

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

    # 创建测试数据
    try:
        test_data = {
            "key1": "value1",
            "key2": "value2"
        }
        item.test_data = test_data
        logging.info("Test data created.")
    except Exception as e:
        logging.error(f"Failed to create test data for test: {item.name} - {e}")
        # 如果测试数据创建失败,标记测试用例为预期失败
        pytest.xfail(f"Test data creation failed for test: {item.name} - {e}")
        return True  # 阻止其他钩子函数执行

    # 如果所有设置操作都成功,继续执行测试用例
    return False  # 允许其他钩子函数执行

# 在测试用例执行后执行的代码
def pytest_runtest_teardown(item, nextitem):
    # 在这里执行测试用例执行后的清理工作
    if 'test_data' in item:
        del item.test_data  # 清理测试数据
    if db_connection:
        try:
            execute_query(db_connection, "DROP TABLE test_table")
            logging.info("Test table dropped.")
        except Exception as e:
            logging.error(f"Failed to drop test table - {e}")
        finally:
            db_connection.close()  # 关闭数据库连接
            logging.info("Database connection closed.")

在这个示例中,我们在 pytest_runtest_setup 钩子函数中首先配置了日志记录器,然后尝试初始化数据库连接并创建一个测试表。如果数据库初始化失败,我们使用 pytest.skip 跳过当前测试用例。如果测试数据创建失败,我们使用 pytest.xfail 标记测试用例为预期失败。

我们还定义了一个 pytest_runtest_teardown 钩子函数来执行测试用例执行后的清理工作,包括删除测试表和关闭数据库连接。

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

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

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

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

相关文章

43.WEB渗透测试-信息收集-域名、指纹收集(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:42.WEB渗透测试-信息收集-域名、指纹收集(4) web-架构资产收集&a…

手动配置dns后网速变慢

之前因为自动的dns能上qq但打不开网页,就手动设置了一个,结果近些天时不时出现网页图片加载慢的问题,影响到我看美女图片了,是可忍熟不可忍 测了下网速,很快,下载上传都是三位数的,那显然不是网…

文本转图表的AI工具-Chart-GPT

Chart-GPT Chart-GPT一款基于 GPT 实现的开源工具,可在几秒内,将文本快速转换为各种图表。用户只需在输入字段中输入数据说明和所需的图表类型,Chart-GPT的后台生成器即可建出多种类型的图表,包括条形图、折线图、组合图、散点图、…

19.删除链表的倒数第n个结点

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass :是骡子是马,拉出来溜溜 为什么要研究大模型的评测? 百家争鸣,百花齐放。 首先,研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

Material Studio 计算分子静电力、电荷密度以及差分电荷密度

1.先打开Material Studio导入要计算的分子cif文件或者mol文件,直接Flie-Import 2.高斯几何优化一下结构,参数按照我的设置就行,一般通用,后面出问题再调整 3.点完Run后会跳出很多计算过程,不用管,等他计算完…

类加载器ClassLoad-jdk1.8

类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类(JDK8)3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…

面试集中营—JVM篇

一、JVM内存模型 线程独占:栈,本地方法栈,程序计数器; 线程共享:堆,方法区 虚拟机栈:线程私有的,线程执行方法是会创建一个栈阵,用来存储局部变量表,操作栈,…

echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source391a8dc379e0da60c77490e3221f097a 课程源码 国内echarts镜像站:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 echarts图表集&…

《QT实用小工具·五十三》会跑走的按钮

1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮: 两个按钮,一个为普通按钮,另一个为会跑走的按钮 鼠标移到上面时,立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法,实际开发中,我们通过使用 path 模块来得到绝对路径,避免因为相对路径带来的找不到资源的问题。 具体来说:Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相…

成人职场英语口语柯桥外语培训之Big deal不是“大事”!别再翻译错啦!

关于deal, 其实有很多容易被人误解的表达, 小编今天就来给大家一一盘点~ 1, deal n. deal 作名词的时候意思是“交易;买卖”。 ❖ She got a new car for $1000! That was really a good deal! 她一千美金买了辆车!真是158575…

Xshell生成ssh密钥及使用

目录 1. 概述2. 环境3. 步骤3.1 生成密钥3.2 部署密钥3.3 使用密钥 1. 概述 使用Xshell软件生成ssh秘钥,正常连接服务器。 2. 环境 Xshell 6 3. 步骤 3.1 生成密钥 1. 打开Xshell --> 工具 --> 新建用户密钥生成向导 2. 选择密钥类型,建议…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

【智能优化算法】金枪鱼群优化(Tuna Swarm Optimization,TSO)

金枪鱼群优化(Tuna Swarm Optimization,TSO)是期刊“Computational Intelligence and Neuroscience”(IF:1.8)的2021年智能优化算法 01.引言 金枪鱼群优化(Tuna Swarm Optimization,TSO)的主要…

贪吃蛇小游戏(c语言)

1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 (上、下、左、右方键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…

Linux搭建http发布yum源

1、搭建http源yum仓库 (1)在yum仓库服务端安装httpd yum -y install httpd (2)修改配置文件 我们httpd 中默认提供web 界面的位置是我们/var/www/html 目录,如果我们yum 源想指定目录,就需要修改蓝框2处…

【第6节课笔记】LagentAgentLego

Lagent 最中间部分的是LLM,即为大语言模型模块,他可以思考planning和调用什么action,再将其转发给动作执行器action executer执行。 支持的工具如下: Arxiv 搜索 Bing 地图 Google 学术搜索 Google 搜索 交互式 IPython 解释器 IP…

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

本章节主要讲解如何获取灰度传感器值以及如何使用灰度传感器循迹 灰度传感器简介 灰度传感器如图 1 所示: 灰度传感器 使用一对抗干扰较强的光电传感器,其中发射管的光源采用高亮白色聚光 LED,发射管端发出的光线通过不同环境背景的反射之…

软件系统安全设计规范(word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件资料清单列表部分文档…