首页 > 代码库 > Jmeter之BeanShell--请求失败触发报警邮件

Jmeter之BeanShell--请求失败触发报警邮件

BeanShell脚本--编写【请求失败触发报警邮件】功能
一、需求背景
一个内容简单的常规接口请求压力测试,每秒需要10个请求,持续2~3天。因此无人随时监控,需要一个报警邮件机制。
特别说明:我在网上查找了很久,没有发现Jmeter就有请求失败就报警的功能或者插件,因此自己编写(原创,嘎嘎),如果有谁知道类似的插件,请给我留言,万分感谢。
二、工具选用
Jmeter,工具本身不带有邮件报警功能,需要自己编写BeanShell脚本在接到响应之后进行处理,BSH断言或者BSH后置处理器都行;
三、最终结构目录预览
技术分享
 
四、设计思路
1、触发条件设计:由于是大批量,长时间的压测,如果出现错误必然是成批出现,则不可能出现一个请求失败就发送一个报警邮件,因此设计一个触发阈值,每次触发后阈值归零进入下一次统计。
2、根据响应的结果需要对code和msg进行同时校验。
3、利用if控制器的判断条件来执行是否发送报警邮件。
4、报警邮件中包含 时间,请求信息,响应等信息。
 
五、脚本编写
1、采样器BeanShell断言
技术分享
1.1、预设置全局变量6个
技术分享
  errcount:用于记录请求错误次数,其中:数字“0”为每次压测执行时需要恢复的默认初始值;
  sendemail:是否发送报警邮件的标识,默认初始值是字符串“no”,当值为"yes"时,发送邮件(if逻辑控制器执行);
  Reqstauts:由于利用响应代码和响应信息联合做判断,所以需要此变量标识请求是否成功。默认值“requestok”,如果值为“requestNook”则表示请求失败,errcount+=1。
  respcode:由于邮件中需要引入响应代码,因此设置此参数。
  respmsg:由于邮件中需要引入响应信息,因此设置此参数。
  respdata:由于邮件中需要引入响应数据,因此设置此参数。
 
1.2、根据请求的响应结果(返回码+返回消息)判断请求是否成功
【响应断言--msg=SUCCESS】页面参数配置:Main Sample only+响应文本+匹配+要测试的模式:"SUCCESS"
【响应断言--code=200】页面参数配置:Main Sample only+响应代码+Equals+要测试的模式:"200"
if(!(SampleResult.getResponseCode().equals("200") && SampleResult.getResponseDataAsString().equals("SUCCESS"))){
XXXXXXX;
}
1.3、请求失败则获取响应代码,信息,数据并变更对应的全局变量的值
//获取响应中的响应参数
String code = SampleResult.getResponseCode();
  String msg = SampleResult.getResponseMessage();
  String data = http://www.mamicode.com/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");
1.4、设置请求结果标识为失败,请求失败计数器加1
  vars.put("Reqstatus","requestNook");
  count =count + 1;
  vars.put("errcount",count.toString());
  log.error("----False------count="+count);
1.5、根据阈值是否触发报警邮件
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);
2、控制器及邮件发送
技术分享
2.1、if控制器
"${sendemail}"=="yes" 是否发送邮件的标识变量sendemail等于yes时,发送邮件。
  标识变更在断言【BSH断言--10000次错误则发送报警邮件】中进行设置
技术分享
2.1、邮件发送配置
技术分享
 
 技术分享
 
 
  邮件标题:【eagleeye接口请求失败${__time(YMD)}--${__time(HMS)}】其中后半部分会显示成20170221--135323形式
  邮件内容:
    Returncode is :${respcode} <-----响应代码
    ResponseMessage is :${respmsg} <----响应信息
    ResponseData is :${respdata} <----响应数据
  注意:126邮箱无法使用Jmeter的邮件代理发送服务器,原因未找到。但最后使用sina邮箱成功发送邮件。
六、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 = http://www.mamicode.com/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、收到邮件
技术分享
2、Jmeter调试状态下的截图
设置3个请求错误就发送邮件,则Jmeter的查看结果树组件结果如下:
技术分享
 
结束语:BeanShell用的不多,写起来很啰嗦,用了很多Jmeter全局变量,但目前也没想到更简便的方法,如果有谁能帮我优化一下代码或者结构,请联系我。
 
 

Jmeter之BeanShell--请求失败触发报警邮件