簡體   English   中英

Groovy創建動態json時沒有此類屬性錯誤

[英]Groovy No such property error while creating dynamic json

我正在嘗試使用JSR223 PreProcessor在jmeter中使用csv數據創建動態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錯誤oajmJSR223PreProcessor:JSR223腳本,JSR223 PreProcessor javax.script.ScriptException中的問題:groovy.lang.MissingPropertyException:無此類屬性:它適用於org.codehaus.groovy.jsr223類的Script32。 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(未知源)〜[?: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] at java.lang.Thread.run(Unknown Source)[?:1.8.0_151]原因:groovy.lang.MissingPropertyException:無此類屬性:它適用於org.codehaus類的Script32 .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

先感謝您

您必須在此處使用{}作為閉包:

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

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

隨着[]編譯器會認為這是一個地圖的文字,你會得到上面的錯誤( it是不確定的)

我相信您應該更准確地復制和粘貼示例代碼 ,以使“項目”部分看起來像這樣:

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

還要注意,您不應直接在Groovy腳本中使用JMeter函數和/或變量 ,因為它與GString模板功能沖突並且使緩存已編譯的腳本不可能對性能產生負面影響。

因此,我還建議更改:

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

如果需要,請參閱JMeter的Groovy模板備忘單文章,以獲取有關JMeter中的Groovy腳本的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM