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

领取资料,咨询答疑,请➕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

相关推荐

  1. Pytest中的钩子函数

    2024-05-16 04:28:03       25 阅读
  2. pytest钩子函数的使用

    2024-05-16 04:28:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 04:28:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 04:28:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 04:28:03       82 阅读
  4. Python语言-面向对象

    2024-05-16 04:28:03       91 阅读

热门阅读

  1. 桥接模式举个例子简单理解

    2024-05-16 04:28:03       29 阅读
  2. js的跳转传参方式

    2024-05-16 04:28:03       31 阅读
  3. 一文了解Python跨包引用其他模块

    2024-05-16 04:28:03       31 阅读
  4. AWS简介

    AWS简介

    2024-05-16 04:28:03      32 阅读
  5. mqtt定时脚本

    2024-05-16 04:28:03       34 阅读
  6. Rust中的单元测试

    2024-05-16 04:28:03       33 阅读
  7. hssd数据集进一步简介

    2024-05-16 04:28:03       33 阅读
  8. Android 14.0 frameworks添加自定义服务

    2024-05-16 04:28:03       32 阅读
  9. 【Web后端】请求头

    2024-05-16 04:28:03       29 阅读
  10. 安卓手机APP开发__支持不同的平台版本

    2024-05-16 04:28:03       26 阅读
  11. Android OpenMAX(八)如何学习OMXNodeInstance

    2024-05-16 04:28:03       33 阅读