jmeter中断言失败后不继续执行后续的取样器,以及失败事务个数的统计
- 需要实现的场景: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"));