• jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)


    前言:由于ant-jmeter目前的版本不支持javamail,也就是说发送邮件时只能借助jenkins自带的发送邮件插件来发送报告。

    但是jenkins发送邮件支持发送邮件内容(且有价值、有营养的内容也只能是借用jenkins的宏),不允许上传附件。

    总的来说若借助jenkins自带的邮件插件来发送报告的话,内容空洞、没价值

    jenkins自带的邮件系统配置内容如下:

    邮件内容为:

    从图种可以看出,发送一个报告的连接,相对来说不直观,且如果要保持这个连接一直有效,那必须要做备份处理!!

    缺点很多,就不一一列举~

    因此这么多缺点,是必须要做出优化了!!!!!!

    再此,对ant-jmeter进行二次开发,让他支持javamail。

    二次开发支持的功能:①支持上传附件②支持邮件内容是以文件的方式输出

    首先反编译jmeter自带的ant-jmeter,之后增加2个类,

    一个JavaMail类(方法实现),一个MailTask类(方法执行)。ps:关于javamail网上很多材料,现成的的代码,稍微坐下修改就可以~

    JavaMail类具体实现:

    package org.programmerplanet.ant.taskdefs.jmeter;
    
    import java.io.File;
    import java.io.UnsupportedEncodingException;
    import java.text.DecimalFormat;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Address;
    import javax.mail.BodyPart;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    
    public class JavaMail {
        
        static File mailAttachmentFile;
        
        static public void sendMail(int all, int successnum, int failnum, String htmlstring, String mailSubject, String mailAttachment, String mailAddress) throws MessagingException, UnsupportedEncodingException {  
            String s;
            DecimalFormat df = new DecimalFormat("0.00");
            
            if(all == 0){
                s = "0";
            } else {
                s = df.format((float)successnum/(float)all*100);
            }
            
            Properties props = new Properties();
            // 开启debug调试
            //props.setProperty("mail.debug", "true");
            // 发送服务器需要身份验证
            props.setProperty("mail.smtp.auth", "false");
            // 设置邮件服务器主机名(ip或者域名)
            props.setProperty("mail.smtp.host", "10.64.1.85");
            // 发送邮件协议名称
            props.setProperty("mail.transport.protocol", "smtp");
        
            // 设置环境信息
            Session session = Session.getInstance(props);
        
            // 创建邮件对象
            Message msg = new MimeMessage(session);
            
            // 设置发件人
            msg.setFrom(new InternetAddress("XXX@XXX.com.cn"));
            
            // 设置收件人
            @SuppressWarnings("static-access")
            Address[] addresses = new InternetAddress().parse(mailAddress);
            msg.setRecipients(Message.RecipientType.TO,addresses);
            // 设置主题
            if(mailSubject != null){
                msg.setSubject(mailSubject);
            }else{
                msg.setSubject("接口测试报告");
            }
            
            // 设置邮件内容
            
            BodyPart bp = new MimeBodyPart();
            Multipart mp = new MimeMultipart();  
            bp.setContent("<!DOCTYPE html>"
                    + "<html lang="en">"
                    + "<head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">"
                    + "<meta content="shanhe.me" name="Author">"
                    + "<title>JMeter Test Results</title>"
                    + "<style type="text/css">"
                    + "* { margin: 0; padding: 0 }"
                    + "html{ font-size: 12px; margin: auto; }"
                    + "body {  80%; margin: 0 auto; text-align:center; font-size:62.5%;}"
                    + "table { font-size:12px;border-collapse: collapse; table-layout: fixed;word-wrap:break-word;word-break:break-all; }"
                    + "th{border:1px solid black;color: #ffffff;font-weight: normal;text-align:center;background:#2674a6;}"
                    + "td {border:1px solid black;font-weight:normal;}"
                    + "</style></head></head><body>"
                    + "<h2>接口测试报告概要(详细内容见邮件附件)</h2>"
                    + "<table width="100%"class="details" align="center">"
                + "<tr style="line-height:2em;" valign="middle">"
                + "<th width="50%">执行总数</th>"
                    + "<th>失败数</th>"
                    + "<th>成功率</th>"
                + "</tr>"
                + "<tr style="line-height:2em;" valign="middle">"
                + "<td align="center">"+all+"</td>"
                + "<td align="center">"+failnum+"</td>"
                + "<td align="center">"+s+"%</td>"
                + "</tr>"
                +htmlstring
                + "</table></body></html>", "text/html;charset=utf-8");
            
            mp.addBodyPart(bp);
            
            //附件为空时不发附件
            mailAttachmentFile = new File(System.getProperty("user.dir")+mailAttachment);
            if(mailAttachmentFile.exists()){
                System.out.println("把mailAttachment报告文件作为附件发送");
                bp = new MimeBodyPart();
                FileDataSource fileds = new FileDataSource(System.getProperty("user.dir")+mailAttachment); 
                bp.setDataHandler(new DataHandler(fileds)); 
                bp.setFileName(MimeUtility.encodeText(fileds.getName(),"UTF-8","B"));
                mp.addBodyPart(bp); 
            }else{System.out.println("mailAttachment文件不存在,邮件添加附件失败,请检查!");}
            
            msg.setContent(mp);
            msg.saveChanges(); 
    
            Transport transport = session.getTransport();
            // 连接邮件服务器
            transport.connect();
            // 发送邮件
            Transport.send(msg);
            // 关闭连接
            transport.close();
        } 
        
        //测试
        public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {
            
            String ContentString = "<tr valign="middle" style="line-height:2em;">"
                    + "<th>接口</th>"
                        + "<th>执行结果</th>"
                        + "<th>执行时间</th>"
                    + "</tr>";
            String ContentString2 = "<tr valign="middle" style="color:black;background:#D1F3FE;line-height:2em;">"
                + "<td align="left">"+"/portal/home/pc/search/popup报告测试"+"</td>"
                + "<td align="center">"+"成功"+"</td>"
                + "<td align="center">"+"100ms"+"</td>"
                + "</tr>";
    
            sendMail(5,5,0,ContentString+ContentString2,"/portal/home/pc/search/popup接口报告", "111","XXX@XXX.com.cn");
        }
    }

    MailTask类具体实现:

    package org.programmerplanet.ant.taskdefs.jmeter;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import javax.mail.MessagingException;
    import java.io.UnsupportedEncodingException;
    import org.apache.tools.ant.BuildException;
    import org.apache.tools.ant.Task;
    
    public class MailTask extends Task {
        
        private String mailAddress=null;
        
        private String mailSubject=null;
        
        private String mailAttachment=null;
        
        private String resultLog=null;
        File resultLogFile;
        File htmlFile;
        
        //jtl文件
        public void setResultLog(String resultLog) {
            this.resultLog = resultLog;
        }
    
        public String getResultLog() {
            return resultLog;
        }
        
        //邮件主题
        public void setMailSubject(String mailSubject) {
            this.mailSubject = mailSubject;
        }
    
        public String getMailSubject() {
            return mailSubject;
        }
        
        //附件  html报告文件
        public void setMailAttachment(String mailAttachment) {
            this.mailAttachment = mailAttachment;
        }
    
        public String getMailAttachment() {
            return mailAttachment;
        }
        
        //收件地址,多个逗号(英文)隔开
        public void setMailAddress(String mailAddress) {
            this.mailAddress = mailAddress;
        }
    
        public String getMailAddress() {
            return mailAddress;
        }
        
        /**
         * @see org.apache.tools.ant.Task#execute()
         * task执行的入口
         */
        public void execute() throws BuildException {
            System.out.println("开始执行发送邮件task");
            resultLogFile = new File(System.getProperty("user.dir")+resultLog);
            if (mailAddress != null && resultLogFile.exists()){
                
                System.out.println("开始解析resultLog");
                
                try {
                    analyseResultLog();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }else{System.out.println("resultLog不存在,请检查!");}
        }
        
        /**
         * 计算统计数据
         * @throws MessagingException 
         */
        private void analyseResultLog() throws BuildException, MessagingException {
            
            String htmlString = "<tr valign="top">"
                + "<th width="50%">接口</th>"
                    + "<th>执行结果</th>"
                    + "<th>执行时间</th>"
                + "</tr>";
            String time;
            String name;
            int count=0;
            String color;
            String color1="#FFFFFF";
            String color2="#E1F3FE";
            int successnum = 0;
            int failnum = 0;
            try {
                
                FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+resultLog);   
                InputStreamReader isr = new InputStreamReader(fis, "UTF-8");   
                BufferedReader br = new BufferedReader(isr);   
                String line = null;
                while ((line = br.readLine()) != null) {
                    if (line.indexOf("<httpSample ") !=-1) {
                        count = count +1;
                        color = (count%2<1)?color1:color2;
                        if (line.indexOf(" s="true"") !=-1) {
                            successnum = successnum + 1;
                            time = line.split(""")[1];
                            name = line.split(""")[13];
                            htmlString = htmlString +"<tr valign="middle" style="background:"+color+";line-height:2em;">"
                        + "<td align="left">"+name+"</td>"
                        + "<td align="center">成功</td>"
                        + "<td align="center">"+time+"ms</td>"
                        + "</tr>";
                        }else{
                            failnum = failnum + 1;
                            time = line.split(""")[1];
                            name = line.split(""")[13];
                            htmlString = htmlString +"<tr valign="middle" style="color:red;background:"+color+";line-height:2em;">"
                        + "<td align="left">"+name+"</td>"
                        + "<td align="center">失败</td>"
                        + "<td align="center">"+time+"ms</td>"
                        + "</tr>";
                        }
                    }
                }
                if(successnum+failnum > 0){
                    //有http请求才发邮件
                    JavaMail.sendMail(successnum+failnum,  successnum, failnum, htmlString, mailSubject, mailAttachment, mailAddress);
                    System.out.println("邮件发送成功");
    
                }
                br.close();
                isr.close();
                fis.close();
            }catch (IOException e) {
                throw new BuildException("Could not read jmeter resultLog: " + e.getMessage());
            }
        }
        
        //测试
            public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {
                MailTask mt = new MailTask();
                mt.setResultLog("/jtls/AutoInterface测试报告.jtl");
                mt.setMailAttachment("/htmls/AutoInterface测试报告.html");
                mt.setMailAddress("178772275@qq.com");
    
                mt.execute();
                
            }
        
    }

    至此代码已经开发结束,还需要三个步骤。

    第一:把反编译的ant-jmeter  jar包经过二次开发重新编译打包成jar文件。

    具体如何反编译修改后再重新编译打包操作略~

    新编译的ant-jmeter进行覆盖

    ps:依赖jar包有ant.jar,activation.jar,mail.jar

    第二:在bulid.xml文件增加javamail发送

    在target 父目录depends增加mail,如下配置:

    <target name="all" depends="run,report,mail"/>

    在target父目录下增加target标签,配置邮件地址等,如下配置:

    <target name="mail">
            <taskdef name="javamail" classname="org.programmerplanet.ant.taskdefs.jmeter.MailTask"/>
    
            <javamail
                resultLog="/jtls/${ReportName}.jtl"
                mailSubject="${ReportName}"
                mailAttachment="/htmls/${ReportName}.html"
                mailAddress="XXX@XXX.com.cn">
            </javamail>
            <echo>发送报告邮件 at ${report.datestamp}</echo>
        </target>

     第三:删除jenkins配置的邮件通知,否则会发送2份邮件!!!

    最后展示下优化结果:

    希望阅读此文章的上神,若有好的建议,可以保持沟通~

    ps:jenkins+ant+jmeter+DB如何配置如何搭建以及逻辑校验和关键字封装,之前已经写过这方面的内容~

    本人就对jenkins如何配置再进行下说明,比较逻辑教研和关键字封装涉及到代码了~而且在我的博客中不断提及过!

    为什么介绍下jenkins如何配置,因为本身个人好久没配置过了,且我博客上没有关于jenkins配置的文档,

    现在重新配置都有些生疏了~因此希望输出文档巩固下~

    首先:tomcat+jenkins基础搭建就不说了~就直接从jenkins配置说起!!!

    首先根据自己项目需要下载jenkins组件,如:
    Ant Plugin:用来执行Ant

    HTML Publisher plugin:html报告展示

    Email Extension Plugin:发邮件

    Subversion Plug-in 从SVN上拉去jmx文件

    下载完插件后配置jenkins!~

    步骤1:系统管理方面的配置

    1. 系统管理(manage jenkins) ---》进入系统配置(configure system)---》基本信息

     2. 系统管理(manage jenkins) ---》进入系统配置(configure system)---》jenkins location

     

     3. 系统管理(manage jenkins) ---》进入系统配置(configure system)---》Extended E-mail Notification

     步骤2:job方面的配置

    1.新建一个job(建议自由风格的~)

    2.构建触发器(Build Triggers)

    ps:说下源码管理(Source Code Management)由于我本地搭建自己测试用的就没用SVN,若是放在公共的环境下,建议用SVN这样大家提交jmx文件也不会出现冲突的问题!!!

    3.增加构建步骤(Build)

    ps:构建步骤Invoke Ant 这项可有可无,因为可以直接在Execute Windows batch command里控制

     4.增加后置步骤(Post-build Actions)

    OK配置结束~

    补充!!!

    部署遇见的难题!!!!

    win7 64位机子上若用JDK64版本,在本地dos下ant直接执行没有错误,但通过jenkins点击构建会报错,错误信息如下:

    网上上神们给出的解决方案

    https://hub.jmonkeyengine.org/t/solved-java-se-platform-binary-has-stopped-working-on-win-7-x64-when-running-tests/19369

    重点如下面上神回答,需要一个jdk 32位的版本

    抱着调试的心态,jdk换成32位版本后,重新配置环境变量,该问题解决

  • 相关阅读:
    【C++】类的特殊成员变量+初始化列表
    SM Java实现
    Android使用OKHttp3实现下载(断点续传、显示运行进度)
    codeforces 486C Palindrome Transformation 贪心求构造回文
    手把手教你画AndroidK线分时图及指标
    怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
    C# 读取Excel中的数据
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    java debug
    8种移动APP导航设计模式对照
  • 原文地址:https://www.cnblogs.com/nzg-noway/p/6909821.html
Copyright © 2020-2023  润新知