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 random模块(获取随机数)常用方法和使用例子
May 13 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python中使用PIPE操作Linux管道
Feb 04 Python
python处理大数字的方法
May 27 Python
Python实现的爬虫功能代码
Jun 24 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
基于python实现计算两组数据P值
Jul 10 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 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学习之整理字符串
2011/04/17 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python中对list去重的多种方法
2014/09/18 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
一文读懂Python 枚举
2020/08/25 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
《诺贝尔》教学反思
2014/02/17 职场文书
服装发布会策划方案
2014/05/22 职场文书
五好关工委申报材料
2014/05/31 职场文书
活动总结报告怎么写
2014/07/03 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
工作态度怎么写
2015/06/25 职场文书