jmeter - JMeter 自定义断言
问题描述
我有以下格式的 JMeter 脚本。
这里的事情是,一旦我将写请求发送到服务器,响应可以以可变数量的读取响应出现。前 4 个读取响应是固定的,但之后读取响应的数量会因服务器繁忙时间而异。如果服务器非常繁忙,它将继续在一对 2 读取响应中发送小块数据。这就是我将它保持在一段时间控制器循环直到响应结束的原因。
现在,为了断言这个响应,我在后处理器中检查字符串并将输出保存到 JMeter 变量中。
我终于检查了“JSR223 采样器”中的变量值。如果我放置 JSR223 断言,它仅适用于前 4 个读取响应,并忽略 While 控制器下的响应。我面临的问题,如果文本检查失败,则不会报告错误。但是,它正在结束迭代并开始新的迭代。
JSR223 后处理器 1
String id=prev.getResponseDataAsString();
vars.put("ReadResponse",id);
if(id.contains("STRING TO FIND") == true)
{
vars.put("s_check", "true");
}
else
{
vars.put("s_check", "false");
}
JSR223 后处理器 2
String id=prev.getResponseDataAsString();
vars.put("ReadResponse",id);
if(id.contains("STRING TO FIND") == true)
{
vars.put("s_check_1", "true");
}
else
{
vars.put("s_check_1", "false");
}
JSR223 采样器
SampleResult.setIgnore();
import org.apache.jmeter.threads.JMeterContext.TestLogicalAction;
import org.apache.jmeter.samplers.SampleResult;
//Final Response Assertion
String s1 = "N";
String s2 = "N";
if( ${__isVarDefined(s_check)} == true )
{
s1 = vars.get("s_check");
}
if( ${__isVarDefined(s_check_1)} == true )
{
s2 = vars.get("s_check_1");
}
if( (s1 == "false" && s2 == "false") || (s1 == "false" && s2 == "N") || (s1 == "N" && s2 == "false") )
{
SampleResult.setSuccessful(false); //NOT WORKING
SampleResult.setResponseMessage("accountID page is not loaded"); //NOT WORKING
ctx.setTestLogicalAction(TestLogicalAction.START_NEXT_ITERATION_OF_THREAD); //WORKING
}
解决方案
来吧,你怎么知道这些SampleResult.setSuccessful(false);
和SampleResult.setResponseMessage("accountID page is not loaded");
行是“//NOT WORKING”给你的SampleResult.setIgnore();
?
如果您调用SampleResult.setIgnore();
,您将不会在Listeners和.jtl 结果文件中看到 JSR223 Sampler ,删除此行,它应该开始按预期工作,或者至少根据您的 Groovy 脚本的奇怪逻辑。
还有一件事:根据JSR223 Sampler文档,不要将 JMeter 函数或变量内联到 Groovy 脚本中:
使用此功能时,请确保您的脚本代码不直接在脚本代码中使用 JMeter 变量,因为缓存只会缓存第一个替换。而是使用脚本参数。
检查 JMeter 变量是否存在的正确方法是:
if (vars.get('s_check') != null) {
s1 = vars.get('s_check')
}