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 { width: 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位版本后,重新配置环境变量,该问题解决
jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)的更多相关文章
- javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)
引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...
- Jmeter 聚合报告---测试结果分析
当我们测试完后,最关心就是结果数据了,下面一起来分析Jmeter聚合报告数据. 首先来看下Jmeter的help是如何解释这些含义的. 1.Label - The label of the sampl ...
- javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)
引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...
- Jmeter +Jenkins +Ant 集成发送邮件报告
[TOC] 一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系 ...
- Jenkins+Jmeter持续集成笔记(二:ANT执行Jmeter脚本)
Jmeter接口测试脚本运行后生成的是jtl(xml)格式的文件,这些文件不具备可读性,所以我们要把他转化为可以阅读的html格式报告. Ant是一个功能强大的打包编译工具.我们使用他的目的是将xml ...
- jenkins 结合 jmeter 的报告篇
背景:实现jmeter每30分钟执行一次,运行系统中所有接口或者性能脚本或者后续更可以由系统部署来触发建构执行 1.配置jmeter测试环境,注意修改Jmeter的bin目录下jmeter.prope ...
- ant jmeter 优化报告
一:主要内容 报告展示,该报告利用的jmeter.results.shanhe.me.xsl里面加入了自己写的部分代码,优化了展示效果 下载安装ant 修改jmeter.properties 下载jm ...
- Jmeter Ant Task如果报告中有错误,在邮件内容里面直接显示出来 系列2
由于部门有多个项目,将自动化测试框架运用于多个项目时,希望针对每个项目修改的东西越少越好,为此,做如下修改: D:\apache-jmeter-2.7\extras\jmeter-results-de ...
- jmeter+ant生成xml报告
1.jdk安装 2.jmter安装 3.ant安装 下载apache-ant-1.10.6-bin.zip,直接解压就可使用,和jmeter类似 ant环境变量配置 新建系统变量:ANT_HOME,变 ...
随机推荐
- sublime text3 在ubutun下的下载和配置
最近在学习 Javascript,在 w3c school 上把教程看完了,也算个刚刚入门的水平,一直都是在 win 系统 上练习. 但是因为写 python 代码的 pycharm 和 git 配置 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能
日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...
- SqlParameter参数类型为int32时候的传值陷阱
前2天在使用SqlParameter传递参数的时候遇到一个小坑,这里分享一下. SqlParameter para=new SqlParameter("@IsDeleted",0) ...
- Git命令行和Xcode结合使用
现在一直使用Git来管理代码,对于有强迫症的我来说,依旧选择了命令行,下面这段话可以更好的解释我为什么喜欢使用终端敲命令. There are a lot of different ways to u ...
- (转)使用string.Format需要注意的一个性能问题
今天,我在写C#代码时,突然发现一个最熟悉的陌生人 —— string.Format.在写C#代码的日子里,与它朝夕相伴,却没有真正去了解它.只知道在字符串比较多时,用它比用加号进行字符串连接效率更高 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- Laravel 5.2 教程 - 数据填充
一.简介 Laravel提供的填充类(seed),可以让大家很容易的实现填充测试数据到数据库.所有的填充类都位于database/seeds目录.填充类的类名完全由你自定义,但最好还是遵循一定的规则, ...
- php函数每日学习二十个
数学函数 1,abs() 求绝对值 2,ceil() 进一法取整 3,floor() 舍去法取整 4,fmod()对浮点数进行取余 例如fmod(5.7,1.3) 5,pow() 返回数的n次方 po ...
- shopping_cart
#!/usr/bin/env python # -*- coding: utf-8 -*- print('欢迎土豪光临随心所欲旗舰店') user_money = int(input('老板,请输入你 ...
- Docker - 访问仓库
仓库与注册服务器 仓库(Repository)集中存放镜像的项目或目录. 注册服务器(Registry)管理仓库的服务器,服务器上可以有多个仓库,每个仓库有多个镜像. 例如:在仓库地址docker.i ...