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 = 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 = 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全局变量,但目前也没想到更简便的方法,如果有谁能帮我优化一下代码或者结构,请联系我。

时间: 2024-11-05 02:17:28

Jmeter之BeanShell--请求失败触发报警邮件的相关文章

jmeter通过BeanShell 脚本,实现对http请求参数的加密

jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的自动化接口测试框架.它的好还在于它是纯JAVA开发的,因此,它可以更好的跟JAVA对接,通过引入自己封装的jar文件,可以方便的实现对jmeter各种个性化需求的功能的拓展,下面以一个实际例子来说明jmeter怎么引入自己开发的java工具类来实现对http请求参数的加密处理. 在此之前,我们假设有

Jmeter之BeanShell断言使用

1.Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:用来记录日志文件,写入到jmeber.log文件,使用方法:log.info(“This is log info!”); ctx(JmeterContext)通过它来访问context,使用方法可参考:org.apache.jmeter.threads.JMeterContext. vars - (JMeterVariabl

JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如: 定时器:BeanShell Timer 前置处理器:BeanShell PreProcessor 采样器:BeanShell Sampler 后置处理器:BeanShell PostProcessor 断言:BeanShell Assert 监听器:BeanShell Listener 通过BeanShell可以对请求数据.响应数据或环境变量进行更加灵活的处理

利用JMeter的beanshell进行接口的加密处理

最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进度的需要,选择的做法是:让开发写个加密处理生成请求报文的代码,然后每次测试发送一次请求都用eclipse跑一遍该代码,测试数据的修改也是在代码中变更.这样跑一轮测试下来,测试同事都反映太累了. jmeter中的BeanShell,可以用来调用我们的工具类对数据进行处理,然后再进行相关的请求.自己刚好

使用Zabbix服务端本地邮箱账号发送报警邮件的部署记录

邮件报警有两种情况:1)Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:[email protected]),只能发送,不能接收外部邮件.2)使用一个可以在互联网上正常收发邮件的邮箱账号(例如:[email protected]),通过在Zabbix服务端中设置,使其能够发送报警邮件到指定邮箱.上面第2中使用外部邮箱发送报警邮件之前已经介绍了:分布式监控系统Zabbix-3.0.3-完整安装记录(5)-邮件报警部署.下面说下

Jmeter代理服务器录制请求

1.文档前提说明 1)本文使用jmeter的版本为 apache-jmeter-2.13 及以上版本 2)java版本要求在 1.8.0 以上 注:jmeter版本一般和java相应的版本一起使用,如果jmeter版本和java版本不对应(不对应指java版本过低,如jmeter为V2.13而jdk为1.6),会导致某些功能不能正常使用. 2.jmeter 录制网络请求 2.1 添加jmeter代理服务器 在jmeter 工作台添加 HTTP代理服务器 代理服务器如图所示: 2.2 代理服务器详

Jmeter发送HTTPS请求

Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. (一)设置HTTP请求 我们首先右键添加线程组,然后继续右键添加控制器,由于登陆操作只请求一次,因而选择仅一次控制器.接下来右键添加sampler->HTTP请求,设置HTTP请求.这里注意的地方首先是端口号,如果只是普通的HTTP协议,默认不填,而这里是HTTPS协议,因而填端口号443.另外“

jmeter测试HTTP请求

HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GET,POST,PUT, OPTION,HEAD,DELETE,TRACE,CONNECT 8种,目前来说最常见的是GET.POST和PUT请求,其他的比较少见. 1.GET:用于不修改数据仅向服务器获取资源(比如我们常见的访问某个网站首页,进入某个页面啊...基本都是用的GET请求方式) 2.POS

JMeter处理jdbc请求后的响应结果

JMeter如果进行JDBC请求,请求后的响应结果如何给下一个请求用(也就是传说中的关联),于是研究了一下,下面将学习的成果做个记录: 1.添加 "JDBC Connection Configuration"里面用来配置一些数据库连接的信息 2.添加一个“CSV Data Set Config”,用来在后续的JDBC请求中select语句中where条件参数化使用 3.添加JDBC请求 4.请求测试可以发现jdbc请求已经成果,并能在响应数据中看到返回的结果 5.那么接下来的问题就来了