首先说一下,jmeter的Sampler result是什么?
Jmeter 的Samplers result 是jmeter在向服务器发送请求后,接收到服务器响应的基本信息的展示,如 sample 的开始请求时间、发送的内容大小、基于协议的响应状态码和响应消息等信息。
什么是基于协议的响应状态码和响应消息。比如http协议的状态码:200、400等,和response message:ok,这些都是http自身定义的状态码和消息。而接口的响应内容一般也会定义一些状态码或者状态信息。不过这些是后端开发者自定义的内容,比如某个接口的响应内容中包含:{“status”:”ok”,”code”:200,response:[...]},这类信息是不会在Sample result中展示出来,而是在response data中显示。
在sampler result 中,还记录当前接口是否请求成功的信息,比如当请求某个接口失败后,在结果树中就会以红色形式标记出来。
一般情况下,最好不要随意修改响应结果信息,在什么情况下要修改响应结果呢?
最近在用jmeter做websocket接口连接k8s的pod对另一台pod机进行ping超出时,如果ping 的pod存在则响应ping的结果信息。如果ping 的pod不存在时,不会响应任何信息,导致jmeter 的websocket在循环接收消息超时后,会被标记为失败。与实际期望的结果不符。
大致的业务场景为:
PodA 存在,且开机状态,ip地址:15.xx.1.35
PodB 存在,且开机状态,ip地址:15.xx.1.36
PodC 存在,关机状态, ip地址:15.xx.1.37
用例1:podA ping podB 地址正常响应ping 的信息 --【pass】
用例2:podA ping podC 地址无响应信息 --【pass】
在jmeter中用websocket 实现podA ping podC时,当长时间没有响应信息,导致jmeter认为该请求失败,由于websocket是长连接类型,运行不断地请求服务信息。而且在WebSocket Single Read Sampler 中,已设置了超时不标记为错误。也没有达到预期效果。
执行结果会有时候,没有响应时,执行通过。有时候没有响应时,执行失败
但实际期望的结果是,ping的podC(未开机)没有响应。是正确的
因此,需要通过干预当sampler result结果,当请求response code 报:Sampler error: unexpected frame type (ping). 时,忽略该错误,标记该请求为成功。
实际操作如下:
1、在WebSocket Single Read Sampler 中的后置处理器中,通过beanshell 获取到该sample的执行结果。
2、判断response code 等于:Sampler error: unexpected frame type (ping). 时,标记该请求成功。
实际代码如下:
import org.apache.jmeter.samplers.SampleResult;// 获取当前的SampleResult SampleResult sr = ctx.getPreviousResult();// 设置新的Response Code //sr.setResponseCode("test code"); // //// 设置Response Message,如果需要的话 //sr.setResponseMessage("Read timeout, no response received"); String response_code = sr.getResponseCode();log.info(response_code); if(response_code.equals("Sampler error: unexpected frame type (ping).")){// 设置sample 为成功sr.setSuccessful(true); }
最终执行结果,当出现Sampler error: unexpected frame type (ping).错误类型时,不会在显示执行失败了。
可以看到虽然,jmeter日志中显示该请求是失败的,但实际上已经标记为:通过了