Jmeter报警邮件触发

一、BeanShell断言

String类型的判断等于与不等于,需要用 if(!"0".equals(ret)){

import net.sf.json.*;

import java.io.*;

FileWriter fw=null;

BufferedWriter writer=null;

String results=prev.getResponseDataAsString();

JSONObject responsejb=JSONObject.fromObject(results);

//获取json接口返回的值

String ret=responsejb.get("ret").toString();

log.info("ret-----"+ret);

try{

    File file2=new File("E:\\ChildrenWatch\\jmeter\\result\\TestResult_getuserid12.txt");// 写

fw=new FileWriter(file2,true);

writer=new BufferedWriter(fw);//写入内容

String results2=results.replace("\n","");

String results3=results2.replaceAll("\t","");

log.info("result-----"+results3);

    if(!"0".equals(ret)){

    writer.write(results3);

          writer.newLine();//换行

writer.flush();

}

}catch(Exception e){

e.printStackTrace();

}finally{

try{

writer.close();

fw.close();

}catch(IOException e){

e.printStackTrace();

}

}

二、JSON Extractor后置处理器

获取接口返回的值:

三、While Controller逻辑循环器

${__javaScript("${ret}"!=="0",)}--------》当条件为true时,执行循环操作。

仅一次控制器只运行一次就好。

四、SMTP Sampler发送邮件

Server:smtp.exmail.qq.com

port:465

Server settings

  Server:  服务器地址

  Port:  服务器端口

Mail settings

  Address From:  发送地址

  Address To:  接收地址

  Address To CC:  抄送地址

  Address To BCC:  秘密抄送地址

  Address Reply-To:  备用地址

Auth settings

  User Auth

    Username:  发送邮箱的用户名

    Password:  发送邮箱的密码

Security settins

  Use StartTLS

Message settings

  Subject:  邮件主题

  Message:  邮件内容

  Attach file(s):  发送的附件

五、脚本编写及变量设置

1、预设置全局变量

 errcount:用于记录请求错误次数,其中:数字“0”为每次压测执行时需要恢复的默认初始值;

  sendemail:是否发送报警邮件的标识,默认初始值是字符串“no”,当值为"yes"时,发送邮件(if逻辑控制器执行);

  Reqstauts:由于利用响应代码和响应信息联合做判断,所以需要此变量标识请求是否成功。默认值“requestok”,如果值为“requestNook”则表示请求失败,errcount+=1。

  respcode:由于邮件中需要引入响应代码,因此设置此参数。

  respmsg:由于邮件中需要引入响应信息,因此设置此参数。

  respdata:由于邮件中需要引入响应数据,因此设置此参数。

2、采样器BeanShell断言脚本

2.1、根据请求的响应结果(返回码+返回消息)判断请求是否成功

  【响应断言--msg=SUCCESS】页面参数配置:Main Sample only+响应文本+匹配+要测试的模式:"SUCCESS"

  【响应断言--code=200】页面参数配置:Main Sample only+响应代码+Equals+要测试的模式:"200"

  if(!(SampleResult.getResponseCode().equals("200") && SampleResult.getResponseDataAsString().equals("SUCCESS")))

  {

    XXXXXXX;

  }

2.2、请求失败则获取响应代码,信息,数据并变更对应的全局变量的值

//获取响应中的响应参数

  String code = SampleResult.getResponseCode();

    String msg = SampleResult.getResponseMessage();

    String data = SampleResult.getResponseDataAsString();

  //调试时的打印信息,正式测试时应该注释掉下面3行log.error();

    log.error("-----------Returncode is :\"" + code + "\"");

    log.error("-----------ResponseMessage is :\"" + msg + "\"");

    log.error("-----------ResponseData is :\"" + data + "\"");

  //将响应的参数赋值给对应的全局变量,用于后续邮件中使用

    vars.put("respcode",code);

    vars.put("respmsg",msg);

    vars.put("respdata",data);

    vars.put("Reqstatus","requestNook");

2.3、设置请求结果标识为失败,请求失败计数器加1

    vars.put("Reqstatus","requestNook");

    count =count + 1;

    vars.put("errcount",count.toString());

    log.error("----False------count="+count);

2.4、根据阈值是否触发报警邮件

if((count % 3) == 0){

//sendemail=yes则if逻辑控制器会触发发送报警邮件

    vars.put("sendemail","yes");

    log.error("--------It is sendemail ? :"+vars.get("sendemail"));

  }else{

    vars.put("sendemail","no");

  }

//设置当前请求采样器Sampler为失败状态(查看结果树里红色高亮显示)

  SampleResult.setSuccessful(false);

3、IF控制器及邮件发送采样器

3.1、IF控制器

由于需要根据条件来判断是否需要发送邮件,因此选择了IF控制器

"${sendemail}"=="yes" 是否发送邮件的标识变量sendemail等于yes时,发送邮件。

  标识变更在断言【BSH断言--10000次错误则发送报警邮件】中进行设置

3.2、SMTP邮件采样器配置


邮件标题:【eagleeye接口请求失败${__time(YMD)}--${__time(HMS)}】其中后半部分“${__time(YMD)}--${__time(HMS)}”是Jmeter内置变量,在请求成功发送出去后,结果会显示成类似“20170221--135323”形式

  邮件内容:

    Returncode is :${respcode} <-----响应代码

    ResponseMessage is :${respmsg} <----响应信息

    ResponseData is :${respdata} <----响应数据

六、BeanShell断言的全部代码

名称:BSH断言--10000次错误则发送报警邮件

备注:根据请求失败次数,按照一定比例配置(如:失败10000次发一封邮件),触发邮件发送条件

log.error(vars.get("Reqstatus"));

int count = Integer.parseInt(vars.get("errcount").trim());

if(!(SampleResult.getResponseCode().equals("200") && SampleResult.getResponseDataAsString().equals("SUCCESS"))){

 //获取响应中的响应参数

 String code = SampleResult.getResponseCode();

 String msg = SampleResult.getResponseMessage();

 String data = SampleResult.getResponseDataAsString();

//调试时的打印信息,正式测试时应该注释掉下面4行log.error();

// log.error("-----------Request FALSE-----------Returncode or ResponseData is ERROR");

 log.error("-----------Returncode is :\"" + code + "\"");

 log.error("-----------ResponseMessage is :\"" + msg + "\"");

 log.error("-----------ResponseData is :\"" + data + "\"");

//将响应的参数赋值给对应的全局变量,用于后续邮件中使用

 vars.put("respcode",code);

 vars.put("respmsg",msg);

 vars.put("respdata",data);


 vars.put("Reqstatus","requestNook");

 count =count + 1;

 vars.put("errcount",count.toString());

 log.error("----False------count="+count);

 if((count % 10000) == 0){

 //sendemail=yes则if逻辑控制器会触发发送报警邮件

  vars.put("sendemail","yes");

  log.error("--------It is sendemail ? :"+vars.get("sendemail"));

 }else{

  vars.put("sendemail","no");

 }

 //设置当前请求采样器Sampler为失败状态(查看结果树里红色高亮显示)

 SampleResult.setSuccessful(false);

}else{

 log.error("-----------Returncode is :\""+ SampleResult.getResponseCode()+"\"");

// log.error("-----------ResponseMessage is :\""+ SampleResult.getResponseMessage()+"\"");

// log.error("-----------ResponseData is :\""+ SampleResult.getResponseDataAsString()+"\"");

 SampleResult.setSuccessful(true);

}

六、邮件发送执行效果:

1、Jmeter脚本在测试调试状态下的截图

    为了测试BSH脚本以及邮箱采样器是否正常工作 ,因此设置请求错误数量达到 3次就发送报警邮件,如下图所示:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。