首页 > 解决方案 > 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
}

标签: jmeterassertion

解决方案


来吧,你怎么知道这些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')
}

更多信息:Apache Groovy - 为什么以及如何使用它


推荐阅读