使用 BeanShell 断言保存失败的响应
Using BeanShell Assertion for saving failed response
我正在尝试将失败请求的响应保存到日志中,但没有成功。
我有 HTTP 请求,每个请求都有自己的响应断言,并且偶尔通过我的负载测试响应不符合响应断言的要求,所以我想让它失败。
我尝试将此代码添加到 BeanShell Assertion
之后 post:
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));
}
}
}
测试计划本身如下所示:
在用户定义的变量中,我添加了以下内容:
名称:调试
值:(none)
我 运行 这个程序通过非 GUI 模式 - cmd 并故意使响应失败(响应断言失败)但我没有将任何错误响应记录到我的日志文件中。
我究竟做错了什么?
谢谢
首先,如果您的目标只是保存失败的响应以及断言结果,则您不需要任何自定义代码。您可以添加 Simple Data Writer 配置如下:
选项 2:如果要将响应写入日志文件,则需要自定义脚本。但在那种情况下,我建议使用 BeanShell Listener(与断言和其他对象不同,所有线程只有 1 个侦听器实例,因此它更经济,并且在日志写入时产生瓶颈的机会更少)。
同样根据你的脚本,DEBUG
的值必须是true
,但正如你所说,你没有将其设置为true
(空字符串将被解析为false
由 Java 的 valueOf
)。所以改成
Name: DEBUG
Value: true
BeanShell Listener 的脚本如下所示:
if (Boolean.valueOf(vars.get("DEBUG"))) {
for (a: sampleResult.getAssertionResults()) {
if (a.isError() || a.isFailure()) {
log.error(sampleResult.getThreadName() + ": "
+ sampleResult.getSampleLabel() + ": Assertion failed for response: "
+ sampleResult.getResponseDataAsString());
}
}
}
选项 3 是保留原来的解决方案,然后您需要修复变量赋值(如前所述)。
我宁愿让 JMeter 自动执行此操作,这是几个属性的问题,即:
首先,您需要告诉 JMeter 以 XML 格式存储其结果:
jmeter.save.saveservice.output_format=xml
其次,您可以修改以下属性值来配置JMeter将断言失败消息和数据存储到.jtl结果文件
jmeter.save.saveservice.assertion_results_failure_message=true
jmeter.save.saveservice.assertion_results=all
可能是最有用的选项:简单地保存失败采样器的响应数据:
jmeter.save.saveservice.response_data.on_error=true
以上属性可以放入user.properties文件(位于JMeter的"bin"文件夹中,需要重启JMeter才能使更改生效)或者您可以通过 -J
命令行参数传递它们,例如:
jmeter -Jjmeter.save.saveservice.output_format=xml -Jjmeter.save.saveservice.response_data.on_error=true ....
有关使用 JMeter 属性调整 JMeter 配置的各个方面的更多信息,请参阅 Apache JMeter Properties Customization Guide
我正在尝试将失败请求的响应保存到日志中,但没有成功。
我有 HTTP 请求,每个请求都有自己的响应断言,并且偶尔通过我的负载测试响应不符合响应断言的要求,所以我想让它失败。
我尝试将此代码添加到 BeanShell Assertion
之后 post:
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));
}
}
}
测试计划本身如下所示:
在用户定义的变量中,我添加了以下内容: 名称:调试 值:(none)
我 运行 这个程序通过非 GUI 模式 - cmd 并故意使响应失败(响应断言失败)但我没有将任何错误响应记录到我的日志文件中。 我究竟做错了什么? 谢谢
首先,如果您的目标只是保存失败的响应以及断言结果,则您不需要任何自定义代码。您可以添加 Simple Data Writer 配置如下:
选项 2:如果要将响应写入日志文件,则需要自定义脚本。但在那种情况下,我建议使用 BeanShell Listener(与断言和其他对象不同,所有线程只有 1 个侦听器实例,因此它更经济,并且在日志写入时产生瓶颈的机会更少)。
同样根据你的脚本,DEBUG
的值必须是true
,但正如你所说,你没有将其设置为true
(空字符串将被解析为false
由 Java 的 valueOf
)。所以改成
Name: DEBUG
Value: true
BeanShell Listener 的脚本如下所示:
if (Boolean.valueOf(vars.get("DEBUG"))) {
for (a: sampleResult.getAssertionResults()) {
if (a.isError() || a.isFailure()) {
log.error(sampleResult.getThreadName() + ": "
+ sampleResult.getSampleLabel() + ": Assertion failed for response: "
+ sampleResult.getResponseDataAsString());
}
}
}
选项 3 是保留原来的解决方案,然后您需要修复变量赋值(如前所述)。
我宁愿让 JMeter 自动执行此操作,这是几个属性的问题,即:
首先,您需要告诉 JMeter 以 XML 格式存储其结果:
jmeter.save.saveservice.output_format=xml
其次,您可以修改以下属性值来配置JMeter将断言失败消息和数据存储到.jtl结果文件
jmeter.save.saveservice.assertion_results_failure_message=true jmeter.save.saveservice.assertion_results=all
可能是最有用的选项:简单地保存失败采样器的响应数据:
jmeter.save.saveservice.response_data.on_error=true
以上属性可以放入user.properties文件(位于JMeter的"bin"文件夹中,需要重启JMeter才能使更改生效)或者您可以通过 -J
命令行参数传递它们,例如:
jmeter -Jjmeter.save.saveservice.output_format=xml -Jjmeter.save.saveservice.response_data.on_error=true ....
有关使用 JMeter 属性调整 JMeter 配置的各个方面的更多信息,请参阅 Apache JMeter Properties Customization Guide