软件测试中,pytest 运行完成后,如何自动发送邮件?
回答重点
在软件测试中,我们可以利用 pytest
和邮件发送库(例如 smtplib
)结合,实现 pytest 运行完成后自动发送邮件的功能。主要思路是通过 pytest
的钩子函数 pytest_terminal_summary
来检测测试结果是否有错误或故障,然后利用 Python 的 smtplib
库编写发送邮件的逻辑。
具体步骤如下:
1)安装 pytest,如果还没有安装的话:
pip install pytest
2)创建一个 conftest.py
文件,定义 pytest_terminal_summary
钩子函数,同时设置发送邮件的功能。下面是一个基本的实现示例:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef pytest_terminal_summary(terminalreporter, exitstatus, config):total = terminalreporter._numcollectedpassed = len(terminalreporter.stats.get('passed', []))failed = len(terminalreporter.stats.get('failed', []))errors = len(terminalreporter.stats.get('error', []))skipped = len(terminalreporter.stats.get('skipped', []))body = f"""Testing Summary:Total: {total}Passed: {passed}Failed: {failed}Errors: {errors}Skipped: {skipped}"""print(body) # 选装步骤:打印在终端上send_email(subject="Pytest Results", body=body)def send_email(subject, body):sender_email = "sender@example.com"receiver_email = "receiver@example.com"password = "your_password"msg = MIMEMultipart()msg['From'] = sender_emailmsg['To'] = receiver_emailmsg['Subject'] = subjectmsg.attach(MIMEText(body, 'plain'))with smtplib.SMTP_SSL("smtp.example.com", 465) as server:server.login(sender_email, password)server.sendmail(sender_email, receiver_email, msg.as_string())
3)在终端运行 pytest:
pytest
扩展知识
不仅限于 pytest 的 pytest_terminal_summary
,我们还可以使用其他钩子函数进行更细粒度的控制,如 pytest_sessionstart
和 pytest_sessionfinish
,它们分别在测试会话开始和结束时执行。
另外,需要注意到邮件发送过程中,可能会遇到各种安全和配置问题。例如,某些邮箱服务商会对第三方登录作限制,需要加上专用密码或调整安全设置。对于更加复杂邮件内容(如带附件、富文本),可以使用 MIMEImage
, MIMEApplication
等。
我们也可以利用 pytest 插件如 pytest-html
生成测试报告,并将生成的 HTML 报告作为附件发送。在企业环境下,这样做会使得报告更直观,方便大家查看和分析。