zoukankan      html  css  js  c++  java
  • 【接口平台】测试报告邮件通知

    在接口平台中,原本测试报告是通过微信的方式发给公司企业号进行广播通知。但是,现在由于其他子公司的使用,企业号设置相对繁琐,现计划增加邮件通知的功能
    在这里插入图片描述
    首先得支持邮件发送,Python3 SMTP发送邮件网上有数不清的栗子

    #!/usr/bin/python3
     
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
     
    sender = 'from@runoob.com'
    receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
     
    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
    message['From'] = Header("菜鸟教程", 'utf-8')     # 发送者
    message['To'] =  Header("测试", 'utf-8')          # 接收者
     
    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')
     
     
    try:
        smtpObj = smtplib.SMTP('localhost')
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")
    

    一开始对于s.sendmail(MAIL_USER, receivers, msgRoot.as_string()) 中的 receiversmsgRoot['To'] 中的收件人有些误解,以为两者一致,导致浪费了一些时间
    调试修改一番就可达到预期的需求,代码是最好的文档

    import smtplib
    import traceback
    from email.mime.text import MIMEText
    from email.header import Header
    from email.mime.multipart import MIMEMultipart
    from config.setting import *
    
    
    def send_text(title, receivers, mail_msg):
            """
            发送邮件
            :param title: 邮件名称
            :param receivers: 接收者 [a,b,c]
            :param mail_msg: 邮件内容
            :return:
            """
            msgRoot = MIMEMultipart('related')
            msgAlternative = MIMEMultipart('alternative')
            # 标题信息
            msgRoot['Subject'] = Header(title, 'utf-8')
    
            # 发送人
            msgRoot['From'] = Header(SENDER, 'utf-8')
            # 接收人
            msgRoot['To'] = ','.join(receivers)
    
            msgRoot.attach(msgAlternative)
    
            msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
    
            try:
                s = smtplib.SMTP(SERVER, PORT)
                s.login(MAIL_USER, MAIL_PWD)
                s.sendmail(MAIL_USER, receivers, msgRoot.as_string())
            except Exception as e:
                traceback.print_exc(e)
            finally:
                s.quit()
    

    重点来了。如何在邮件中优雅的呈现具体的信息呢

    一开始一行行的敲html页面,发现太艰辛了,网上找找是否有测试报告模板吧

    GOOD!找到一个还看的过去的测试报告和源码

    在这里插入图片描述
    直接修改代码发送邮件。发现两个问题,一个是详细的用例执行信息可以在swapi接口平台中展示即可,一个是css样式在邮件中并没有显示

    在这里插入图片描述

    这么挫不能忍啊

    将css对应的代码直接复制到邮件信息中,然后调整布局,得到一下邮件报告

    在这里插入图片描述
    最后,贴上修改后的html

    html_template = """
    <?xml version="1.0" encoding="UTF-8"?>
    <html>
        <head>
            <title>接口测试报告</title>
            <meta name="generator" content="HTMLTestRunner 0.8.2.2" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <style type="text/css" media="screen"></style>
            <style type="text/css">
                    .nav {{
                        padding-left: 0;
                        margin-bottom: 0;
                        list-style: none;
                        }}
    
                        .nav:before,
                        .nav:after {{
                        display: table;
                        content: " ";
                        }}
    
                        .nav:after {{
                        clear: both;
                        }}
    
                        .nav:before,
                        .nav:after {{
                        display: table;
                        content: " ";
                        }}
    
                        .nav:after {{
                        clear: both;
                        }}
    
                        .nav > li {{
                        position: relative;
                        display: block;
                        }}
    
                        .nav > li > a {{
                        position: relative;
                        display: block;
                        padding: 10px 15px;
                        }}
    
                        .nav > li > a:hover,
                        .nav > li > a:focus {{
                        text-decoration: none;
                        background-color: #eeeeee;
                        }}
    
                        .nav > li.disabled > a {{
                        color: #999999;
                        }}
    
                        .nav > li.disabled > a:hover,
                        .nav > li.disabled > a:focus {{
                        color: #999999;
                        text-decoration: none;
                        cursor: not-allowed;
                        background-color: transparent;
                        }}
    
                        .nav .open > a,
                        .nav .open > a:hover,
                        .nav .open > a:focus {{
                        background-color: #eeeeee;
                        border-color: #428bca;
                        }}
    
                        .nav .nav-divider {{
                        height: 1px;
                        margin: 9px 0;
                        overflow: hidden;
                        background-color: #e5e5e5;
                        }}
    
                        .nav > li > a > img {{
                        max- none;
                        }}
                    .nav-tabs {{
                        border-bottom: 1px solid #dddddd;
                    }}
                    .nav-tabs > li {{
                        float: left;
                        margin-bottom: -1px;
                    }}
    
                    .nav-tabs > li > a {{
                        margin-right: 2px;
                        line-height: 1.428571429;
                        border: 1px solid transparent;
                        border-radius: 4px 4px 0 0;
                    }}
    
                    .nav-tabs > li > a:hover {{
                        border-color: #eeeeee #eeeeee #dddddd;
                    }}
    
                    .nav-tabs > li.active > a,
                    .nav-tabs > li.active > a:hover,
                    .nav-tabs > li.active > a:focus {{
                        color: #555555;
                        cursor: default;
                        background-color: #ffffff;
                        border: 1px solid #dddddd;
                        border-bottom-color: transparent;
                    }}
    
                    .nav-tabs.nav-justified {{
                         100%;
                        border-bottom: 0;
                    }}
    
                    .nav-tabs.nav-justified > li {{
                        float: none;
                    }}
    
                    .nav-tabs.nav-justified > li > a {{
                        margin-bottom: 5px;
                        text-align: center;
                    }}
    
                    .nav-tabs.nav-justified > .dropdown .dropdown-menu {{
                        top: auto;
                        left: auto;
                    }}
    
                    @media (min- 768px) {{
                        .nav-tabs.nav-justified > li {{
                            display: table-cell;
                             1%;
                        }}
                        .nav-tabs.nav-justified > li > a {{
                            margin-bottom: 0;
                        }}
                    }}
    
                    .nav-tabs.nav-justified > li > a {{
                        margin-right: 0;
                        border-radius: 4px;
                    }}
    
                    .nav-tabs.nav-justified > .active > a,
                    .nav-tabs.nav-justified > .active > a:hover,
                    .nav-tabs.nav-justified > .active > a:focus {{
                        border: 1px solid #dddddd;
                    }}
    
                    @media (min- 768px) {{
                        .nav-tabs.nav-justified > li > a {{
                            border-bottom: 1px solid #dddddd;
                            border-radius: 4px 4px 0 0;
                        }}
                        .nav-tabs.nav-justified > .active > a,
                        .nav-tabs.nav-justified > .active > a:hover,
                        .nav-tabs.nav-justified > .active > a:focus {{
                            border-bottom-color: #ffffff;
                        }}
                    }}
            </style>
        </head>
        <body>
            <div class="container-fluid">
                <div class="page-header">
                    <h2 class="text-primary" style="font-size:45px;line-height:75px;text-align:center">{plan_name}(v{version} 测试报告)</h2>
                    <a href = {report_href}  style="display: block; text-align: center; margin-left: 200px">测试报告详情链接(公司内网访问)</a>
                </div>
                <div>
                    <div class="tabbable" id="tabs-957640" style="display:flex; justify-content: center">
                        <ul class="nav nav-tabs">
                            <li class="active">
                                <a href="#panel-0" data-toggle="tab" style="Background-Color: #428bca; color: #fff;">用例数 ({case_num})</a>
                            </li>
                            <li>
                                <a href="#panel-1" data-toggle="tab" style="Background-Color: #5cb85c; color: #fff;">成  功 ({case_pass_num})</a>
                            </li>
                            <li>
                                <a href="#panel-2" data-toggle="tab" style="Background-Color: #d9534f; color: #fff;">失  败 ({case_fail_num})</a>
                            </li>
                            <li>
                                <a href="#panel-3" data-toggle="tab" style="Background-Color: #5bc0de; color: #fff;">通过率 ({passing_rate}%)</a>
                            </li>
                        </ul>
                    </div>
                    <div style="display:flex; justify-content: center; margin-top:20px">
                        <div class="col-md-4" style="Background-Color:#F5F5F5; ">
                            <h3 style="line-height:25px">&emsp;测试报告概要信息</h3>
                            <table class="table table-hover table-bordered" style="100%; height:11px">
                                <tbody>
                                    <tr class="info">
                                        <td class="text-center">&emsp;项&emsp;&emsp;目:&emsp;</td>
                                        <td class="text-center">{project_name}</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;计&emsp;&emsp;划:&emsp;</td>
                                        <td class="text-center">{plan_name}</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;执行版本:&emsp;</td>
                                        <td class="text-center">v{version}</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;运行环境:&emsp;</td>
                                        <td class="text-center">{env_name}</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;开始时间:&emsp;</td>
                                        <td class="text-center">{start_time}&emsp;</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;测试时长:&emsp;</td>
                                        <td class="text-center">{elapsed}s</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;总用例数:&emsp;</td>
                                        <td class="text-center">{case_num}</td>
                                    </tr>
                                    <tr class="info">
                                        <td class="text-center">&emsp;通&nbsp;&nbsp;过&nbsp;率:&emsp;</td>
                                        <td class="text-center">{passing_rate}%</td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </body>
    </html>
    """
    

    其实在调用的时候又遇到了一个问题,使用变量%s的方式的时候,发现html中有一大批%,可以将%替换成%%
    还有一种方式,str.format() 的方式,但是,html中出现{} 时又被误判
    最后选择将html原本的 { 替换成 {{} 替换成 }},变量使用 {case_num} 这样的方式

    具体调用

            # 邮件提示测试报告内容
            mail_content = html_template.format(
                            project_name=project_name,
                            plan_name=plan_name,
                            version=plan_version,
                            env_name=env_name,
                            start_time=start_time,
                            elapsed=plan_elapsed,
                            case_num=case_num,
                            passing_rate=passing_rate,
                            case_pass_num=case_pass,
                            case_fail_num=case_fail,
                            case_error_num=case_error,
                            report_href=report_href
                       )
    
  • 相关阅读:
    国债预发行
    解决GDI+的DrawString绘制带有偏移的问题
    大数据量下查询显示优化方案小结
    《提高C++性能的编程技术》 读书笔记
    基金TA系统简介
    关于做对和做好的一点思考
    调试网络断线工作心得
    双目视觉简介
    PCL中outofcore模块---基于核外八叉树的大规模点云的显示
    深度相机Astra Pro测试教程
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12533576.html
Copyright © 2011-2022 走看看