如果除了解读报告的内容外,对请求或检查点还有其他的查看需求,例如:
·查看请求采样中未记录的其他请求细节;
·查看设置的检查断言失败消息;
·查看检查断言失败时的请求内容;
·等等…
可以在执行过程中通过日志打印的方式,将需要查看的内容在施压机 > 日志下的引擎输出中打印出来。
注意:在压测任务执行的过程中打印额外的日志,会占用压测机的资源,且日志的采集和展示在控制台上的速率是有限的,如果没有必要,在正式压测的时候不建议这样使用。
一、请求日志
根据 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 放置在不同的位置即可。