JMeter 请求和检查点日志打印

最近更新时间:2024-06-24 11:46:11

我的收藏
在 PTS 中,请求和检查点的总体情况,可以在 云压测控制台 > 测试场景服务明细检查点明细中查看;单个请求的发送和接收详情,可以在控制台的请求采样中查看;具体的查看方法可以参考 解读报告 中的对应内容。
如果除了解读报告的内容外,对请求或检查点还有其他的查看需求,例如:
查看请求采样中未记录的其他请求细节;
查看设置的检查断言失败消息;
查看检查断言失败时的请求内容;
等等...
可以在执行过程中通过日志打印的方式,将需要查看的内容在施压机 > 日志下的引擎输出中打印出来。
注意:
在压测任务执行的过程中打印额外的日志,会占用压测机的资源,且日志的采集和展示在控制台上的速率是有限的,如果没有必要,在正式压测的时候不建议这样使用

请求日志

根据 JMeter 的 执行顺序,在请求采样 Sampler 之后的阶段都可以知道请求的执行情况,因此可以在 JMeter 的 Sampler 后面添加“JSR223 PostProcessor”,顾名思义,利用 JSR223 后置处理器在 Sampler 之后,通过脚本将请求细节打印到引擎日志中查看。
以下是 Groovy 脚本样例,其中prev可以代表请求采样的结果 SampleResult,对应的方法可以参考 JMeter 官方文档;如果有其他内容需要打印,用户可以自行进行数据获取和输出。
import java.time.LocalDateTime // 获取 Sampler 名称 def samplerName = sampler.getName() // 获取响应体 def responseBody = prev.getResponseDataAsString() // 获取响应代码 def responseCode = prev.getResponseCode() // 获取当前时间 def currentTime = LocalDateTime.now() // 打印日志 log.info("Current Time: " + currentTime + ", Sampler Name: " + samplerName + ", Response Code: " + responseCode + ", Response Body: " + responseBody)



将该 JMX 脚本在 PTS 上执行,在控制台的施压机标签的引擎输出中,可以看到我们打印出来的请求日志:



如果脚本中有多个请求,但是只需要打印单个请求的细节查看,不需要全部打印,那么可以将 Post Processor 放在对应的请求里面,如图所示:



如果需要把所有的请求细节都打印出来,那么可以将 Post Processor 放在和请求并列的位置,如图所示:




检查点日志

根据 JMeter 的 执行顺序,对于检查点的结果,不能使用 Post Processor 来进行获取,因为该阶段执行的时候,检查断言还没有执行,只有在 Listener 阶段才能知道检查断言的结果;因此,可以使用 Listener 来通过脚本将检查点细节打印到引擎日志中查看,使用 JSR223 Listener,以下是 Groovy 脚本样例,方法getAssertionResults()返回的AssertionResult可以参考 JMeter 官方文档
import org.apache.jmeter.assertions.AssertionResult; // 获取断言结果 AssertionResult[] results = prev.getAssertionResults(); // 遍历断言结果 for (int i = 0; i < results.length; i++) { AssertionResult result = results[i]; if (result.isFailure() || result.isError()) { // 打印断言失败或错误信息 log.info("Assertion failed: " + result.getFailureMessage()); } }
将该 JMX 脚本在 PTS 上执行,在控制台的施压机标签的引擎日志中,可以看到我们打印出来的日志:



这里只打印了检查断言的结果和检查断言的 Failure Message,如果有需要,也可以参考前文的请求日志将检查断言失败的请求细节打印出来。
import org.apache.jmeter.assertions.AssertionResult; // 获取断言结果 AssertionResult[] results = prev.getAssertionResults(); // 遍历断言结果 for (int i = 0; i < results.length; i++) { AssertionResult result = results[i]; if (result.isFailure() || result.isError()) { // 打印断言失败或错误信息 log.info("Assertion failed: " + result.getFailureMessage()); // 获取 Sampler 名称 def samplerName = sampler.getName() // 获取响应码 def responseCode = prev.getResponseCode() log.info("Sampler Name: " + samplerName + ", Response Code: " + responseCode) } }
如果 JMX 脚本中有多个检查断言,需要打印单个或需要全部打印的情况,可以参考前文有多个请求的情况下打印日志的方式,将 Listener 放置在不同的位置即可。