Jenkins上配置Robot Framework测试邮件通知模板

简介: 邮件效果测试成功如下所示:jenkins_robot_success测试失败如下所示:jenkins_robot_failure通过这个模板,我们能够很直观地看出测试的执行情况,以及相关的统计信息。

邮件效果

测试成功如下所示:


img_b6c980d8cf11da8473eaf784a94c57cf.jpe
jenkins_robot_success

测试失败如下所示:

img_d16030fe2a1c5fedc931c0bf11183e76.jpe
jenkins_robot_failure

通过这个模板,我们能够很直观地看出测试的执行情况,以及相关的统计信息。接下来我们详细介绍如何配置邮件模板

配置邮件模板

第一步编写邮件模板

我们的邮件模板是基于groovy脚本编写的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<style type="text/css">
/*base css*/
a{color:#4a72af}
body{background-color:#e4e4e4}
body,p{margin:0;padding:0}
img{display:block}
h1,h2,h3,h4,h5,h6{margin:0 0 .8em 0}
h3{font-size:28px;color:#444!important;font-family:Arial,Helvetica,sans-serif}
h4{font-size:22px;color:#4a72af!important;font-family:Arial,Helvetica,sans-serif}
h5{font-size:18px;color:#444!important;font-family:Arial,Helvetica,sans-serif}
p{font-size:12px;color:#444!important;font-family:"Lucida Grande","Lucida Sans","Lucida Sans Unicode",sans-serif;line-height:1.5}

table.robotstat {
  border: 1px solid black;
  border-collapse: collapse;
  empty-cells: show;
  margin: 0px 1px;
  table-layout: fixed;
  word-wrap: break-word;
  font-size: 1em;
  border-width:1px;
}

tr.test_column_robot {
  background-color:#C6C6C6;
}

ol li img{display:inline;height:20px}
/*div styles*/
.news{text-align:center;padding-top:15px;}
.content{width:720px;margin:0 auto;background-color:white}
.round_border{margin-bottom:5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;margin-top:0;font-size:14px;padding:6px;border:1px solid #ccc}
.status{background-color:<%=
            build.result.toString() == "SUCCESS" ? 'green' : 'red' %>;font-size:28px;font-weight:bold;color:white;width:720px;height:52px;margin-bottom:18px;text-align:center;vertical-align:middle;border-collapse:collapse;background-repeat:no-repeat}
.status .info{color:white!important;text-shadow:0 -1px 0 rgba(0,0,0,0.3);font-size:32px;line-height:36px;padding:8px 0}
.main img{width:38px;margin-right:16px;height:38px}
.main table{font-size:14px;}
.main table th{text-align:right;}
.bottom-message{width:720px;cellpadding:5px;cellspacing:0px}
.bottom-message .message{font-size:13px;color:#aaa;line-height:18px;text-align:center}
.bottom-message .designed{font-size:13px;color:#aaa;line-height:18px;font-style: italic;text-align:right}
img.cartoon {width: 36px; display:inline}
</style>
<body>
<div class="content round_border">
        <div class="status">
            <p class="info">构建状态 <%= build.result.toString().toLowerCase() %></p>
        </div>
        <!-- status -->
        <div class="main round_border">
            <table>
                <tbody>
                    <tr>
                        <th>项目名称:</th>
                        <td>${project.name}</td>
                    </tr>
                    <tr>
                        <th>构建轮次:</th>
                        <td><a
                            href="${rooturl}${build.url}">${build.displayName}(点击查看此轮构建信息)</a></td>
                    </tr>
                    <tr>
                        <th>构建时间:</th>
                        <td>${it.timestampString}</td>
                    </tr>
                    <tr>
                        <th>构建时长:</th>
                        <td>${build.durationString}</td>
                    </tr>
          <tr>
            <th>构建缘由:</th>
            <td><% build.causes.each() { cause -> %> ${cause.shortDescription} <% } %></td>
          </tr>
          <tr>
            <th>测试报告:</th>
            <td><a
              href="${rooturl}${build.url}robot">点击查看测试报告详情</a></td>
          </tr>
          <tr>
            <!-- test stat -->
            <th>测试统计:</th></br>
            <td>
            <table id="robotstat" class="robotstat">
            <thead>
            <tr id="test_column_robot" class="test_column_robot">
            <th>测试总用例数</th>
            <th>失败用例数</th>
            <th>测试通过率</th>
            </tr>
            </thead>
            <tbody>
            <tr>
            <%  def robotTestResultAction = it.getAction("hudson.plugins.robot.RobotBuildAction") %>
            <td>${robotTestResultAction.getTotalCount()}</td>
            <td>${robotTestResultAction.getFailCount()}</td>
            <td>${robotTestResultAction.getOverallPassPercentage()}%</td>
            </tr>
            </tbody>
            </table>
            </td>
          </tr>
                    <tr>
                        <th>变更记录:</th>
                        <td><a
                            href="${rooturl}${build.url}changes">点击查看变更记录</a></td>
                    </tr>
                    <tr>
                        <td colspan="2"> </td>
                    </tr>
                </tbody>

            </table>

        </div>
        <!-- main -->
        <% def artifacts = build.artifacts
            if(artifacts != null && artifacts.size() > 0) { %>

        <div class="artifacts round_border">
            <b>Build Artifacts:</b>
            <ul>
            <%      artifacts.each() { f -> %>
                <li><a href="${rooturl}${build.url}artifact/${f}">${f}</a></li>
            <%      } %>
            </ul>
        </div>
        <% } %>
        <!-- artifacts -->

        <% def changeSet = build.changeSet
        if(changeSet != null) {
            def hadChanges = false
            def count = 0 %>

        <div class="details round_border">
            <b>变更详细:</b>
            <ol>
            <%  changeSet.each() { cs ->
                    hadChanges = true
                    def aUser = cs.author %>
                <li>${cs.msgAnnotated} (${aUser.displayName})
                    (<a href="${rooturl}${build.url}changes#detail${count}">detail</a>)</li>
            <%      count ++
                }  %>
            </ol>
        </div>
        <% } %>
        <!-- details -->
    </div>
    <!-- content -->

    <table class="bottom-message" align="center">
        <tr>
            <td class="message">You are receiving this email because you
                are relavent with this build<br>
            </td>
        </tr>
        <tr>
            <td colspan="2" class="designed">designed by @wangyang  </td>
        </tr>
    </table>
    <!-- bottom message -->

</body>

这个邮件模板是基于groovy-html-larry.template模板改造的,我们将模板文件放到$JENKINS_HOME/email-templates目录下,如果没有这个目录,自己创建该目录。

第二步配置邮件

这里,我们需要在Jenkins安装email-ext插件,配置如下图所示:

img_0bb4f14ed82a9af5424d90dcc01d01cc.png
jenkins_robot_email_template

这样的话,我们就完成了邮件模板的配置了。如果邮件发送设置正确的话,我们应该可以收到测试邮件通知。

其他

我们还可以自己编写HTML的邮件模板,而不用email-ext插件,下面是我配置效果, 执行完成后,会收到这样的邮件通知。

img_3c20ba86ca2e44a0ff6fac10792cd3d2.jpe
test_fail_email_report
img_0a7dd950503301a7cfbe9232a61824a8.jpe
test_pass_report

或者是类似下图这样的邮件模板


img_0963f8f77cc25bef1726dfc29c8d6b85.png
test_failed_report

也可以将自己公司的logo加入到模板中


img_d5540089b70bec2d14a5f50de7c56088.png
定制化

交流联系

如有问题,可以通过以下邮箱联系我。


img_8ae1f5276d7eeeb22fbd40826e6c06cf.gif
wywincl522@gmail.com

大家也可以加入RobotFramework社区来交流学习。


img_6451fef2811785c3cd58acfd86c3b7f4.png
Robot Framework社区
目录
相关文章
|
9天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
16 1
|
2月前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
85 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
1月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
68 4
|
1月前
|
运维 监控 数据可视化
大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试
大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试
54 1
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
41 1
|
28天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
111 0
|
2月前
|
JavaScript 测试技术
vue配置生产环境.env.production、测试环境.env.development
该文章介绍了如何在Vue项目中配置和使用不同的环境变量文件(.env、.env.production、.env.development)以适应开发、测试和生产环境,并通过修改`package.json`中的scripts来实现不同环境的打包。
369 0
vue配置生产环境.env.production、测试环境.env.development
|
28天前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
52 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
219 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
233 3
快速上手|HTTP 接口功能自动化测试
下一篇
无影云桌面