9 邮件
1 邮件
- 通过邮件途径展示测试工作结果
- 邮件包括:
- 测试执行简介
- 测试图表展示
- 测试细节列表
- log 附件
2 配置文件
from utils.timeformat import dt_format from config.conf_selenium import BROWSER # 发件人 SENDER = 'aaa@xxx.com' # 密码 PASSWORD = 'xxx' # 收件人 RECEIVER = ['aaa@xxx.com', 'bbb@xxx.com'] # 用来发送邮件的 SMTP 服务器 SMTP_SERVER = 'smtp.mxhichina.com' # 端口号 SMTP_PORT = 465 # 标题 SUBJECT = '【' + BROWSER + ' UI 自动化测试报告】'+ dt_format(0)
3 邮件模板
class make_report(): # 邮件标题 title = '' # 基本信息 test_time = '' tester = '' all_num = '' pass_num = '' fail_num = '' # table result_table = '' def get_title(self): return self.title def set_title(self, title): self.title = title def get_test_time(self): return self.test_time def set_test_time(self, test_time): self.test_time = test_time def get_tester(self): return self.tester def set_tester(self, tester): self.tester = tester def get_all_num(self): return self.all_num def set_all_num(self, all_num): self.all_num = all_num def get_pass_num(self): return self.pass_num def set_pass_num(self, pass_num): self.pass_num = pass_num def get_fail_num(self): return self.fail_num def set_fail_num(self, fail_num): self.fail_num = fail_num def get_result_table(self): return self.result_table def set_result_table(self, result_table): self.result_table = result_table def get_result_table(self): return self.result_table def set_result_table(self, id, flow_name, cases, flow_result): table_str = """ <tr> <td style="text-align: center"> """ + str(id) + """ </td> <td style="text-align: center"> """ + str(flow_name) + """ </td> <td style="text-align: center"> """ + str(cases) + """ </td> <td style="text-align: center"> """ + str(flow_result) + """ </td> </tr> """ self.result_table += table_str def get_html_msg(self): # html html_msg = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--标题开始--> <div style="border:1px; solid: #000; text-align: center;"> <h1>""" + self.get_title() + """</h1> </div> <!--标题结束--> <div style="width:100%; height: 50%"> <!--左侧开始 float:left; text-align:center; position:absolute; top:calc(25% - 25px)--> <div style="width:40%; float:left; text-align:center"> <br /> <br /> <br /> <p></p> <div style="width:60%; float:right; text-align:left"> <p> <h>测试时间:</h> <h>""" + self.get_test_time() + """</h> </p> <p> <h>测试人员:</h> <h>""" + self.get_tester() + """</h> </p> <p> <h>用例总数:</h> <h>""" + str(self.get_all_num()) + """</h> </p> <p> <h>通过用例:</h> <h>""" + str(self.get_pass_num()) + """</h> </p> <p> <h>失败用例:</h> <h>""" + str(self.get_fail_num()) + """</h> </p> </div> </div> <!--左侧结束--> <!--img开始 float:right--> <div style="width:60%; float:right"> <p> <img src="cid:image1" style="width:50%; height:50%; display:table-cell; vertical-align:middle; text-align:center"> </p> </div> <!--img结束--> </div> <!--table开始--> <div style="width:100% !important; margin-right:10px"> <table style="width:100% !important;"> <tr> <th style="font-size:1.1em; text-align:left; padding-top:5px; padding-bottom:4px; background-color:#A7C942; color:#ffffff; text-align: center"> ID </th> <th style="font-size:1.1em; text-align:left; padding-top:5px; padding-bottom:4px; background-color:#A7C942; color:#ffffff; text-align: center"> 流程名 </th> <th style="font-size:1.1em; text-align:left; padding-top:5px; padding-bottom:4px; background-color:#A7C942; color:#ffffff; text-align: center"> 包含用例 </th> <th style="font-size:1.1em; text-align:left; padding-top:5px; padding-bottom:4px; background-color:#A7C942; color:#ffffff; text-align: center"> 执行结果 </th> </tr> """+ self.get_result_table() +""" </table> </div> <!--table结束--> </body> </html> """ return html_msg
4 发送邮件配置
import smtplib from email import encoders from email.header import Header from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from config.conf_email import SMTP_SERVER from config.conf_email import SMTP_PORT from config.conf_email import PASSWORD from config.conf_email import SENDER from config.conf_email import RECEIVER from config.conf_email import SUBJECT def send_email(datetime, html_msg): # 发送内容 message = MIMEMultipart() # 对象代表邮件本身 message['From'] = Header(SENDER, 'utf-8') #发件人 message['To'] = Header(','.join(RECEIVER), 'utf-8') #收件人 message['Subject'] = Header(SUBJECT, 'utf-8') # 邮件标题 # html 正文 message.attach(MIMEText(html_msg, 'html', 'utf-8')) # 添加邮件正文 fp = open('../testreport/' + datetime + '.jpg', 'rb') # 添加正文中的图片 html_img = MIMEImage(fp.read()) fp.close() html_img.add_header('Content-ID', '<image1>') # 定义图片 ID,在 HTML 文本中引用 message.attach(html_img) # 附件 ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) # 附件-图片 image = MIMEImage(open('../testreport/'+ datetime +'.jpg', 'rb').read(), _subtype=subtype) image.add_header('Content-Disposition', 'attachment', filename=datetime+'.jpg') message.attach(image) # 附件-文件 file = MIMEBase(maintype, subtype) file.set_payload(open('../logs/log_'+ datetime +'.txt', 'rb').read()) file.add_header('Content-Disposition', 'attachment', filename='log_'+ datetime +'.txt') encoders.encode_base64(file) message.attach(file) # 发送邮件 try: server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) # 配置服务器 server.login(SENDER, PASSWORD) # 登录 server.sendmail(SENDER, RECEIVER, message.as_string()) print('邮件发送成功!') except Exception as e: print ('邮件发送失败!' + str(e)) server.quit() if __name__ == "__main__": send_email()
5 邮件展示