设为首页 收藏本站
查看: 1207|回复: 0

[经验分享] jenkins+ant+jmeter html报告文件作为附件发送(ant-jmeter支持javamail)

[复制链接]

尚未签到

发表于 2018-1-9 13:00:45 | 显示全部楼层 |阅读模式
  前言:由于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>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; \">"
  + "<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 {>  + "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>  + "<tr style=\"line-height:2em;\" valign=\"middle\">"
  + "<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>
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>  + "<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">  

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-433230-1-1.html 上篇帖子: Jenkins+maven持续集成环境搭建笔记 下篇帖子: jenkins 集成 redmine 账户验证的方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表