前言:由于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 " + "" + "接口测试报告概要(详细内容见邮件附件)
" + "
执行总数 | " + "失败数 | " + "成功率 | " + "
---|---|---|
"+all+" | " + ""+failnum+" | " + ""+s+"% | " + "
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:用来执行AntHTML 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位版本后,重新配置环境变量,该问题解决