代码之家  ›  专栏  ›  技术社区  ›  Bastian

如何在jmeter中装箱随机列表名称并在不同线程中使用-jmeter

  •  0
  • Bastian  · 技术社区  · 6 年前

    我有一个关于jmeter中全局变量的问题。 我想在第一个线程中创建一个列表,并在所有线程中使用该列表。 因为它是全局的,所以我希望每次运行测试计划时,字符串名称都会得到新的值。 我创建了一个生成uniqe名称的函数,但是当我试图在第二个线程中调用它时,它不知道变量的名称。

    测试计划

    第一个JSSR预处理来创建随机名称以用作变量。

    <开始=“2”>
  • 我放入值并保存全局变量t offer_list_rand的示例,它将指向列表
  • <开始=“3”>
  • 尝试在不同的线程中调用列表指针t_$offer_list_rand并尝试向列表中添加值
  • 控制台异常

    jsr223 script jsr223 sampler中的问题,消息:javax.script.scriptException:groovy.lang.missingpropertyException:no such property:offer-list-rand for-class:script30 javax.script.scriptException:groovy.lang.MissingPropertyException:no such property:offer_list_rand for class:script30 在Org.CordHuo.Groovy.jSr23.GroovyScript PrimeIMP.EVA(GroovyScript PraceIMP.java:324)~[Groovy2.2.4.15.jar:2.4.15] 在Gorovy.CrodHo.Groovy.jSr23.GroovyCopyLeDeldScript .EVAL(GroovyCopyIdErr.Script,Java:72)~[Groovy2.2.4.15.jar:2.4.15] 在javax脚本。1.1.0y65 在Org.Apache .jMt.U.L.jSr223 TestCornal.PurrestFiororScript(JSR223 TestEngult.java:221)~[Apache EdMeTeMeCor.jar:5 R1840935] 在Org.Apache .jMt.Trava. Java.S取取器.jSr223 SAMPult.SAMPLE(JSR223采样器,Java:71)[ Apache EjMeTeMeJava.jar:5 R1840935] 在Org.Apache .jMe.Trime.jMeTyTr.DoAMPLAMP(JMeTrime.java:622)[Apache EdMeTeM.Corn.jar:5 R1840935] 在Org.Apache .jMe.Trime.jMeTyTr.ExtUpEsExpLePaCache(JMeTrime.java:546)[Apache EdMeTeMeCorn.jar:5 R1840935] 在Org.Apache .jMe.Trime.jMeTyTr.PurrimeS采样器(JMeTyTr.java:486)[Apache EdMeTeMeCor.jar:5 R1840935] 在Org.Apache .jMe.Trime.jMeTyTr.Run(JMeTyTr.java:253)[ Apache EdMeTeMeCor.jar:5 R1840935] 在Java.Lang.Trime.Run(线程.java:745)中?1.1.0y65 原因:groovy.lang.MissingPropertyException:没有此类属性:为class:script30提供清单和 在Org.CordHuo.Groovy.RunTime.Script PytTeCooDeCudio.NoRead(Script PytTeCooDead .java:66)~[Groovy2.2.4.15.jar:2.4.15] 在Org.CordHo.Groovy.RunTime.CaldSt.PGOGETPrimyTySt.GETFord(PGOGETPrimyTySt.java:51)~[Groovy2.2.4.15.jar:2.4.15] 在Org.CoDay.Groovy.RunTime.CaltSux.AcExcTcLoal.CalgroovyObjutGETField(AcExcTcLaSt.java:310)~[Groovy2.2.4.15.jar:2.4.15] 在script30.run(script30.groovy:1)~[?:?] 在Org.CordHuo.Groovy.jSr23.GroovyScript PrimeIMP.EVA(GroovyScript PraceIMP.java:321)~[Groovy2.2.4.15.jar:2.4.15] …9更多 < /代码> <开始=“4”>
  • 正如您所看到的,offer\u list\u rand变量
  • 我只想创建一个名为的列表,它将在每次运行测试计划时随机化,并从不同的线程调用它。 有人能提出建议吗?

    测试计划 enter image description here

    第一个JSSR预处理来创建随机名称以用作变量。 enter image description here

    1. 我放入值并保存全局变量t offer_list_rand的示例,它将指向列表

    enter image description here

    1. 尝试在不同的线程中调用列表指针t_$offer_list_rand并尝试向列表中添加值

    enter image description here

    控制台异常

    Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: offer_list_rand for class: Script30
    javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: offer_list_rand for class: Script30
        at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:324) ~[groovy-all-2.4.15.jar:2.4.15]
        at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.15.jar:2.4.15]
        at javax.script.CompiledScript.eval(CompiledScript.java:92) ~[?:1.8.0_65]
        at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:221) ~[ApacheJMeter_core.jar:5.0 r1840935]
        at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:71) [ApacheJMeter_java.jar:5.0 r1840935]
        at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622) [ApacheJMeter_core.jar:5.0 r1840935]
        at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546) [ApacheJMeter_core.jar:5.0 r1840935]
        at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486) [ApacheJMeter_core.jar:5.0 r1840935]
        at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253) [ApacheJMeter_core.jar:5.0 r1840935]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_65]
    Caused by: groovy.lang.MissingPropertyException: No such property: offer_list_rand for class: Script30
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:66) ~[groovy-all-2.4.15.jar:2.4.15]
        at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:51) ~[groovy-all-2.4.15.jar:2.4.15]
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:310) ~[groovy-all-2.4.15.jar:2.4.15]
        at Script30.run(Script30.groovy:1) ~[?:?]
        at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321) ~[groovy-all-2.4.15.jar:2.4.15]
        ... 9 more
    
    1. 正如您所看到的,offer\u list\u rand变量

    enter image description here

    我只想创建一个名为的列表,它将在每次运行测试计划时随机化,并从不同的线程调用它。 有人能提出建议吗?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Ori Marko    6 年前

    根据 JMeter's best practices 使用 vars.get 在脚本中而不是 ${} :

     props.put("t_" + vars.get("offer_list_rand"),offer_list);
    
        2
  •  0
  •   Dmitri T    6 年前

    你在做一些奇怪的事

    1. 您的groovy脚本将不能工作,因为您不能引用 offer_list_rand 变量AS ${offer_list_rand} ,继续考虑使用 Parameters 任意截面 JMeter Functions and/or Variables groovy脚本中的引用
    2. 你的方法不能作为第二个 Thread Group 什么都不知道 $报价单 变量值作为jmeter变量是线程组的局部变量。从技术上讲,可以将jmeter属性命名为jmeter变量,例如:

      vars.put('offer_list_rand', 'foo')
      props.put('offer_list_rand', 'bar')
      

      你会有 不同的 具有不同值的对象,该变量将 foo 并且在定义它的线程组中可见,属性将 bar 它将对整个JVM可见,直到您关闭或重新启动JMeter。

    3. 使用JMeter内置测试元素(或插件)总是更快/更容易/更好,而不是进行脚本编写,特别是在您可以轻松进行的情况下。 __setProperty() 功能或 Inter-Thread Communication 插件或者甚至将逻辑从设置线程组移到普通线程组中,并使其只运行一次 Once Only Controller If Controller
        3
  •  0
  •   Bastian    6 年前

    重新检查后,这就是解决方案。 在JSSR预处理器中

    String list_rand = list_obj.get_random_list_name("temp_");
    props.put('list_rand',list_rand);
    

    在处理器里我把

    List<String> list2 = new ArrayList<String>();
    
    props.put('list_rand_'+ props.get('list_rand'),list2);
    

    当我想在其他线程组中调用它时,我使用

    List<String> myList = props.get('list_rand'+ props.get('list_rand'));
    
    
    myList.add("333");