Groovy 创建动态 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 错误 o.a.j.m.JSR223PreProcessor:JSR223 脚本中的问题,JSR223 PreProcessor javax.script.ScriptException:groovy.lang.MissingPropertyException:没有这样的属性:它适用于类:Script32 at 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(未知来源) ~[?: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(未知来源) [?:1.8.0_151] 由以下原因引起:groovy.lang.MissingPropertyException:没有此类属性:它适用于类:Script32 at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53) ~[groovy-all-2.4.13.jar:2.4.13] at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52) ~[groovy-all-2.4.13.jar:2.4.13] at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) ~[groovy-all-2.4.13.jar:2.4.13] at Script32.run(Script32.groovy:46) ~[?:?] at 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 脚本的更多信息