3.9 run_main.py源码(兼容python2和3)
3.9 run_main.py源码(兼容python2和3)

以下代码在python2和python3上都跑通过,python3只需注释掉上面红色框框区域代码就行(最后一步发送邮箱代码,我注释掉了)。

# coding=utf-8
import unittest
import time
import HTMLTestRunner
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import os
####下面三行代码python2报告出现乱码时候可以加上####
import sys
reload(sys)
sys.setdefaultencoding('utf8') # 这个是优化版执行所有用例并发送报告,分四个步骤
# 第一步加载用例
# 第二步执行用例
# 第三步获取最新测试报告
# 第四步发送邮箱 (这一步不想执行的话,可以注释掉最后面那个函数就行)
def add_case(case_path, rule):
'''加载所有的测试用例'''
testunit = unittest.TestSuite()
# 定义discover方法的参数
discover = unittest.defaultTestLoader.discover(case_path,
pattern=rule,
top_level_dir=None)
# discover方法筛选出来的用例,循环添加到测试套件中
# for test_suite in discover:
# for test_case in test_suite:
# testunit.addTests(test_case)
# print testunit
testunit.addTests(discover) # 直接加载discover
print(testunit)
return testunit
def run_case(all_case, report_path):
'''执行所有的用例, 并把结果写入测试报告'''
now = time.strftime("%Y_%m_%d %H_%M_%S")
report_abspath = os.path.join(report_path, now+"result.html")
# report_abspath = "D:\\web_project\\report\\"+now+"result.html"
fp = open(report_abspath, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
title=u'自动化测试报告,测试结果如下:',
description=u'用例执行情况:')
# 调用add_case函数返回值
runner.run(all_case)
fp.close()
def get_report_file(report_path):
'''获取最新的测试报告'''
lists = os.listdir(report_path)
lists.sort(key=lambda fn: os.path.getmtime(os.path.join(report_path, fn)))
print (u'最新测试生成的报告: '+lists[-1])
# 找到最新生成的报告文件
report_file = os.path.join(report_path, lists[-1])
return report_file
def send_mail(sender, psw, receiver, smtpserver, report_file):
'''发送最新的测试报告内容'''
# 读取测试报告的内容
with open(report_file, "rb") as f:
mail_body = f.read()
# 定义邮件内容
msg = MIMEMultipart()
body = MIMEText(mail_body, _subtype='html', _charset='utf-8')
msg['Subject'] = u"自动化测试报告"
msg["from"] = sender
msg["to"] = psw
# 加上时间戳
# msg["date"] = time.strftime('%a, %d %b %Y %H_%M_%S %z')
msg.attach(body)
# 添加附件
att = MIMEText(open(report_file, "rb").read(), "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename= "report.html"'
msg.attach(att)
# 登录邮箱
smtp = smtplib.SMTP()
# 连接邮箱服务器
smtp.connect(smtpserver)
# 用户名密码
smtp.login(sender, psw)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
print('test report email has send out !')
if __name__ == "__main__":
# 测试用例的路径、匹配规则
case_path = "D:\\test\\newp\\case"
rule = "test*.py"
all_case = add_case(case_path, rule) # 1加载用例
# 生成测试报告的路径
report_path = "D:\\test\\newp\\report"
run_case(all_case, report_path) # 2执行用例
# 获取最新的测试报告文件
report_file = get_report_file(report_path) # 3获取最新的测试报告
#邮箱配置
sender = "yoyo@xxx.com"
psw = "xxx"
# 收件人多个时,中间用逗号隔开,如'a@xx.com,b@xx.com'
receiver = "yoyo@xxx.com"
smtp_server = 'smtp.xxx.com'
# send_mail(sender, psw, receiver, smtp_server, report_file) # 4最后一步发送报告,需要发邮件就取消注释。

3.9 run_main.py源码(兼容python2和3)的更多相关文章
- daily news新闻阅读客户端应用源码(兼容iPhone和iPad)
daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
- Django框架base.py源码
url.py文件 from django.conf.urls import url from django.contrib import admin from app_student import v ...
- Python逆向(四)—— Python内置模块dis.py源码详解
一.前言 上一节我们对Python编译及反汇编做了讲解,大家知道dis模块可以将编译好的pyc文件中提取出来的PyCodeObject反汇编为可以阅读字节码形式.本节我们对dis模块中的源码进行详细的 ...
- r-cnn学习(四):train_faster_rcnn_alt_opt.py源码学习
论文看的云里雾里,希望通过阅读其代码来进一步了解. 参考:http://blog.csdn.net/sloanqin/article/details/51525692 首先是./tools/train ...
- 深度学习入门-4.1 AND.py 源码分析
源代码 ------------------------------------------------------------------------------------------------ ...
- 获得PyInstaller打包exe的py源码
参考链接:https://laucyun.com/33359ed9f725529ac9b606d054c8459d.html way1:pyi-archive_viewer 提取pyc,uncomp ...
- python string.py 源码分析 三:maketrans
l = map(chr, xrange(256)) #将ascii转为字符串 _idmap = str('').join(l) del l # Construct a translation stri ...
- python string.py 源码分析 二:capwords
def capwords(s, sep=None): """capwords(s [,sep]) -> string Split the argument into ...
- python string.py 源码分析 一
# Some strings for ctype-style character classification c风格字符串 whitespace = ' \t\n\r\v\f' #空白字符 \t 制 ...
随机推荐
- vue2.0配置路由
配置路由之前,先检查vue版本,(案例适用vue2.0) 采用npm包的形式进行安装. 安装路由依赖:npm install vue-router(代码中,如果在一个模块化工程中使用它,必须要通过 V ...
- 2018的flag
1.leetcode刷到medium的题目不吃力 2.坚持记录自己的独特感悟 3.找到好的工作或者实习,二战计划再看吧 4.好好完成毕设,为大学生活画上完满句号
- keras神经网络做简单的回归问题
咸鱼了半个多月了,要干点正经事了. 最近在帮老师用神经网络做多变量非线性的回归问题,没有什么心得,但是也要写个博文当个日记. 该回归问题是四个输入,一个输出.自己并不清楚这几个变量有什么关系,因为是跟 ...
- Ajax如何实现从前端不刷新页面就可以到后端取到数据
提到axaj很多人总说很难,什么回调函数呀等等就让人心烦,其实懂得ajax在js里面是如何实现向服务器请求数据的原理,那么理解ajax也就不是很难了,现在我们一起来看看. ajax作用:ajax技术的 ...
- GD库imagettftext中文乱码的问题
linux下出现乱码,加上编码转换就可以了. $str = mb_convert_encoding($str, "html-entities", "utf-8" ...
- 学号 20175212 《Java程序设计》第3周学习总结
学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...
- argument 1 must be 2-item sequence, not int
看了 https://blog.csdn.net/qq_18250439/article/details/80872425 的说明,才明白为什么错了. 当使用Python3-pygame时出现Typ ...
- Saiku数据库迁移H2迁移到Mysql(二十二)
Saiku数据库迁移H2迁移到Mysql Saiku默认使用H2数据库来存储saiku的用户与角色信息,我们可以根据角色来做saiku的权限控制,然后将角色分配给用户 ,该用户就会有对应的约束了! 由 ...
- HDU1237
/************************************************************** 作者:陈新 邮箱:cx2pirate@gmail.com 用途:hdu1 ...
- 使用idea启动springMVC+Hibernate其他项目
打开项目后打开Project Structure 点开左边的Libraries 加入依赖包 点开左边的Moudules 选中项目 新建Web,Spring,Hibernate三项 Hibernate添 ...