【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.html

  yagmail 是 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='<stderr>' mode='w' encoding='GBK'> 
Time Elapsed: 0:01:36.213218
邮件发送成功!

Process finished with exit code 0
整个程序的执行过程可以分为两部分:
(1)定义测试报告文件,并赋值给变量 html_report,通过 HTMLTestRunner 运行测试用例,将结果写入文件后关闭。
(2)调用 send_mail()函数,并传入 html_report 文件。在 send_mail()函数中,把测试报告作为邮件的附件发送到指定邮箱。
   为什么不把测试报告的内容读取出来作为邮件正文发送呢?因为 HTMLTestRunner 报告在展示时引用了 Bootstrap 样式库,当作为邮件正文“写死”在邮件中时,会导致样式丢失,所以作为附件发送更为合适。附件中的自动化测试报告如图所示:
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值