pytest教程-47-钩子函数-pytest_sessionfinish

news2024/9/22 13:35:53

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

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

pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用,无论测试是成功还是失败。这个钩子可以用来执行一些清理工作,比如关闭数据库连接、删除临时文件、发送测试报告等。

以下是一个具体的使用示例,我们将在测试会话结束时关闭之前打开的数据库连接,并打印一条结束消息。

首先,确保你的 conftest.py 文件中已经定义了 DatabaseConnection 类和相关的初始化逻辑,如前面示例所示。

然后,在 conftest.py 文件中添加 pytest_sessionfinish 钩子函数:

# conftest.py

# ... 其他代码 ...

# 假设 session 对象在 pytest_sessionstart 钩子中被赋值给了 _test_data_service
# 我们需要在 pytest_sessionfinish 钩子中访问它以执行清理工作

def pytest_sessionfinish(session):
    # 打印测试会话结束的消息
    logging.info("Session is finishing...")

    # 关闭数据库连接
    if hasattr(session, '_test_data_service') and session._test_data_service:
        # 假设 session._test_data_service 是我们在 pytest_sessionstart 中创建的
        # 包含了数据库连接的实例
        session._test_data_service.close()

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

    # 打印完成消息
    logging.info("Session has finished.")

在这个示例中,我们在 pytest_sessionfinish 钩子中检查 session 对象是否有一个名为 _test_data_service 的属性。这个属性是在 pytest_sessionstart 钩子中设置的,它包含了我们在测试会话开始时创建的数据库连接实例。然后,我们调用 close 方法来关闭数据库连接。

请注意,这个示例假设你在 pytest_sessionstart 钩子中已经创建了一个数据库连接,并且将其保存在了 session 对象的 _test_data_service 属性中。如果你的实现方式不同,你可能需要相应地调整这个钩子函数。

现在,当你运行 Pytest 测试时,pytest_sessionfinish 钩子将在测试会话结束时被调用,执行数据库连接的关闭操作。这样,你就可以确保所有的资源在使用后都被正确地清理。

好的,让我们创建一个更复杂的 pytest_sessionfinish 钩子示例。在这个示例中,我们将执行以下操作:

  1. 关闭之前打开的数据库连接。
  2. 清理测试期间创建的临时文件。
  3. 发送测试结果的电子邮件通知。
  4. 打印一条详细的结束消息,包括测试执行的总时间。

首先,确保你的 conftest.py 文件中已经定义了 DatabaseConnection 类和相关的初始化逻辑,如前面的示例所示。我们还将使用 smtplib 发送电子邮件通知,所以请确保你已经安装了 pytest-xdist(如果你打算并行运行测试)。

然后,在 conftest.py 文件中添加 pytest_sessionfinish 钩子函数:

# conftest.py

import logging
import os
import shutil
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import time

# ... 其他代码 ...

# 假设我们有一个全局变量来跟踪测试开始时间
start_time = time.time()

def pytest_sessionfinish(session):
    # 计算并打印测试执行的总时间
    end_time = time.time()
    elapsed_time = end_time - start_time
    logging.info(f"Session finished. Total time: {elapsed_time:.2f} seconds")

    # 关闭数据库连接
    if hasattr(session, '_test_data_service') and session._test_data_service:
        session._test_data_service.close()

    # 清理临时文件
    temp_dir = 'temp_test_files'
    if os.path.exists(temp_dir):
        shutil.rmtree(temp_dir)
        logging.info(f"Removed temporary directory: {temp_dir}")

    # 发送测试结果的电子邮件通知
    def send_email(subject, body):
        # 设置你的电子邮件服务器和账户信息
        sender_email = "your_email@example.com"
        receiver_email = "receiver@example.com"
        password = "your_password"
        smtp_server = "smtp.example.com"
        smtp_port = 587

        # 创建邮件内容
        msg = MIMEMultipart()
        msg['From'] = sender_email
        msg['To'] = receiver_email
        msg['Subject'] = subject
        msg.attach(MIMEText(body, 'plain'))

        # 发送邮件
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, msg.as_string())
        server.quit()

    # 假设我们有一个函数来获取测试结果的摘要
    test_results_summary = get_test_results_summary()  # 这个函数需要你自己实现
    subject = "Test Session Results"
    body = f"Test session has finished.\n\n{test_results_summary}"
    send_email(subject, body)

    # 打印完成消息
    logging.info("Session cleanup completed.")

在这个示例中,我们首先计算并记录了测试执行的总时间。然后,我们关闭了在 pytest_sessionstart 钩子中创建的数据库连接,并清理了测试期间创建的临时文件。我们还创建了一个 send_email 函数来发送测试结果的电子邮件通知。这个函数使用了 smtplib 库来连接到 SMTP 服务器并发送邮件。最后,我们调用 send_email 函数并传递测试结果的摘要。

请注意,这个示例中的 get_test_results_summary 函数是一个假设的函数,你需要根据你的测试框架和需求来实现它。此外,你需要提供有效的电子邮件服务器信息、账户信息和接收者邮箱地址。

现在,当你运行 Pytest 测试时,pytest_sessionfinish 钩子将在测试会话结束时被调用,执行上述的清理和通知工作。这样,你就可以确保所有的资源在使用后都被正确地清理,并且测试结果能够及时通知到相关人员。

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

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

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

相关文章

254 基于matlab的钢筋混凝土非线性分析

基于matlab的钢筋混凝土非线性分析,根据梁本构关系,然后进行非线性分析,绘制弯矩-曲率曲线。可设置梁的截面尺寸、混凝土本构,钢筋截面面积等相关参数,程序已调通,可直接运行。 254 钢筋混凝土非线性分析 弯…

那些年我与c++的叫板(一)--string类自实现

引子:我们学习了c中的string类,那我们能不能像以前数据结构一样自己实现string类呢?以下是cplusplus下的string类,我们参考参考! 废话不多说,直接代码实现:(注意函数之间的复用&…

公司邮箱是什么?公司邮箱和个人邮箱有什么不同?

公司邮箱是企业用来收发邮件的专业版电子邮箱,不同于个人邮箱的简单功能和有限的存储空间,公司邮箱的功能更加丰富,能够满足企业的日常办公和协作需求。本文将为您详细讲解公司邮箱和个人邮箱的区别,以供您选择更适合自己的邮箱类…

数学建模——农村公交与异构无人机协同配送优化

目录 1.题目 2.问题1 1. 问题建模 输入数据 ​编辑 2. 算法选择 3.数据导入 3.模型构建 1. 距离计算 2. 优化模型 具体步骤 进一步优化 1. 重新定义问题 2. 变量定义 3. 优化目标 具体步骤 再进一步优化 具体实现步骤 1. 计算距离矩阵 2. 变量定义 3. 约束…

【C++】:string类的基本使用

目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…

UIKit之图片浏览器

功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…

【JavaScript】WeakMap 和 WeakSet

Map Map 用于存储键值对。 添加属性: 使用 Map 的 set() 方法可以向 Map 对象中添加键值对。例如: const map new Map(); map.set(key1, value1); map.set(key2, value2);通过二维数组快速创建 map 键值对。 let arr [[1, 2],[2, 3],[3, 4]]let map …

window10下安装ubuntu系统以及docker使用

window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

docker-java 操作docker

部署docker 10分钟学会Docker的安装和使用_docker安装-CSDN博客文章浏览阅读2.5w次&#xff0c;点赞44次&#xff0c;收藏279次。文章目录Docker简介Docker安装Windows安装Linux安装CentOS安装Ubuntu安装最近花了些时间学习docker技术相关&#xff0c;在此做一些总结&#xff0…

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…

【传知代码】VRT: 关于视频修复的模型(论文复现)

前言&#xff1a;随着数字媒体技术的普及&#xff0c;制作和传播视频内容变得日益普遍。但是&#xff0c;视频中由于多种因素&#xff0c;例如传输、存储和录制设备等&#xff0c;经常出现质量上的问题&#xff0c;如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…

【JAVA】嵌入式软件工程师-2025校招必备-详细整理

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

困惑点记录

【第十章 总结思考】CIM之我见 - 知乎

STK中的光照计算模型

本文简要阐述STK中光照计算的模型。 在航天任务中&#xff0c;通常需要分析地面站、飞行器在一定时间内的光照情况&#xff0c;具体包括&#xff1a; 地面站处在光照区和阴影区的具体时间范围&#xff1b;考虑地形遮挡后&#xff0c;地面站的光照区和阴影区的变化情况&#x…

解决kali Linux安装后如何将语言修改为中文

开启虚拟机 用root用户进入终端 进入终端执行dpkg-reconfigure locales命令 选择en_US.UTF-8 UTF-8选项&#xff0c;按空格键将其取消。 选择zh_CN.UTF-8 UTP-8&#xff0c;按空格选择&#xff0c;按tab键选择ok。 选择zh_CN.UTF-8字符编码&#xff0c;按tab键选择ok&#xff0…

【漏洞复现】Secnet-智能路由系统 actpt_5g.data信息泄露

0x01 产品简介 Secnet安网智能AC管理系统是广州安网通信技术有限公司(简称“安网通信”)的无线AP管理系统 0x02 漏洞描述 Secnet智能路由系统 acipt 5g.data 接口存在信息泄露漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞获取系统账户名密码等重要凭据&#xff…

社区服务用工具建立与居民的强关系

在数字化时代的浪潮下&#xff0c;社区服务不再局限于传统的面对面交流模式&#xff0c;而是借助互联网医疗健康服务应用&#xff0c;尤其是智慧康养服务平台&#xff0c;构建起了与居民之间更为紧密、便捷的联系。这种新型的社区服务模式&#xff0c;不仅提升了服务效率&#…