领取资料,咨询答疑,请➕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
钩子示例。在这个示例中,我们将执行以下操作:
- 关闭之前打开的数据库连接。
- 清理测试期间创建的临时文件。
- 发送测试结果的电子邮件通知。
- 打印一条详细的结束消息,包括测试执行的总时间。
首先,确保你的 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