一点啰嗦:发送邮件python中有另一个支持的第三方库yagmail更轻量级,代码参考可移步至此:https://www.cnblogs.com/princessironfan/p/13220601.html

1.封装邮件发送模块,如下:

emailUtil.py

'''
email模块负责构造邮件内容
smtplib模块负责发送邮件
'''
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.header import Header from common.logger_handler import file_logger class sendEmail():
MAILHOST = "smtp.qq.com"
MAILUSER = "XXXX@qq.com"
MAILPWD = "授权码" def __init__(self, subject, content, reveiver, attachPath=""):
"""
:param subject: 邮件主题
:param content: 邮件正文
:param reveiver: 收件人
:param attachPath: 测试报告的路径
"""
self.subject = subject
self.content = content
self.receiver = reveiver
self.attachPath = attachPath # 写邮件,返回msg.as_string()
def writeEmail(self):
msg = MIMEMultipart()
# 邮件正文
msg.attach(MIMEText(self.content, 'plain', 'utf8'))
receiverName = ",".join(self.receiver)
msg['from'] = Header(self.MAILUSER, 'utf-8')
# msg['to'] = Header(",".join(self.receiver)).encode()
msg['to'] = Header(receiverName).encode()
# 邮件主题
msg['Subject'] = Header(self.subject, 'utf-8').encode()
# print("msg is:",msg)
# attachPath不为空则添加附件到邮件中
if self.attachPath != "":
with open(self.attachPath, 'rb') as f:
attach1 = MIMEText(f.read(), 'base64', 'utf-8')
attach1["Content-Type"] = 'application/octet-stream'
# filename自己命名
now_time = datetime.datetime.now().strftime('%Y_%m_%d %H_%M_%S')
attach1["Content-Disposition"] = 'attachment; filename="apiReport_{}.html"'.format(now_time)
msg.attach(attach1) return msg.as_string() # 发送邮件
def sendEmail(self):
receiver = ";".join(self.receiver)
try:
# 连接邮件服务器
server = smtplib.SMTP()
server.connect(self.MAILHOST, 25)
# 打开debug模式可以看到握手过程
# server.set_debuglevel(1)
# 登录,MAILPWD为邮件的授权码
server.login(self.MAILUSER, self.MAILPWD)
# 发送邮件
server.sendmail(self.MAILUSER, receiver, self.writeEmail())
server.quit()
file_logger.warning("Email send sucess.")
except Exception as e:
file_logger.warning("Email send fail.")
file_logger.warning(e)

2. 运行测试用例模块代码:

run_test.py

from common.config_path import config_path
from libs import HTMLTestRunnerNew
import unittest def all_ceses_suite():
test_loader = unittest.TestLoader() # 初始化
suite = test_loader.discover(config_path.cases_data) # 测试用例加载
return suite class SendEmail:
def __init__(self, module, email="null"):
self.module = module
self.email = email def send_to(self):
now_time = datetime.datetime.now().strftime('%Y_%m_%d %H_%M_%S') # 获取当前时间
file_path = os.path.join(config_path.report_path, "ApiReport_{}.html".format(now_time)) # 存放测试报告的文件夹
with open(file_path, "wb") as f:
runner = HTMLTestRunnerNew.HTMLTestRunner(f, verbosity=2,
title="接口自动化测试报告")
result = runner.run(self.module) totalNums = self.module.countTestCases()
passedNums = result.success_count
failedNums = result.failure_count
errorNums = result.error_count
skippedNums = len(result.skipped)
# 通过率,保留两位小数
passRate = round(passedNums * 100 / totalNums) print("本次构建一共运行:{}个用例,通过{}个,失败{}个,错误{}个,跳过{}个。通过率:{}%".format(totalNums, passedNums, failedNums, errorNums,
skippedNums, passRate))
if passRate != 100:
get_receiver=['xxxx@qq.com','xxxx@qq.com']
emailBody = "\n \t本次构建一共运行:{totalNums}个用例,通过{passedNums}个,失败{failedNums}个,错误{errorNums}个,跳过{skippedNums}个。通过率:{" \
"passRate}%.\n \t详细信息请查看附件。 "
content = emailBody.format(totalNums=totalNums, passedNums=passedNums, failedNums=failedNums,
errorNums=errorNums,
skippedNums=skippedNums, passRate=passRate)
subject = "接口测试" # 发送邮件 if len(get_receiver) > 0:
for i in get_receiver:
receiver = [i]
e = sendEmail(subject, content, receiver, attachPath=file_path)
e.sendEmail() if __name__ == '__main__':
# 所有用例
all = SendEmail(all_ceses_suite())
all.send_to()

做一棵小草,谁也撼动不了………

 

unittest+HtmlTestRunner+python接口自动化测试:用例失败发送邮件的更多相关文章

  1. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  2. Python接口自动化测试框架实战 从设计到开发

    第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...

  3. python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为

    python接口自动化测试二十七:密码MD5加密   ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...

  4. python接口自动化测试七:获取登录的Cookies

    python接口自动化测试七:获取登录的Cookies,并关联到下一个请求   获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cooki ...

  5. Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因

    Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因:接口响应数据中有&#

  6. 记录python接口自动化测试--利用unittest生成测试报告(第四目)

    前面介绍了是用unittest管理测试用例,这次看看如何生成html格式的测试报告 生成html格式的测试报告需要用到 HTMLTestRunner,在网上下载了一个HTMLTestRunner.py ...

  7. 记录python接口自动化测试--unittest框架基本应用(第二目)

    在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...

  8. Python接口自动化测试概念以及意义

    接口定义: 接口普遍有两种意思,一种是API(Application Program Interface),应用编程接口,它是一组定义.程序及协议的集合,通过API接口实现计算机软件之间的相互通信.而 ...

  9. python 接口自动化测试(三)

    1.WriteIni.py import ConfigParser cf = ConfigParser.ConfigParser() cf.add_section("PC_WSDL" ...

随机推荐

  1. MacOS常用命令行工具

    转自:https://blog.csdn.net/u014102846/article/details/77964493 https://ohmyz.sh/ https://github.com/ro ...

  2. 详解Spring DI循环依赖实现机制

    一个对象引用另一个对象递归注入属性即可实现后续的实例化,同时如果两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环即所谓的循环依赖怎么实现呢属性的互相注入呢? Spring bean生命周期具体 ...

  3. SpringBoot2.x设置文件上传文件的大小

    The field file exceeds its maximum permitted size of 1048576 bytes spring: # 设置文件上传文件大小 servlet: mul ...

  4. Docker配置Pytorch深度学习环境

    拉取镜像 $ docker pull pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel 查看本地已有镜像 $ docker images 创建容器 $ docke ...

  5. vmware 16 pro 安装macos

    VMware 16 安装 MAC OS 10.13 原版(详细图文教程)关于虚拟机安装苹果系统的教程网络上有很多, 有些适合自己, 有些则不适合(教程中的版本老旧或工具资源消失), 在安装成功后选择用 ...

  6. 记一次payload绕过电脑管家免杀

    一.msf命令提示符下generate命令生成1.首先可以使用show payloads命令查看所有的payload,然后使用use命令选中其中一个. 2.使用generate -h查看命令帮助 ge ...

  7. 选择自助式BI平台的六大标准

    ​自助式BI平台面向的是不具备IT背景的业务分析人员,与传统BI相比更灵活且易于使用,而且一定程度上摆脱对IT部门的大幅度依赖,代表性的自助BI工具厂商如Tableau.思迈特的Smartbi Eag ...

  8. BI工具入门:如何做关系数据源的连接?

    ​以往咱们分享的操作步骤都稍微有些复杂,大家跟着步骤操作也有些二丈摸不着头脑,看来简单的操作步骤和功能概念还是有必要普及的,那今天就来说一点简单的入门操作知识,以Smartbi为例子,跟大家说说BI工 ...

  9. C++ 派生类函数重载与虚函数继承详解

    目录 一.作用域与名字查找 1.作用域的嵌套 2.在编译时进行名字查找 3.名字冲突与继承 4.通过作用域运算符来使用隐藏的成员 二.同名函数隐藏与虚函数覆盖 1.几种必须区分的情况 2.一个更复杂的 ...

  10. 【windows 操作系统】什么是窗口?|按钮也是窗口

    起因 在看操作系统消息机制的时候,看到一句化:全局消息队列把消息发送到窗口所在的线程消息队列.突然就怀疑起了窗口的意思.于是就有这边基类. 文章来源:https://docs.microsoft.co ...