博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)
阅读量:5375 次
发布时间:2019-06-15

本文共 10468 字,大约阅读时间需要 34 分钟。

前言:由于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(""                + ""                + "
" + "
" + "JMeter Test Results" + "" + "

接口测试报告概要(详细内容见邮件附件)

" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" +htmlstring + "
执行总数 失败数 成功率
"+all+" "+failnum+" "+s+"%
", "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 = "" + "接口" + "执行结果" + "执行时间" + ""; String ContentString2 = "" + ""+"/portal/home/pc/search/popup报告测试"+"" + ""+"成功"+"" + ""+"100ms"+"" + ""; 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 = ""            + "接口"                + "执行结果"                + "执行时间"            + "";        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("
" + ""+name+"" + "成功" + ""+time+"ms" + ""; }else{ failnum = failnum + 1; time = line.split("\"")[1]; name = line.split("\"")[13]; htmlString = htmlString +"" + ""+name+"" + "失败" + ""+time+"ms" + ""; } } } 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父目录下增加target标签,配置邮件地址等,如下配置:

发送报告邮件 at ${report.datestamp}

 

 第三:删除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位版本后,重新配置环境变量,该问题解决

转载于:https://www.cnblogs.com/nzg-noway/p/6909821.html

你可能感兴趣的文章
JavaScript总结之DOM基本操作(三)
查看>>
为Vmware硬盘减肥瘦身
查看>>
python-flask学习
查看>>
Controller与View数据传递 多Model传递
查看>>
arm 汇编小练习
查看>>
RegQueryValueEx函数
查看>>
漫谈数据库索引
查看>>
【NOIP2004】合唱队形
查看>>
spring面试题
查看>>
python使用pickle,json等序列化dict
查看>>
php进行文件的强制下载
查看>>
每日python(6)
查看>>
Python正则表达式中的re.S的作用
查看>>
ubuntu15.10运行android studio出错unable to run mksdcard sdk tool
查看>>
HashMap面试知多少
查看>>
Effective C# 学习笔记(二十七)使你的类型可被序列化
查看>>
LDAP客户端配置
查看>>
(转)NAT原理与NAT穿越
查看>>
13.内存原理
查看>>
24.函数信号机制(本质上就是函数指针)
查看>>