【问题标题】:Javascript "${status}" == 500 || ${status} == "undefined" failed in a while controllerJavascript "${status}" == 500 || ${status} == "undefined" 在一段时间控制器中失败
【发布时间】:2022-01-06 16:54:38
【问题描述】:

我做了一个“while”,它以一个之前没有定义的变量开始,所以我做了比较:

${__javaScript(${status} == "undefined",)} 如果答案是 "true" while 循环开始并工作;它运行一次并获取请求的新状态,这次的值为 == 500,因为我使用 JSON 提取器获取 API 中返回的新状态,然后 API 停止,因为状态不再未定义,现在== 500,工作得很好。但是

当我使用“或”比较进行另一次验证时:

${__javaScript("${status}" == 500 || ${status} == "undefined",)}

如果状态字段中的响应与“未定义”或“500”不同,它应该退出循环,但是当它返回“错误”时它继续运行,我查看了日志并得到以下错误:

**2021-11-29 18:05:10,029 ERROR o.a.j.f.JavaScript: Error processing Javascript: ["ERROR" == 500 || ERROR == "undefined"]
javax.script.ScriptException: ReferenceError: "ERROR" is not defined in <eval> at line number 1**
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470) ~[nashorn.jar:?]
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:454) ~[nashorn.jar:?]
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406) ~[nashorn.jar:?]
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402) ~[nashorn.jar:?]
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155) ~[nashorn.jar:?]
    at org.apache.jmeter.functions.JavaScript.executeWithNashorn(JavaScript.java:141) [ApacheJMeter_functions.jar:5.4.1]
    at org.apache.jmeter.functions.JavaScript.execute(JavaScript.java:102) [ApacheJMeter_functions.jar:5.4.1]
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:138) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:113) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.testelement.property.FunctionProperty.getStringValue(FunctionProperty.java:100) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.WhileController.getCondition(WhileController.java:142) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.WhileController.endOfLoop(WhileController.java:62) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.WhileController.nextIsNull(WhileController.java:85) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.GenericController.next(GenericController.java:170) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.WhileController.next(WhileController.java:117) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.GenericController.nextIsAController(GenericController.java:222) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.GenericController.next(GenericController.java:175) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.control.LoopController.next(LoopController.java:134) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.threads.AbstractThreadGroup.next(AbstractThreadGroup.java:91) [ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:291) [ApacheJMeter_core.jar:5.4.1]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_271]

但是像“ERROR”并不是真的要设置,因为如果它返回它就是退出循环

所以我真的不明白这个错误信息,有人知道可能发生了什么吗?

【问题讨论】:

  • 在声明之前使用变量似乎很奇怪。实际代码是什么?为什么不这么定义呢?
  • typeof status === "undefined" ||状态 === 500
  • 您尝试使用"${status}" == "undefined" 吗?
  • "${status}" == "undefined" 是的,试过了。我已经尝试了几种变体,但都没有成功,当我没有看到如何再试一次时,我在这里玩了一下,看看是否有人会知道。
  • 是我只有在运行api之后才有状态,api返回一个状态,比如“500”,或者“成功”或“错误”,我已经声明了,虽然它是500 它应该继续运行,但是 api 在循环内然后循环没有启动,因为它没有“状态”的值,当我修复“状态 == 500”时,它是循环之前的变量,即使在循环内更新了状态,它也采用变量的固定值,而不是新状态,所以我想定义即使状态尚未设置,它也会启动。

标签: javascript testing jmeter beanshell jmeter-5.0


【解决方案1】:

Javascript 中存在语法问题

以下将在您的 while 控制器中运行

${__javaScript("${status}" == "500" || "${status}" == "undefined",)}

考虑到性能,还 it's recommended 使用 __groovy __jexl3 而不是 Javascript。

javaScript 不是用于 JMeter 性能的最佳脚本语言。如果您的计划需要大量线程,建议使用 __jexl3 或 __groovy 函数。

时髦

${__groovy(vars.get("status")=="500" || vars.get("status")=="undefined",)}

Jexl3

${__jexl3(vars.get("status")=="500" || vars.get("status")=="undefined",)}

【讨论】:

  • 当我这样说的时候,引号中的“未定义”甚至都没有开始运行,我已经测试过了。
  • 我已经粘贴了测试脚本中的语句。它应该工作。需要检查。
  • DEBUG oajcGenericController:调用下一个:class org.apache.jmeter.control.GenericController DEBUG oajtpAbstractProperty:运行版本,执行函数DEBUG oajfGroovy:__groovy(vars.get("status")= ="500" || vars.get("status")=="undefined",)=false DEBUG oajcWhileController:条件字符串:'false' DEBUG oajcWhileController:条件值:'true'
  • 调试 oajcGenericController:调用下一个:类 org.apache.jmeter.control.GenericController 信息 oajtJMeterThread:线程已完成:Grupo de Usuários- 假客户端 - RecebeCallback 3-1 信息 oajtJMeterThread:线程完成:Grupo de Usuários- Fake Client - RecebeCallback 3-1 调试 oajtThreadGroup:结束线程 Grupo de Usuários- Fake Client - RecebeCallback 3-1
  • INFO oajeStandardJMeterEngine:通知测试侦听器测试结束 INFO oajguJMeterMenuBar: setRunning(false, local) DEBUG oajvViewResultsFullVisualizer: Expanded: [[Root]] DEBUG oajvViewResultsFullVisualizer :元素:[根]
【解决方案2】:

看起来像是复制粘贴问题:

${__javaScript("${status}" == 500 || ${status} == "undefined",)}
               ^         ^           ^       ^
                 here you have       ^ and here 
                 quotation marks     you don't

用引号将500 括起来也很有意义,否则尝试将NumberString 进行比较时会出现意外行为

所有JMeter Variables 及其各自的值都可以使用Debug Sampler and View Results Tree listener 组合进行可视化。

【讨论】:

  • 当我这样说时,引号中的“未定义”甚至都没有开始运行,我已经测试过了。我真的有一个问题,因为孤立地,当我把它放在引号中时,== 500 比较有效,而当我把它放在引号中时,“未定义”比较不起作用。
  • 请阅读 Dmitri,仔细评论引号应该在 ${status} 上而不是在 undefined 上,undefined 是一个返回值,你不应该把它放在引号里,试试像 "${status} " == 未定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2012-04-24
  • 2021-09-10
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
相关资源
最近更新 更多