一、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次就发送报警邮件,如下图所示: