Jenkins+RF持续集成测试(三) 生成测试报告并发给指定人

在上一篇《定时更新SVN完成构建》中讲了定时从SVN拉取最新的测试脚本,并自动构建的过程。这篇我将介绍怎么配置测试robot报告,并发送给指定人群。
1、要发给指定人,首先需要在job配置,构建后操作中增加“Editable Email Notification”。(我在安装Jenkins中已经安装上了该插件,如果没有,你可以在 系统管理->管理插件 中搜索安装)
这里面大部分都采用默认,主要注意 Default Content ,这里为报告的内容,通常默认的报告非常简单,我这里采用了模板 robot.template, 模板后面我将告诉大家怎么设置
Editable Email Notification
2、要发邮件,一定要设置邮件SMTP服务,设置位置在 系统管理->系统设置 中 邮件通知 栏配置。配置好后,可以勾选“通过发送测试邮件测试配置”,填写收件人进行测试。
SMTP服务器设置
3、是不是上面配置好就OK,这里千万要注意这里面的用户名(即邮箱账号)要与配置中 系统管理员邮件地址 一致,否则最后在构建中,发送邮件会失败! (以前我可是折腾了半天,才找到了失败的原因)
系统管理员邮件设置
4、在第一步中,我们看到有些默认配置,这些默认配置变量值也是在 系统设置中 Extended E-mail Notification 设置。包括邮件发送人,抄送人等。
邮件默认内容设置
到了这一步,基本就搞定了,但是我们最关键的一步来了,怎么配置模板?
5、配置模板
1)在Jenkins安装根目录下 确保(或新建)一文件夹 email-templates ,我们把自己的模板(如上面提到的robot.template)放置在下面即可。
2)这里笔者友情提供自己通过改写制作的模板robot.template,希望有用多支持下51ste部落,^_^。内容具体如下:

<%  
 import java.text.DateFormat  
 import java.text.SimpleDateFormat  
 %>  
    <!-- Robot Framework Results --> 
    <div style="margin-bottom:20px;width:100%;">
    <% def res = build.result.toString().toLowerCase() 
       if (res=="success") {%>
        <p style="font-size:30px;margin:0px;background:#ccc;color:green;"><img alt="ROBOT" src="http://i39.tinypic.com/2z3uk4j.jpg"/>构建状态:<%= build.result.toString().toLowerCase()%>
       <% } else{ %>
        <p style="font-size:30px;margin:0px;background:#ccc;color:red;"><img alt="ROBOT" src="http://i39.tinypic.com/2z3uk4j.jpg"/>构建状态:<%= build.result.toString().toLowerCase()%>s
       <%}%>
    <p>项目名称:${project.name}</p>
    <p>构建时间:${it.timestampString}</p>
        <p>构建轮次:<a href="${rooturl}${build.url}">${build.displayName}(点击查看此轮构建信息)</a></p> 
    <p>构建时长:${build.durationString}</p>
    </div>
<%  
 def robotResults = false  
 def actions = build.actions // List<hudson.model.Action>  
 actions.each() { action ->  
  if( action.class.simpleName.equals("RobotBuildAction") ) { // hudson.plugins.robot.RobotBuildAction  
   robotResults = true %>
                   <div style="width:100%;float:left"> 
                    <table cellspacing="0" cellpadding="4" border="1" align="left" style="width:40%">  
                        <thead>
                            <tr bgcolor="#F3F3F3">
                                <td style="text-align:center" colspan="4"><b>自动化测试汇总报告</b></td>    
                            </tr>
                            <tr>
                                <td bgcolor="#F3F3F3" style="width:80px"><b>详细报告:</b></td>
                                <td colspan="4"><a href="${rooturl}${build.url}robot/report/report.html">点击查看报告详情</a></td>
                            </tr>                            
                            <tr bgcolor="#F3F3F3">
                                <td><b>用例总数</b></td>
                                <td><b>通过</b></td>
                                <td style="width:60px"><b>不通过</b></td>
                                <td style="width:100px"><b>通过率</b></td>
                            </tr>
                            <tr>
                                <td><%= action.result.overallTotal %></td>
                                <td><b><span style="color:#66CC00"><%= action.result.overallPassed %></span></b></td>
                                <td><b><span style="color:#FF3333"><%= action.result.overallFailed %></span></b></td>
                                <td><%= action.overallPassPercentage %>%</td>
                            </tr>
                            <tr bgcolor="#F3F3F3">  
                                <td colspan="2"><b>用例名称</b></td>  
                                <td><b>测试结果</b></td>  
                                <td><b>耗费时长</b></td>  
                            </tr>  
                        </thead>  
                        <tbody>  

<% def suites = action.result.allSuites  
   suites.each() { suite ->   
    def currSuite = suite  
    def suiteName = currSuite.displayName  
    // ignore top 2 elements in the structure as they are placeholders  
    while (currSuite.parent != null && currSuite.parent.parent != null) {  
     currSuite = currSuite.parent  
     suiteName = currSuite.displayName + "." + suiteName  
    } %>  

上一页12下一页


留言