jmeter中断言失败后不继续执行后续的取样器,以及失败事务个数的统计

发布时间 2023-11-22 16:36:10作者: 乐乐熊小妹
  • 需要实现的场景:N款产品自动投保,需要统计成功投保的有多少款,失败投保的有多少款?
  • 遇到的问题处理:

问题一、某款产品投保时,若其中一个接口断言失败,如何让后续接口不继续执行?

答:通过if控制器进行处理,

 

 问题二:如何解决统计失败或成功执行的产品数?

答:通过事务处理器+BeanShell监听器进行处理,当察看结果树中有几大条时,beanshell就会对应执行几次,所以,如果我们单个产品投保设置为一个事务,且勾选Generate parent sample,beanshell针对一个事务就只会执行一次,在beanshell监听器中通过int errorNum = prev.getErrorCount();获取事务中最后一个取样器(也就是当前取样器)的ErrorCount,若最后一个取样器失败则为1,成功则为0。

通过beanshell计数来统计失败与成功的产品数;

 

 

 

 

 最后附实现的beanshell代码:

import org.json.*;
import org.json.JSONObject;
import org.apache.jmeter.samplers.SampleResult;

log.info("接口请求响应:"+prev.getResponseCode());
// 统计产品数
String productNum = vars.get("ProductCount");
int proNum = Integer.parseInt(productNum);
proNum+=1;
vars.put("ProductCount",String.valueOf(proNum));
log.info("产品数量:"+vars.get("ProductCount"));
//提取事务随后一个接口的失败状态(0为成功 1为失败)
int errorNum = prev.getErrorCount();
if(errorNum != 0){
    //提取事务名称(用来记录失败产品)
    String tname= sampleResult.toString(); 
    String errName = vars.get("ErrorProductName");
    errName = errName + tname;
    vars.put("ErrorProductName",errName+";");
    //统计产品失败数量
    String err = vars.get("ErrorCount");
    int error = Integer.parseInt(err);
    error+=errorNum;
    //将错误数据塞回给定义的字段,以统计下一个产品请求失败数
    vars.put("ErrorCount",String.valueOf(error));
    //获取请求接口名称,将失败的是那个产品的接口抛出来
    String sampleName = prev.getSampleLabel();
    //获取接口响应体
    String responseData = prev.getResponseDataAsString();
    //将接口响应体转换为json对象
    JSONObject response = new JSONObject(responseData);
    //获取响应失败具体原因    
    String msg = response.getString("msg");
    log.info("msg:"+msg);
    //获取自定义错误原因字段值
    String result = vars.get("ErrorResult");
    result = result +" "+ sampleName + ": " +msg;
    vars.put("ErrorResult",result+";\n");
}else{
    //提取事务名称(用来记录成功产品)
    String tname= sampleResult.toString();
    String sucName = vars.get("SuccessProductName");
    sucName = sucName + tname;
    vars.put("SuccessProductName",sucName + ";");
    //统计产品成功数
    String num = vars.get("ErrorCount");
    int er = Integer.parseInt(num);    
    String productNum = vars.get("ProductCount");
    int proNum = Integer.parseInt(productNum);
    int success = proNum - er;
    vars.put("SuccessCount",String.valueOf(success));
}
log.info("失败原因:"+vars.get("ErrorResult"));
log.info("冒烟产品共"+vars.get("ProductCount")+"款,失败 "+vars.get("ErrorCount")+" 款,成功 " +vars.get("SuccessCount")+" 款\n成功的产品为:"+vars.get("SuccessProductName")+"\n失败的产品为:"+vars.get("ErrorProductName")+"\n失败原因:"+vars.get("ErrorResult"));