【unittest单元测试框架】(8)用 yagmail 发送邮件,整合自动发送邮件功能
用 yagmail 发送邮件,整合自动发送邮件功能
自动发送邮件功能是自动化测试项目的重要需求之一,当自动化测试用例运行完成之后,可自动向相关人员的邮箱发送测试报告。严格来讲,这里介绍的发送邮件模块并不属于 unittest 的扩展,不过,我们仍然可以将它与 unittest 结合使用。 SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,是一组由源地址到目的地址传送邮件的规则,可以控制信件的中转方式。Python 的 smtplib 模块提供了简单的 API用来实现发送邮件功能,它对 SMTP 进行了简单的封装。 在实现发送邮件功能之前,需要补充一个基础知识。在给其他人发送邮件之前,首先需要有一个自己的邮箱。通过浏览器打开邮箱网址(如 www.126.com),或打开邮箱客户端(如 Foxmail),登录自己的邮箱账号。如果是邮箱客户端,则还需要配置邮箱服务器地址(如 smtp.126.com)。然后填写收件人地址、邮件的主题和正文,以及添加附件等。即便通过 Python 实现发送邮件功能,也需要设置这些信息。 python自带的方法请参考:https://www.cnblogs.com/yinzuopu/p/15544559.htmlyagmail 是 Python 的一个第三方库,可以让我们以非常简单的方法实现自动发送邮件功能。
GitHub 项目地址: https://github.com/kootenpv/yagmail 通过 pip 命令安装:pip install yagmail项目文档提供了的简单发送邮件的例子:
# -*- coding:utf-8 -*- # filename: test_text.py # author: hello,yin # date: 2021/11/17 13:44 import yagmail sender = "zuopuyin@126.com" passwd = "ADQGQOUKUDVWKRS" receiver = "zuopuyin2@126.com" smtp_host = "smtp.126.com" # 连接邮箱服务器 mail_connect = yagmail.SMTP(user=sender, password=passwd, host=smtp_host) subject = "这是主题:有梦想,能坚持,永远积极向上~" contents = "这是正文:hello.yin,要加油呀~" mail_connect.send(receiver, subject, contents)
发送结果展示:
如果想给多个用户发送邮件,那么只需把收件人放到一个 list 中即可:
# 发送邮件 yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)如果想发送带附件的邮件,那么只需指定本地附件的路径即可:
# 发送邮件 yag.send('aa@126.com', 'subject', contents, ["d://log.txt","d://baidu_img.jpg"])
另外,还可以通过 list 指定多个附件。yagmail 库极大地简化了发送邮件的代码。
在学习了如何用 Python 实现发送邮件之后,现在只需将功能集成到自动化测试项目中即可。打开 run_tests.py 文件,修改代码如下。
# -*- coding:utf-8 -*- # filename: run_test.py # author: hello.yin # date: 2021/11/17 import time import yagmail import unittest from HTMLTestRunner import HTMLTestRunner # 报测试报告作为附件发送到指定邮箱 def send_mail(report): yag = yagmail.SMTP(user="zuopuyin@126.com", password="ADQGQOUKUDVWRIS", host="smtp.126.com") subject = "主题:这是一封自动化测试报告" contents = "您好,正文请参考附件!" yag.send("zuopuyin2@126.com", subject, contents, report) print("邮件发送成功!") if __name__ == "__main__": test_dir = "./test_case" now_time = time.strftime("%Y%m%d%H%M%S") html_report = "./test_report/" + now_time + "_result.html" fp = open(html_report, "wb") suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") runner = HTMLTestRunner(stream=fp, title="baidu_search test", description="author:hello yin") runner.run(suit) fp.close() send_mail(html_report) # 发送报告执行结果:
C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/base_practice/ddt_test/run_test.py .....FFFFFFFFF.<_io.TextIOWrapper name='整个程序的执行过程可以分为两部分: (1)定义测试报告文件,并赋值给变量 html_report,通过 HTMLTestRunner 运行测试用例,将结果写入文件后关闭。 (2)调用 send_mail()函数,并传入 html_report 文件。在 send_mail()函数中,把测试报告作为邮件的附件发送到指定邮箱。 为什么不把测试报告的内容读取出来作为邮件正文发送呢?因为 HTMLTestRunner 报告在展示时引用了 Bootstrap 样式库,当作为邮件正文“写死”在邮件中时,会导致样式丢失,所以作为附件发送更为合适。附件中的自动化测试报告如图所示:' mode='w' encoding='GBK'> Time Elapsed: 0:01:36.213218 邮件发送成功! Process finished with exit code 0