导语
之前已经画好了原型(探索框架(八)),接下来需要去完成发送bug报告的功能。
一、发邮件技术实验
基于此前驱动程序代码已经比较多了,对于新手而言,不熟悉的技术还是先做个小试验,在成功后再去原驱动程序中加以糅合,先尝试发送一个有标题、有正文的邮件,代码如下:
# 导入发邮件相关类库包
# 邮件的标题
from email.header import Header
# 邮件的正文
from email.mime.text import MIMEText
# 邮箱的服务器
import smtplib
class testframe_email():
def send_email(self):
# 设置邮箱服务器
smtp = smtplib.SMTP("smtp.163.com")
# 登录邮箱
smtp.login("这里是邮箱账号", "这里是邮箱密码")
# 设置邮件内容
email = MIMEText("这是邮件正文内容", "html", "utf-8")
# 设置邮件标题
email["subject"] = Header("这是邮件的标题")
# 设置邮件发送人
email["from"] = "这里就是登录的邮箱账号"
# 设置邮件收件人
email["to"] = "这里是收件人的邮箱账号"
# 发送邮件
smtp.sendmail(email["from"], email["to"], email.as_string())
# 关闭邮箱服务器
smtp.close()
if __name__ == '__main__':
objemail = testframe_email()
objemail.send_email()
以上每句均有注释,就不多做解释了,还可以在发邮件时发送附件,代码如下:
# 导入发邮件相关类库包
# 邮件的标题
from email.header import Header
# 邮件的正文
from email.mime.text import MIMEText
# 邮箱的服务器
import smtplib
# 邮件附件
from email.mime.multipart import MIMEMultipart
class testframe_email():
def send_email(self):
# 设置邮箱服务器
smtp = smtplib.SMTP("smtp.163.com")
# 登录邮箱
smtp.login("这里是邮箱账号", "这里是邮箱密码")
# 已只读方式打开附件,生成文件指针
file = open("这里是文件具体路径\\bugfile.csv","r").read()
# 设置附件的属性
annex = MIMEText(file, "utf-8")
# 设置发送类型
annex["content-type"] = "application/octet-stream"
# 附件信息的描述
annex["content-disposition"] = "attachment;filename='bugfile.csv'"
# 设置邮件发送对象
email = MIMEMultipart()
# 设置邮件内容
email.attach(MIMEText("这是邮件正文内容", "html", "utf-8"))
# 设置邮件标题
email["subject"] = Header("这是邮件的标题")
# 设置邮件发送人
email["from"] = "这里是发件人邮箱账号"
# 设置邮件收件人
email["to"] = "这里是收件人邮箱账号"
# 添加附件对象
email.attach(annex)
# 发送邮件
smtp.sendmail(email["from"], email["to"], email.as_string())
# 关闭邮箱服务器
smtp.close()
if __name__ == '__main__':
objemail = testframe_email()
objemail.send_email()
以上均有注释,就不多描述了,上面是以bugfile.csv这个文件作为附件为例,如果文件名中有中文,发送以后,附件名就会乱码,这个时候需要修改一下附件信息的描述那里的代码,有几种改写方式均可,代码如下:
# 附件信息的描述
# 这是原来的写法,适用于文件名为英文
annex["content-disposition"] = "attachment;filename='bugfile.csv'"
# 这里是适用于文件名为中文的第一种用法
annex.add_header("content-disposition", "attachment",filename=("utf-8", "", "bug报告.csv"))
# 这里是适用于文件名为中文的第二种用法
annex.add_header("content-disposition", "attachment", filename=Header("bug报告.csv", "utf-8").encode())
以上均可以解决乱码的问题,这样一来技术实验算是做好了,只需要加入原驱动程序中即可。
二、在原框架驱动程序中加入发送邮件功能
以上定义的类和方法可以直接cp到原驱动程序中,只需要关注几个参数即可。其中邮件的正文可以为bug报告中的失败用例内容,可以是变量参数,而收件人则可以从配置文件中读取,也可以作为一个参数,在原先的配置文件中多加一列,如下图所示(图一):
还可以在配置文件中加入其他说明列,比如说功能备注,写明此用例时完成哪项功能,还可以加上此用例的关联人员,可以是测试或者开发,等等。
接下来就需要去梳理在哪里进行发送邮件的调用即可。可以回顾界面,是在勾选了“发送bug报告”的情况下,才可能需要去调用发送邮件的方法,那么在原先run_driver方法中加入一个判断(具体之前的程序可以参考以前的总结),代码如下:
# 定义运行方法
def run_driver(self, event):
......
# 实例化测试驱动类
objdriver = testframe_driver()
# 根据单选按钮的选项,调用测试驱动类中的不同的执行方法
if self.csv_radiobut.GetValue() == 1:
# 如果选中了“生成bug报告”,则给一个信号,creatbug = 1
if self.bug_checkbox.GetValue() == 1:
creatbug = 1
# 如果选中了“发送bug报告”,则给一个信号
if self.email_checkbox.GetValue() == 1:
sendemail = 1
else:
sendemail = 0
else:
creatbug = 0
# 调用测试驱动程序
objdriver.run_configfile_csv(self.configfile, creatbug, sendemail)
elif self.html_radiobut.GetValue() == 1:
objdriver.run_configfile_html(self.configfile)
这里需要多传一个参数sendmail,这样再去修改run_configfile_csv方法,这个方法完整的代码如下:
# 定义执行配置文件生成csv报告方法
def run_configfile_csv(self, configfile, creatbug, sendemail):
# 实例化bug报告类
objbug = testframe_bugfile()
# 实例化发送邮件类
objemail = testframe_email()
# 如果勾选了生成bug报告,就调用创建bug报告相关方法
if creatbug == 1:
objbug.create_bugfile()
objbug.write_bugtitle()
# 实例化测试报告类
objreport = testframe_report()
# 调用创建并打开文件方法
objreport.open_report()
# 读取配置文件内容
file = open(configfile, "r")
table = csv.reader(file)
# 调用写入报告标题方法
objreport.write_title()
sucnum = 0
errnum = 0
starttime = datetime.datetime.now()
# 跳过第一行
next(table)
for ele in table:
casename = ele[1]
stros = ('python ' + casename)
if ele[2] == "yes":
# 执行脚本
os.system(stros)
# 调用读取临时文件方法,获取测试用例执行结果
objreport.read_tmp()
# 调用写入测试结果方法
objreport.write_result(ele[0], ele[1], ele[2], objreport.result)
sucnum = sucnum + int(objreport.sucnum)
errnum = errnum + int(objreport.errnum)
# 如果有失败数,则读取bug临时文件,并写入bug报告中
if errnum > 0:
bugcontent = objbug.read_bugtmp()
objbug.write_bugcontent(ele[0], ele[1], ele[2], bugcontent)
# 如果选中了“发送bug报告”,则调用发送邮件方法
if sendemail == 1:
objemail.send_email(bugcontent, ele[3])
endtime = datetime.datetime.now()
totaltime = (endtime-starttime).seconds
# 调用写入统计方法
objreport.write_count(sucnum, errnum, totaltime)
以上就可以完成发送邮件的功能了,当然这里设定的是只有存在用例执行失败的情况,且同时需要发送邮件才可以。