jmeter 在某些情况下,样本结果的标签不会通过BeanShell后处理器更改

vddsk6oq  于 2022-11-09  发布在  Shell
关注(0)|答案(2)|浏览(205)

我编写了此代码,以便如果状态== 500,则API的名称将等于“FAKE_CLIENT_RETRY”,如果API的状态==“ERROR”,则名称将等于“FAKE_CLIENT_CALLBACK_ERROR”

  1. import org.apache.jmeter.samplers.SampleResult;
  2. //process main sample
  3. if(("${status}").equals("500")) {
  4. SampleResult.setResponseCodeOK();
  5. SampleResult.setSuccessful(true);
  6. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_RETRY");
  7. }else if(("${status}").equals("ERROR")){
  8. SampleResult.setSuccessful(false);
  9. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_ERROR");
  10. }else{
  11. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_SUCESS");
  12. }

但是,即使状态==“ERROR”,它返回的名称也是“FAKE_CLIENT_RETRY”
最奇怪的是,我知道执行进入了条件==“ERROR”的“if”,因为在Jmeter中,伴随status ==“ERROR”的返回出现执行失败,我通过代码片段强制在这种情况下返回失败:

  1. SampleResult.setSuccessful (false);

但是,尽管输入了,它还是忽略了要求重命名api的代码段。
Jmeter 屏幕截图----〉Jmeter response

flvtvl50

flvtvl501#

以下脚本在BeanShell后处理器中正常运行,未出现任何问题

  1. if(("${status}").equals("500")) {
  2. prev.setResponseCodeOK();
  3. prev.setSuccessful(true);
  4. prev.setSampleLabel("FAKE_CLIENT_RETRY");
  5. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_RETRY");
  6. }else if(("${status}").equals("ERROR")){
  7. prev.setSuccessful(false);
  8. prev.setSampleLabel("FAKE_CLIENT_CALLBACK_ERROR");
  9. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_ERROR");
  10. }else{
  11. prev.setSampleLabel("FAKE_CLIENT_CALLBACK_SUCESS");
  12. vars.put("Api_Fake_Client_Name","FAKE_CLIENT_CALLBACK_SUCESS");
  13. }

请注意,您可以通过变量previous访问SampleResult。让我们使用prev.setSampleLabel("Label");来设置样本结果的标签。
prev -(SampleResult)-提供对上一个SampleResult的访问
强烈建议迁移到JSR 223后处理器+Groovy,以提高性能、支持新的Java功能以及对BeanShell库进行有限维护
添加一个调试后处理器,通过查看结果树来查看JMeter变量。
Sample test plan (JMX)在GitHub中可用。

展开查看全部
mwyxok5s

mwyxok5s2#

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

还要注意,从JMeter 3.1开始,您应该使用JSR223 Test Elements和Groovy语言编写脚本,这样您就可以将代码更改为如下形式:

  1. switch (vars.get('status')) {
  2. case '500':
  3. prev.setResponseCodeOK()
  4. prev.setSuccessful(true)
  5. vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_RETRY');
  6. prev.setSampleLabel('FAKE_CLIENT_RETRY')
  7. break;
  8. case 'ERROR':
  9. prev.setSuccessful(false)
  10. vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_CALLBACK_ERROR')
  11. prev.setSampleLabel('FAKE_CLIENT_CALLBACK_ERROR')
  12. break;
  13. default:
  14. vars.put('Api_Fake_Client_Name', 'FAKE_CLIENT_CALLBACK_SUCESS')
  15. prev.setSampleLabel('FAKE_CLIENT_CALLBACK_SUCESS')
  16. }

更多信息:

展开查看全部

相关问题