【问题标题】:Jmeter loop count - StackOverflowError:nullJmeter循环计数 - StackOverflowError:null
【发布时间】:2021-08-27 12:53:48
【问题描述】:

我有以下测试计划

  • 线程组(线程:“1”,循环:“-1”,加速:“1”)
    • http 请求默认值(即 url)
    • csv数据集配置(包含4行输入数据)
    • 用户定义的变量(初始化变量,例如 isLast=false)
    • 简单的控制器
      • 当控制器
        • http 请求
          • json 提取器
          • json 提取器
          • JSR233 后处理器

json 提取器和后处理器是因为我想处理分页并相应地增加页码。

第一个问题是,虽然我将线程组设置为无限运行,但当线程完成时它不会再次运行,并且出现以下错误。

021-08-27 14:15:38,686 INFO o.a.j.e.J.increment page: isLast = true
2021-08-27 14:15:38,738 INFO o.a.j.t.JMeterThread: Thread finished: dba-data-exporter-users 1-1
2021-08-27 14:15:38,738 ERROR o.a.j.JMeter: Uncaught exception in thread Thread[dba-data-exporter-users 1-1,6,main]
java.lang.StackOverflowError: null
    at java.lang.Module.isExported(Module.java:456) ~[?:?]
    at jdk.internal.reflect.Reflection.verifyModuleAccess(Reflection.java:212) ~[?:?]
    at jdk.internal.reflect.Reflection.verifyMemberAccess(Reflection.java:125) ~[?:?]
    at java.lang.reflect.AccessibleObject.slowVerifyAccess(AccessibleObject.java:633) ~[?:?]
    at java.lang.reflect.AccessibleObject.verifyAccess(AccessibleObject.java:626) ~[?:?]
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:590) ~[?:?]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:481) ~[?:?]
    at org.codehaus.groovy.runtime.InvokerHelper.newScript(InvokerHelper.java:503) ~[groovy-3.0.7.jar:3.0.7]
    at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:461) ~[groovy-3.0.7.jar:3.0.7]
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:266) ~[groovy-jsr223-3.0.7.jar:3.0.7]
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:155) ~[groovy-jsr223-3.0.7.jar:3.0.7]
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233) ~[java.scripting:?]
    at org.apache.jmeter.functions.Groovy.execute(Groovy.java:120) ~[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.next(WhileController.java:112) ~[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.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.control.LoopController.nextIsNull(LoopController.java:166) ~[ApacheJMeter_core.jar:5.4.1]

这可能与我的 while 循环有关吗?我在while循环中的条件是这个 ${__groovy("false".equals(vars.get("isLast")))}

我注意到的另一个问题是,虽然我通过 GUI 指定线程生命周期,但 jmeter 根本没有考虑到这一点(例如,当我生成示意图时)。

我认为 CSV 文件不是问题,因为我已经将 recycle on EOF 设置为 true,stop thread on EOF 设置为 false,sharing mode 设置为 Current thread group

【问题讨论】:

  • Groovy 函数很好。你能用Step-by-step debugger调试脚本吗?此外,将 While 控制器更改为简单控制器,并查看脚本是否适用于一次迭代。当您将 loop count 设置为无限(检查 -1),检查 Specify Thread Lifetime 和 Duration 时,测试持续时间应该有效。
  • 我能够重现该错误。让我进一步检查

标签: jmeter jmeter-5.0


【解决方案1】:

线程在完成while循环后进入无限循环。 当您离开 While 循环时,isLast 标志不会重置为 true。因此线程在第一个循环之后永远不会进入while循环。

您可以在线程组结束时或进入 While 循环之前将该标志重置为 true。

添加一个 JSRS223 Sampler 并添加以下内容

vars.put("isLast","false")
SampleResult.setIgnore()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多