报告已经产生那如何以自动化的方式当报告执行结束后以邮件的方式发送通知
其中有3点:
第一:这个报告是以什么的格式发送达到简洁概括的目的?
第二:定制化的报告格式怎么带上附件以邮件的方式发出?
第三:RF如何输出就实现结构上的自动化框架?
解决此两点再加上前篇讲的基本原理和关键字封装,那么就可以骄傲的说完成了接口自动化框架的实现~~~(当然还未集成到jenkins~~数据未入DB等周边操作)
首先解决第一点:
核心脚本如下~(注:此脚本网上也有例子,我们只需要根据自己的实际需求稍作调整即可~)
# -*- coding: utf-8 -*- #encoding=utf-8 def createReportContent(detailContent,totalContent,byTagContent,bySuiteContent,percentage,reportSavePath): result=detailContent.split("\n") sDetail='' for index in range(len(result)): if(index!=len(result)): sDetail=sDetail+result[index]+"<br>" else: sDetail=sDetail+result[index] detailTable="<font size='5' style='font-weight:bold'>Summary Information</font><br><table width='1000' border='1' cellpadding='1' cellspacing='1'><tr><td width='100%'>"+'Run Pass Rate: '+percentage+"</td></tr><tr><td width='100%'>"+sDetail+"</td></tr></table>" totalTable="<table width='1000' border='1' cellpadding='1' cellspacing='1'><tr bgcolor='#DCDCDC'><td width='40%''>Total Statistics</td><td>Total</td><td>Pass</td><td>Fail</td><td>Elapsed</td><td>Pass/Fail</td></tr>" result=totalContent.split("\n") del result[0] del result[0] del result[0] del result[0] del result[0] del result[0] for index in range(len(result)): if((index+1)%2==1): totalTable=totalTable+"<tr><td>"+result[index]+"</td>" else: s=result[index] items=s.split(" ") for item in items: totalTable=totalTable+"<td>"+item+"</td>" sColor=""; if(items[2]=="0"): sColor="green" else: sColor="red" totalTable=totalTable+"<td><center><font style='font-weight:bold;color:green'>"+items[1]+"/</font><font style='font-weight:bold;color:"+sColor+"'>"+items[2]+"</font></center></td></tr>" totalTable=totalTable+"</table>" byTagTable="<table width='1000' border='1' cellpadding='1' cellspacing='1'><tr bgcolor='#DCDCDC'><td width='40%'>Statistics by Tag</td><td>Total</td><td>Pass</td><td>Fail</td><td>Elapsed</td><td>Pass/Fail</td></tr>" result=byTagContent.split("\n") del result[0] del result[0] del result[0] del result[0] del result[0] del result[0] for index in range(len(result)): if((index+1)%2==1): byTagTable=byTagTable+"<tr><td>"+result[index]+"</td>" else: s=result[index] items=s.split(" ") for item in items: byTagTable=byTagTable+"<td>"+item+"</td>" sColor=""; if(items[2]=="0"): sColor="green" else: sColor="red" byTagTable=byTagTable+"<td><center><font style='font-weight:bold;color:green'>"+items[1]+"/</font><font style='font-weight:bold;color:"+sColor+"'>"+items[2]+"</font></center></td></tr>" byTagTable=byTagTable+"</table>" bySuiteTable="<table width='1000' border='1' cellpadding='1' cellspacing='1'><tr bgcolor='#DCDCDC'><td width='40%'>Statistics by Suite</td><td>Total</td><td>Pass</td><td>Fail</td><td>Elapsed</td><td>Pass/Fail</td></tr>" result=bySuiteContent.split("\n") del result[0] del result[0] del result[0] del result[0] del result[0] del result[0] for index in range(len(result)): if((index+1)%2==1): bySuiteTable=bySuiteTable+"<tr><td>"+result[index]+"</td>" else: s=result[index] items=s.split(" ") for item in items: bySuiteTable=bySuiteTable+"<td>"+item+"</td>" sColor=""; if(items[2]=="0"): sColor="green" else: sColor="red" bySuiteTable=bySuiteTable+"<td><center><font style='font-weight:bold;color:green'>"+items[1]+"/</font><font style='font-weight:bold;color:"+sColor+"'>"+items[2]+"</font></center></td></tr>" bySuiteTable=bySuiteTable+"</table>" html="<html> <head><title></title><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body>"+detailTable+"<font size='5' style='font-weight:bold;'>Test Statistics</font>"+totalTable+"<br>"+byTagTable+"<br>"+bySuiteTable+"<br><font size='5' style='font-weight:bold;'>更多详情请查看邮件附件【report.html】和【log.html】!!!</font></body></html>" print html read = open(reportSavePath,'w') read.write(html) read.close
其次就是第二点:相对创建报告,发送邮件的脚本更是easy~主要借助BeautifulSoup库读取html文件~
# -*- coding: utf-8 -*- #encoding=utf-8 import time import smtplib import email from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import sys from bs4 import BeautifulSoup import os.path reload(sys) sys.setdefaultencoding('utf-8') #如果是list请以逗号分隔 mailto_list=['niuzhigang@XXX.com'] mail_host="smtp.XXX.com" mail_user="niuzhigang" mail_pass="nisuiyi" mail_postfix="XXX.com" def send_mail(open_file, attfile1, attfile2): soup = BeautifulSoup(open(open_file,'rb+'),"html.parser") body = soup.find("body") runPassRate = body.find("td").string PassRate = runPassRate.split(" ")[3] today = time.strftime('%Y-%m-%d',time.localtime(time.time())) detailTime = time.strftime('%H:%M:%S',time.localtime(time.time())) todaytime = today + ' 00:00:00' selectres = todaytime send_header = "[跟团-跟团频道][线上环境][主流程自动化用例批跑报告]- ".encode("utf-8") + today +" "+detailTime + " " +PassRate me="[跟团-跟团频道][线上环境][主流程自动化用例批跑报告]".encode("utf-8")+"<"+mail_user+"@"+mail_postfix+">" msg = MIMEMultipart() msg['Subject'] = send_header msg['From'] = me msg['To'] = ";".join(mailto_list) #fp = open(r'D:\pythonrf\sample\testReport\log.html',"r") fp = open(open_file,"r") content = fp.read() msg.attach(MIMEText(content, _subtype='html', _charset='utf-8')) fp.close() #log report #att1 = MIMEText(open(r'D:\pythonrf\sample\testReport\log.html', 'rb').read(), 'base64', 'gb2312') att1 = MIMEText(open(attfile1, 'rb').read(), 'base64', 'gb2312') att1["Content-Type"] = 'application/octet-stream' att1["Content-Disposition"] = 'attachment; filename="report.html"' msg.attach(att1) #result report #att2 = MIMEText(open(r'D:\pythonrf\sample\testReport\report.html', 'rb').read(), 'base64', 'gb2312') att2 = MIMEText(open(attfile2, 'rb').read(), 'base64', 'gb2312') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="log.html"' msg.attach(att2) try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user,mail_pass) server.sendmail(me, mailto_list, msg.as_string()) server.close() return True except Exception, e: print str(e) return False if __name__ == '__main__': if send_mail(r'D:/pythonrf/sample/testReport/reportlog.html', r'D:/pythonrf/sample/testReport/reportlog.html', r'D:\pythonrf/sample/testReport/report.html'): print u"发送成功" else: print u"发送失败" '''today = time.strftime('%Y-%m-%d',time.localtime(time.time())) detailTime = time.strftime('%H:%M:%S',time.localtime(time.time())) print today,detailTime soup = BeautifulSoup(open("D:/pythonrf/sample/testReport/reportlog.html",'rb+'),"html.parser") print soup body = soup.find("body") runPassRate = body.find("td").string print runPassRate.split(" ")[3]'''
第三:在RF上创建case(创建报告和发送邮件最为一条最后执行的case)
步骤1:就是在测试套上导入依赖的library
Selenium2Library库很重要 ,主要用到Get Text 关键字获取html标签内里面的文本内容,用来下次请求创建报告入参值。
也就是createReportContent库中的createReportContent方法的入参!
def createReportContent(detailContent,totalContent,byTagContent,bySuiteContent,percentage,reportSavePath):
--->createReportContent.py和sendmail.py库是通过Selenium2Library获取入参value后,用这2库完成创建报告和发送邮件
好了,到此case输出结束(发送报告也作为了一个单独的case输出~)中间过程会生成一个名称为reportlog.html文件