【问题标题】:Groovy No such property error while creating dynamic jsonGroovy 创建动态 json 时没有此类属性错误
【发布时间】:2019-02-28 07:06:37
【问题描述】:

我正在尝试使用 jmeter 中的 csv 数据和 JSR223 PreProcessor 创建一个动态 json

下面是我使用 CSV 获取 Id 和 Name 数据的代码:

def builder = new groovy.json.JsonBuilder()

@groovy.transform.Immutable
class Items {
    String Id
    String Name
}

def items = new File("Item.txt").readLines().collect { line -> new Items(line.split(",")[0], line.split(",")[1]) }
builder.Rule(

        __type: "DataCollectionRule",
        DeviceFamily: '${__P(DeviceFamily)}',
        RuleId: 0,
        Name: 'test-${__time(yyyy-MM-dd'T'hh:mm:ss)}-${__counter(TRUE,)}',
        Targets:
                [
                        Groups :
                                [
                                        [
                                                Id: '${logicalid1_1}',
                                        ]
                                ],
                        Devices:
                                [

                                ]
                ],
        StartDate: '/Date(${__time(,)})/',        
        IsEnabled: true,
        Priority: 0,
        AlertType: 0,
        DeliverySchedule:
                [
                                                Id         :   1,
                                                Name       :  "Every 30 Minutes",
                                                Period     :  "30M"

                ],
        CollectionSchedule:                      
               [
                                              Id         :   1,
                                                Name       :  "Every 30 Minutes",
                                                Period     :  "30M"
              ],                    
        Items  : items.collect() [
        [

                                                Id         : it.Id,
                                                Name       : it.Name                                                

        ]
                ],
        LocationAccuracy:
                [
                                                UseGPS     :  false,
                                       DistanceInMeters : 100,
                                       ReportToServer  : true,
                                       AccuracyInMeters : 10
             ],
          HasDolphinCounters: false,
          EnrollmentCertificateId: null,
          EnrollmentCertificateName: "",
        DatabaseHighWatermark: 28,
        DatabaseLowWatermark: 14,
        DeviceHighWatermark: 400,
        DeviceLowWatermark:  200

)

sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('', builder.toPrettyString(), '')
sampler.setPostBodyRaw(true);

在运行测试时,我收到 HTTP 400 错误请求

日志信息如下:

2018-09-24 13:49:23,669 错误 o.a.j.m.JSR223PreProcessor:JSR223 脚本中的问题,JSR223 PreProcessor javax.script.ScriptException:groovy.lang.MissingPropertyException:没有这样的属性:类:Script32 在 org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-all-2.4.13.jar:2.4.13] 在 org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.13.jar:2.4.13] 在 javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_151] 在 org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:221) ~[ApacheJMeter_core.jar:4.0 r1823414] 在 org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java:44) [ApacheJMeter_components.jar:4.0 r1823414] 在 org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:849) [ApacheJMeter_core.jar:4.0 r1823414] 在 org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:467) [ApacheJMeter_core.jar:4.0 r1823414] 在 org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:416) [ApacheJMeter_core.jar:4.0 r1823414] 在 org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:250) [ApacheJMeter_core.jar:4.0 r1823414] 在 java.lang.Thread.run(Unknown Source) [?:1.8.0_151] 引起:groovy.lang.MissingPropertyException:没有这样的属性:类:Script32 在 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53) ~[groovy-all-2.4.13.jar:2.4.13] 在 org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52) ~[groovy-all-2.4.13.jar:2.4.13] 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) ~[groovy-all-2.4.13.jar:2.4.13] 在 Script32.run(Script32.groovy:46) ~[?:?] 在 org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317) ~[groovy-all-2.4.13.jar:2.4.13] ... 9 更多

CSV如下:

   -1,BatteryStatus
    -3,AvailableMemory
    -5,AvailableStorage

提前谢谢你

【问题讨论】:

    标签: groovy jmeter jsr223 jsonbuilder


    【解决方案1】:

    您必须在此处使用{} 进行关闭:

    items.collect() { // wrong: [
        // ...
    } // wrong: ]
    

    或者只是items.collect { ... }

    使用[],编译器会将其视为映射文字,并且您会遇到上述错误(it 未定义)

    【讨论】:

      【解决方案2】:

      我相信您应该更准确地复制和粘贴 example code,您的“项目”部分应该如下所示:

      Items: items.collect() {
          [
                  Id  : it.Id,
                  Name: it.Name
          ]
      }
      

      另外请注意,您不应该在 Groovy 脚本中直接使用 JMeter Functions and or Variables,因为它与 GString Template 功能相冲突,并使 caching of compiled scripts 不可能对性能产生负面影响。

      所以我也建议更改:

      • ${__P(DeviceFamily)props.get('DeviceFamily)`
      • ${__time(yyyy-MM-dd'T'hh:mm:ss)}new Date().format("yyyy-MM-dd'T'hh:mm:ss")

      如果需要,请参阅The Groovy Templates Cheat Sheet for JMeter 文章了解有关 JMeter 中 Groovy 脚本的更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2014-06-03
        • 2020-01-08
        • 1970-01-01
        • 2010-09-30
        • 2019-05-02
        • 1970-01-01
        相关资源
        最近更新 更多