在某些情况下,示例结果的标签不会通过 BeanShell post 处理器更改

Sample result's label is not changed through BeanShell post processor for some conditions

我编写了这段代码,如果 status == 500,api 的名称将等于“FAKE_CLIENT_RETRY”,如果 api 的状态 == “错误”,名称将等于“FAKE_CLIENT_CALLBACK_ERROR”

import org.apache.jmeter.samplers.SampleResult;

//process main sample
if(("${status}").equals("500")) {

    SampleResult.setResponseCodeOK();
    SampleResult.setSuccessful(true);
    
vars.put("Api_Fake_Client_Name","FAKE_CLIENT_RETRY");
     
}else if(("${status}").equals("ERROR")){
    
        SampleResult.setSuccessful(false);
vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_ERROR");

}else{
vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_SUCESS");
    
}

但即使状态 ==“错误”,它的名称 returns 也是“FAKE_CLIENT_RETRY”

最奇怪的是我知道执行进入了条件==“ERROR”的“if”,因为status==“ERROR”自带的return随着执行失败出现在Jmeter 和我在这种情况下将 return 强制为 return,但通过代码片段失败:

SampleResult.setSuccessful (false);

但是尽管已经输入,它还是忽略了要求重命名 api 的片段。

Jmeter 截图----> Jmeter response

以下脚本在 BeanShell Post Processor

内运行没有任何问题


if(("${status}").equals("500")) {
        prev.setResponseCodeOK();
        prev.setSuccessful(true);
        prev.setSampleLabel("FAKE_CLIENT_RETRY");
        vars.put("Api_Fake_Client_Name","FAKE_CLIENT_RETRY");
        
     
}else if(("${status}").equals("ERROR")){
        prev.setSuccessful(false);
        prev.setSampleLabel("FAKE_CLIENT_CALLBACK_ERROR");
        vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_ERROR");

}else{
        prev.setSampleLabel("FAKE_CLIENT_CALLBACK_SUCESS");
        vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_SUCESS");
    
}

请注意,您可以通过变量 previous 访问 SampleResult。让我们使用 prev.setSampleLabel("Label"); 设置样本结果的标签。

prev - (SampleResult) - gives access to the previous SampleResult

Migration to JSR223 PostProcessor+Groovy is highly recommended for performance, support of new Java features and limited maintenance of the BeanShell library

添加调试 Post 处理器以通过视图结果树查看 JMeter 变量。

Sample test plan (JMX) 在 GitHub 可用。

您正在断言中设置一个 Api_Fake_Client_Name 变量值,它将在当前采样器的下一次迭代期间的下一个采样器中可用(更新):

另请注意,从 JMeter 3.1 开始,您应该使用 JSR223 Test Elements and Groovy language for scripting,因此您可以将代码更改为:

switch (vars.get('status')) {
    case '500':
        prev.setResponseCodeOK()
        prev.setSuccessful(true)
        vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_RETRY');
        prev.setSampleLabel('FAKE_CLIENT_RETRY')
        break;
    case 'ERROR':
        prev.setSuccessful(false)
        vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_CALLBACK_ERROR')
        prev.setSampleLabel('FAKE_CLIENT_CALLBACK_ERROR')
        break;
    default:
        vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_CALLBACK_SUCESS')
        prev.setSampleLabel('FAKE_CLIENT_CALLBACK_SUCESS')
}

更多信息: