JMeter-如何记录失败响应的完整请求?
我正在使用JMeter命令行对我们的网站api进行压力测试。现在,我得到了一个示例结果:JMeter-如何记录失败响应的完整请求?,jmeter,Jmeter,我正在使用JMeter命令行对我们的网站api进行压力测试。现在,我得到了一个示例结果: Creating summariser <summary> Created the tree successfully using street_advisor.jmx Starting the test @ Sat Oct 03 15:22:59 PDT 2009 (1254608579848) Waiting for possible shutdown message on port 444
Creating summariser <summary>
Created the tree successfully using street_advisor.jmx
Starting the test @ Sat Oct 03 15:22:59 PDT 2009 (1254608579848)
Waiting for possible shutdown message on port 4445
summary + 1 in 0.0s = 37.0/s Avg: 27 Min: 27 Max: 27 Err: 1 (100.00%)
<snip a few more lines>
<then i break it>
现在,在有人说“检查Web服务器日志文件”之前,我知道我可以这样做,是的,我找到了404。。但我想看看是否有可能不访问它们。。尤其是当他们在另一台服务器上和/或我无法访问他们时。
请帮忙 组件显示所有样本响应的树,允许您查看任何样本的请求和响应
进行负载测试时(始终处于非GUI模式),请填写“文件名”字段并选择仅保存错误响应:
正如您在上面看到的,我们单击Configure以选择除CSV字段以外的所有字段
您还可以使用以下命令将整个响应保存到文件:
我发现此线程正在搜索一个解决方案,以便仅在采样器失败时记录响应,因此接受的解决方案对我不好。我偶尔会在非常高的负载下出现样本故障,涉及数十万个样本,因此树侦听器对我来说是完全不现实的(它的大小将达到几GB),因此下面是我的想法(这对OP的场景也有好处): 添加一个
[JSR223断言][1]
(应该在所有其他断言之后)并将以下代码放入其中:
if (Boolean.valueOf(vars.get("DEBUG"))) {
for (a: SampleResult.getAssertionResults()) {
if (a.isError() || a.isFailure()) {
log.error(Thread.currentThread().getName()+": "+SampleLabel+": Assertion failed for response: " + new String((byte[]) ResponseData));
}
}
}
这将导致整个响应被记录到jmeter日志文件中,这在我的情况下很好,因为我知道响应非常小,但对于大响应,可以进行更智能的处理。有一个“将响应保存到文件”侦听器,只有出现错误时才能保存到文件。这是我记录失败请求的完整请求(请求URL+请求正文)的方式
对于线程组中的每个采样器,侦听器将在采样器之后执行此代码 没错,但我是通过命令行来完成的。。所以我没有访问GUI的权限。Bu tI在我的问题(脸红)中没有具体说明这一点。另外,我也不知道如何通过命令行来完成,所以我最终还是按照你的建议去做了:)如果你使用命令行,你可以将测试配置为将数据发送到输出文件(jtl),然后用这个工具处理该文件:导出为PNG或CSV。如果我正确阅读了问题,正在查找记录的请求而不是响应…?@arceldon捕捉得很好!完整的请求和响应被重新编码。@rodrigoap-稍微调整了您的答案,
请求和响应都
。我添加了使用名为“DEBUG”的UDV控制日志的功能,因此更容易将断言保留在常规工作负载中,并仅在必要时启用它。@haridsv做得不错!但是有可能保存导致响应失败的requestData吗?@ShurupuS根据BeanShell Assertion
上的组件引用,RequestHeaders
作为BeanShell代码的变量可用,因此理论上是可能的。@haridsv您能帮我解决这个问题吗?在上面的解决方案中,“调试”变量是什么。我们需要定义“调试”变量的位置和原因您将此代码添加到哪种侦听器?我使用了JSR223侦听器。更多信息请点击此处:
if (Boolean.valueOf(vars.get("DEBUG"))) {
for (a: SampleResult.getAssertionResults()) {
if (a.isError() || a.isFailure()) {
log.error(Thread.currentThread().getName()+": "+SampleLabel+": Assertion failed for response: " + new String((byte[]) ResponseData));
}
}
}
try{
var message = "";
var currentUrl = sampler.getUrl();
message += ". URL = " +currentUrl;
var requestBody = sampler.getArguments().getArgument(0).getValue();
message += " --data " + sampler.getArguments();
if(!sampleResult.isSuccessful()){
log.error(message);
}
}catch(err){
//do nothing. this could be a debug sampler. no need to log the error
}