测试平台系列(88) 完成邮件通知功能(附赠精美邮件模板)

发布于 1970年 01月 01日 08:00

大家好~我是米洛

我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持。

欢迎关注我的公众号米洛的测开日记,获取最新文章教程!

回顾

书接上回,我们找准了一款看似不错的邮件模板,但由于数据都是死的,所以我们需要获取测试报告产生的数据,并渲染HTML模板

这节我们就来彻彻底底完善这块功能。

效果图

这次数据已经真实,而且有定时任务直接跑了发送出来,相当靠谱

编写邮件模块

由于之前yagmail不是太好用,所以我们需要改写send_msg方法,由于比较简单,我就直接上代码了。

不过在此之前呢,我们需要先去配置文件里面加上一个字段:

其实smtplib提供了From的选项,我本来想叫Pity自动化测试平台,但是那样的话邮件死活发不出去,遂放弃。

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
@staticmethod def send_msg(subject, content, attachment=None, *receiver): configuration = SystemConfiguration.get_config() data = configuration.get("email") sender = data.get("sender") to = data.get("to") message = MIMEText(content, 'html', 'utf-8') message['From'] = sender message['To'] = Header(to, 'utf-8') message['Subject'] = Header(subject, 'utf-8') try: smtp = smtplib.SMTP() smtp.connect(data.get("host")) # 我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。 smtp.set_debuglevel(1) smtp.login(sender, data.get("password")) smtp.sendmail(sender, list(receiver), message.as_string()) except Exception as e: raise Exception(f"发送测试报告邮件失败: {e}")

新的send_msg方法很简单,在保持参数一致的情况下,代码量比yagmail多了很多。

大概思路就是先封装MIMETEXT,并设置为html模式,接着把收件人发件人主题以及内容等数据都放入其中,最后通过sendmail发送邮件。

改造run_test_plan方法

  • 添加执行人参数

目前我们的测试计划还不支持手动执行,一方面为了适配手动执行,一方面为了在邮件体现执行人信息,所以我们在run_test_plan加上执行人这个参数:

执行人默认是0,也就是CPU(小时候打小霸王的时候的感觉)

  • 改写run_multiple方法

    run_multiple这个方法是我们测试计划执行的核心方法,由于我们测试计划是支持多环境的,并且一个测试环境对应一份测试报告。

    我们在执行完一个测试计划可能出现多个报告链接,每个环境也有自己的通过率这些数据。

    所以我们需要记录一个map,里面存放env => 测试结果的映射,最终返回。

    由于我们是异步执行,所以我们在外部设定一个map,当做参数传递进去,由于引用传递的原理,函数执行完毕,我们的map也更新好了。

顺理成章的,run_multiple方法里面也需要改造,它应该接收新的map参数,但为了不影响原先的功能,所以它可传可不传。

下面是获取执行人姓名的操作:

接着是run_multiple在返回之前的改造:

生成真实html

上述操作都是为了获取测试报告需要的数据,获取了之后我们还得利用jinja2渲染html。

这里我放上原生html:

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
<!DOCTYPE html> <html> <head> <title> 测试报告 </title> </head> <body> <div> <includetail> <div align="center"> <div class="open_email" style="margin-left: 8px; margin-top: 8px; margin-bottom: 8px; margin-right: 8px;"> <div> <br> <span class="genEmailContent"> <div id="cTMail-Wrap" style="word-break: break-all;box-sizing:border-box;text-align:center;min-width:320px; max-width:660px; border:1px solid #f6f6f6; background-color:#f7f8fa; margin:auto; padding:20px 0 30px; font-family:'helvetica neue',PingFangSC-Light,arial,'hiragino sans gb','microsoft yahei ui','microsoft yahei',simsun,sans-serif"> <div class="main-content" style=""> <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse"> <tbody> <tr style="font-weight:300"> <td style="width:3%;max-width:30px;"></td> <td style="max-width:600px;"> <div id="cTMail-logo" style="width:92px; height:25px;"> <a href=""> <img border="0" src="https://gitee.com/woodywrx/picture/raw/master/2021-11-24/1637761462006-image.png" style="width:36px; height:36px;display:block"> </a> </div> <p style="height:2px;background-color: #00a4ff;border: 0;font-size:0;padding:0;width:100%;margin-top:20px;"></p> <div id="cTMail-inner" style="background-color:#fff; padding:23px 0 20px;box-shadow: 0px 1px 1px 0px rgba(122, 55, 55, 0.2);text-align:left;"> <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse;text-align:left;"> <tbody> <tr style="font-weight:300"> <td style="width:3.2%;max-width:30px;"></td> <td style="max-width:480px;text-align:left;"> <h1 id="cTMail-title" style="font-size: 20px; line-height: 36px; margin: 0px 0px 22px;"><strong>{{ env }}</strong>】测试计划 【<strong>{{ plan_name }}</strong>】执行结果: <strong>{{plan_result}} </strong> </h1> <p id="cTMail-userName" style="font-size:14px;color:#333; line-height:24px; margin:0;"> 尊敬的pity用户,您好! </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> 本次测试计划共执行用例<strong>{{ total }}</strong>条。 </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"><strong>{{ executor }}</strong>于{{ start_time }}开始执行,共耗时{{cost}}秒。 </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> 成功数量 <strong style="color: #67C23A">{{ success }}</strong> </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> 失败数量 <strong style="color: #F56C6C">{{ failed }}</strong> </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> 出错数量 <strong style="color: #E6A23C">{{ error }}</strong> </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> 跳过数量 <strong style="color: #409EFF">{{ skip }}</strong> </span> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;">查看详细测试报告,可点击下方链接。 <span style="font-weight: bold;">如有打扰,请您谅解。</span> </span> </p> <p class="cTMail-content" style="font-size: 14px; color: rgb(51, 51, 51); line-height: 24px; margin: 6px 0px 0px; word-wrap: break-word; word-break: break-all;"> <a id="cTMail-btn" href="{{report_url}}" title="" style="font-size: 16px; line-height: 45px; display: block; background-color: rgb(0, 164, 255); color: rgb(255, 255, 255); text-align: center; text-decoration: none; margin-top: 20px; border-radius: 3px;"> 点击此处查看完整报告 </a> </p> <p class="cTMail-content" style="line-height: 24px; margin: 6px 0px 0px; overflow-wrap: break-word; word-break: break-all;"> <span style="color: rgb(51, 51, 51); font-size: 14px;"> <br> 无法正常显示?请复制以下链接至浏览器打开: <br> <a href="{{report_url}}" title="" style="color: rgb(0, 164, 255); text-decoration: none; word-break: break-all; overflow-wrap: normal; font-size: 14px;"> 这里是测试报告链接 </a> </span> </p> </td> <td style="width:3.2%;max-width:30px;"></td> </tr> </tbody> </table> </div> <div id="cTMail-copy" style="text-align:center; font-size:12px; line-height:18px; color:#999"> <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse"> <tbody> <tr style="font-weight:300"> <td style="width:3.2%;max-width:30px;"></td> <td style="max-width:540px;"> <p style="text-align:center; margin:20px auto 14px auto;font-size:12px;color:#999;"> 此邮件由pity自动发出,请勿回复。 </p> <p id="cTMail-rights" style="max-width: 100%; margin:auto;font-size:12px;color:#999;text-align:center;line-height:22px;"> <img border="0" src="https://gitee.com/woodywrx/picture/raw/master/2021-8-7/1628267097936-qrcode_for_gh_554fe7a74955_258.jpg" style="width:84px; height:84px; margin:0 auto;"> <br> 关注测试开发坑货,了解pity更多内容 <br> </p> </td> <td style="width:3.2%;max-width:30px;"></td> </tr> </tbody> </table> </div> </td> <td style="width:3%;max-width:30px;"></td> </tr> </tbody> </table> </div> </div> </span> </div> </div> </div> </includetail> </div> </body> </html>

上述代码在pity/templates/report.html文件内。

接着编写渲染html的方法:

其中kwargs是传递对应的参数给html。

之前也说过一个邮件对应一个地址,所以send_msg调用的地方也得跟着修改。

这样就是一个环境对应一封邮件

至此,我们的邮件推送功能就全部完成了。

链接能正常点击,还要啥自行车

今天的内容就到这里了,咱们下期见。

本文作者:米洛丶

本文链接:https://www.cnblogs.com/we8fans/p/15823741.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

点个关注支持一下吧~