python自动发送测试报告邮件功能的实现


Posted in Python onJanuary 22, 2019

自动化发邮件功能也是自动化测试项目中的重要需求之一。在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果,把这种主动的且不及时的查看变成被动且及时的查收,就方便多了。

首先我们需要一份漂亮且通俗易懂的测试报告来展示自动化测试成果, HTMLTestRunnerpython 标准库 unittest 单元测试框架的一个扩展,它生成易于使用的HTML测试报告。

下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html

这个扩展非常简单,只有一个.py文件,选中后直接下载到本地即可。安装方法也很简单,将其复制到python的安装目录下即可。

windows:将下载的文件保存在../Python35/Lib目录下

Linux(ubuntu):以root身份将HTMLTestRunner.py复制到/usr/local/Python3.7/dist-packages/ 目录下

修改HTMLTestRunner

#第 94 行
import StringIo
修改为:
import io

#第 539 行
self.outputBuffer=StringIO.StringIO()
修改为:
self.outputBuffer=io.StringIO()

#第 631 行
print >>sys.stderr, 'nTime Elapsed: %s' % (self.stopTime-self.startTime)
修改为:
print(sys.stderr, 'nTime Elapsed: %s' % (self.stopTime-self.startTime))

#第 642 行
if not rmap.has_key(cls):
修改为:
if not cls in rmap:

#第 766 行
uo=o.decode('latin-1')
修改为:
uo=o

#第 772 行
ue=e.decode('latin-1')
修改为:
ue=e

生成HTML测试报告

from selenium import webdriver
import unittest
from HTMLTestRunner import HTMLTestRunner
class Baidu(unittest.TestCase):
 def setUp(self):
  self.driver=webdriver.Firefox()
  self.driver.implicitly_wait(10)
  self.base_url="https://www.baidu.com"
 
 def test_baidu_search(self):
  driver=self.driver
  driver.get(self.base_url)
  driver.find_element_by_id("kw").send_keys("HTMLTestRunner")
  driver.find_element_by_id("su").click()
 def tearDown(self):
  self.driver.quit()
if __name__=="__main__":
 testunit=unittest.TestSuite()
 testunit.addTest(Baidu("test_baidu_search"))
 #定义报告存放路径
 fp=open('./result.html','wb')
 #定义测试报告
 runner=HTMLTestRunner(
  stream=fp,
  title='百度搜索测试报告',
  description='用例执行情况:'
 )
 runner.run(testunit) # 运行测试用例
 fp.close() # 关闭报告文件

代码分析

首先,将HTMLTestRunner模块用import导入进来

其次,通过open()方法以二进制写模式打开当前目录下的result.html,如果没有,则自动创建该文件。

接着,调用HTMLTestRunner模块下的HTMLTestRunner类。stream指定测试报告文件,title用于定义测试报告的标题,description用于定义测试报告的副标题。

最后,通过HTMLTestRunner的run()方法来运行测试套件中所组装的测试用例。最后通过close()关闭测试报告文件。

python自动发送测试报告邮件功能的实现

自动发邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
#发送邮箱服务器
smtpserver='smtp.**.com'
#发送邮箱用户/密码
user='********@**.com'
password='********'(授权码)
#发送邮箱
sender='********@**.com'
#接收邮箱
receiver='*******@**.com'
#发送邮件主题
subject='python email'
#编写html类型的邮件正文
msg=MIMEText('<HTML><H1>你好</H1></HTML>','html','utf8')
msg['Subject']=Header(subject,'utf-8')
#连接发送邮件
smtp=smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(user,password)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()

发送带附件的邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
#发送邮箱服务器
smtpserver='smtp.**.com'
#发送邮箱用户/密码
user='********@**.com'
password='********'(授权码)
#发送邮箱
sender='********@**.com'
#接收邮箱
receiver='*******@**.com'
#发送邮件主题
subject='python email'
#发送的附件
sendfile=open('D:\\test.txt','rb').read()
att=MIMEText(sendfile,'base64','utf-8')
att["Content-Type"]='application/octet-stram'
att["content-Disposition"]='attachment;filename="test.txt"'
msgRoot=MIMEMultipart('related')
msgRoot['Subject']=subject
msgRoot.attach(att)
#连接发送邮件
smtp=smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(user,password)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()

整合自动发邮件功能

解决了前面的问题后,现在就可以将自动发邮件功能集成到自动化测试项目中了。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.text import MIMEText
import unittest
import time
import os
#定义发送邮件
def send_mail(file_new):
 f=open(file_new,'rb')
 mail_body=f.read()
 f.close()
 msg=MIMEText(mail_body,'html','utf-8')
 msg['Subject']=Header("自动化测试报告",'utf-8')
 smtp=smtplib.SMTP()
 smtp.connect("******.com")
 smtp.login(****@**.com,*******)
 smtp.sendmail(****@**.com,****@**.com,msg.as_string())
 smtp.quit()
 print('email has send out !')
#查找测试报告目录,找到最新生成的测试报告文件
def new_report(testreport):
 lists=os.listdir(testreport)
 lists.sort(key=lambda fn: os.path.getmtime(testreport+"\\"+fn))
 file_new=os.path.join(testreport,lists[-1])
 print(file_new)
 return file_now
if __name__=='__main__':
 test_dir='D:\\testpro\\test_case'
 test_report='D:\\testpro\\report'
 discover=unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py')
 now=time.strftime("%Y-%M-%D_%H_%M_%S")
 filename=test_report+'\\'+now+'result.html'
 fp=open(filename,'wb')
 runner=HTMLTestRunner(stream=fp,title='测试报告',description='用例执行情况:')
 runner.run(discover)
 fp.close()
 new_report=new_report(test_report)
 send_mail(new_report)

整个程序的执行过程可以分为三个步骤:

  • 通过unittest框架的discover()找到匹配测试用例。由HTMLTestRunner的run()方法执行测试用例并生成最新的测试报告。
  • 调用new_report()函数找到测试报告目录(report)下最新生成的测试报告,返回测试报告的路径。
  • 将得到的最新测试报告的完整路径传给send_mail()函数,实现发邮件功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的Descriptor描述符学习教程
Jun 02 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
Python中实现switch功能实例解析
Jan 11 Python
Python实现的栈(Stack)
Jan 26 Python
Python星号*与**用法分析
Feb 02 Python
Python何时应该使用Lambda函数
Jul 02 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python网络编程之五子棋游戏
May 14 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
python3去掉string中的标点符号方法
Jan 22 #Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 #Python
python3.4爬虫demo
Jan 22 #Python
使用Template格式化Python字符串的方法
Jan 22 #Python
python实现公司年会抽奖程序
Jan 22 #Python
对python函数签名的方法详解
Jan 22 #Python
python实现大转盘抽奖效果
Jan 22 #Python
You might like
PHP-redis中文文档介绍
2013/02/07 PHP
如何判断php数组的维度
2013/06/10 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript web页面刷新的方法收集
2009/07/02 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
JS回调函数深入理解
2019/10/16 Javascript
Python 字典dict使用介绍
2014/11/30 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python实现快递价格查询系统
2020/03/03 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
python中的时区问题
2021/01/14 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
服装电子商务创业计划书
2014/01/30 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
财务务虚会发言材料
2014/10/20 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
python库sklearn常用操作
2021/08/23 Python
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
HTML中的表格元素介绍
2022/02/28 HTML / CSS