在 Jmeter 中使用 Groovy 从 JSON 响应中提取随机值
Extract a random value from a JSON response using Groovy in Jmeter
我正在尝试将两个变量 Latitude
、Longitude
设置为在 JSON 响应中找到的 运行dom Lat/Long 值。 JSON 响应包含一个包含 Lat/Long 值列表的 Locations
数组。每次这个脚本是 运行,我希望我的变量被设置为 Locations 数组中的 运行dom lat/long 值。 Groovy 脚本是一个嵌套在 POST HTTP 请求中的 JSR223 后处理器。下面我将 post 一个示例响应和 Groovy 实现此目的的代码。
{
"Result": {
"Locations": [
{
"Latitude": 38.657,
"Longitude": -120.377997
},
{
"Latitude": 38.6566,
"Longitude": -120.3791
},
{
"Latitude": 38.658399,
"Longitude": -120.3804
},
{
"Latitude": 38.655499,
"Longitude": -120.38496
},
{
"Latitude": 38.654,
"Longitude": -120.3819
},
{
"Latitude": 38.6537,
"Longitude": -120.3897
},
{
"Latitude": 38.6544,
"Longitude": -120.382604
},
{
"Latitude": 38.655602,
"Longitude": -122.386402
}
]
}
}
我使用的 Groovy 脚本是:
import groovy.json.*
//Parse JSON
def jsonSlurper = new JsonSlurper();
def response = jsonSlurper.parseText(prev.getResponseDataAsString())
def LocationsList = JsonOutput.toJson(response.Result.Locations)
//Get the size of Locations Array and Generate Random Number based on array size
Random random = new Random()
int max = LocationsList.size()
int randomNumber = random.nextInt(max)
//Get Latitude
def GetLatitude (number) {
return LocationsList[number].Latitude
}
def Latitude = GetLatitude(randomNumber)
//Get Longitude
def GetLongitude (number) {
return LocationsList[number].Longitude
}
def Longitude = GetLongitude(randomNumber)
//Set the env vars
vars.put("Latitude", Latitude)
vars.put("Longitude", Longitude)
我收到的回复很长,所以我会 post 重要的部分。
Problem in JSR223 script, CurrentGPS
javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: LocationsList for class: Script18
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-all-2.4.13.jar:2.4.13]
at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.13.jar:2.4.13]
at javax.script.CompiledScript.eval(CompiledScript.java:92) ~[java.scripting:?]
你的脚本有几个问题:
LocationsList
获取值不正确。
LocationsList
正在两种非范围的方法中访问。您可以使用 Closure
代替。
固定脚本如下:
def json = new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString())
def locations = json.Result.Locations
def randomNumber = new Random().nextInt(locations.size())
def latitude = locations[randomNumber].Latitude
def longitude = locations[randomNumber].Longitude
您可以在线快速试用demo
如果 JSON 路径表达式 return 有多个匹配项,您可以在没有任何脚本的情况下使用 JSON Extractor. The component is available since JMeter 3.0 获得一个随机匹配项,并且假设您提供 0
作为 "Match No" 它将 return 来自你的 JSON 路径表达式匹配的随机值。配置类似于:
文本表示:
- 创建变量的名称:
Latitude;Longitude
- JSON 路径表达式:
$..Latitude;$..Longitude
- 匹配号:
0
- 默认值:
NA;NA
我正在尝试将两个变量 Latitude
、Longitude
设置为在 JSON 响应中找到的 运行dom Lat/Long 值。 JSON 响应包含一个包含 Lat/Long 值列表的 Locations
数组。每次这个脚本是 运行,我希望我的变量被设置为 Locations 数组中的 运行dom lat/long 值。 Groovy 脚本是一个嵌套在 POST HTTP 请求中的 JSR223 后处理器。下面我将 post 一个示例响应和 Groovy 实现此目的的代码。
{
"Result": {
"Locations": [
{
"Latitude": 38.657,
"Longitude": -120.377997
},
{
"Latitude": 38.6566,
"Longitude": -120.3791
},
{
"Latitude": 38.658399,
"Longitude": -120.3804
},
{
"Latitude": 38.655499,
"Longitude": -120.38496
},
{
"Latitude": 38.654,
"Longitude": -120.3819
},
{
"Latitude": 38.6537,
"Longitude": -120.3897
},
{
"Latitude": 38.6544,
"Longitude": -120.382604
},
{
"Latitude": 38.655602,
"Longitude": -122.386402
}
]
}
}
我使用的 Groovy 脚本是:
import groovy.json.*
//Parse JSON
def jsonSlurper = new JsonSlurper();
def response = jsonSlurper.parseText(prev.getResponseDataAsString())
def LocationsList = JsonOutput.toJson(response.Result.Locations)
//Get the size of Locations Array and Generate Random Number based on array size
Random random = new Random()
int max = LocationsList.size()
int randomNumber = random.nextInt(max)
//Get Latitude
def GetLatitude (number) {
return LocationsList[number].Latitude
}
def Latitude = GetLatitude(randomNumber)
//Get Longitude
def GetLongitude (number) {
return LocationsList[number].Longitude
}
def Longitude = GetLongitude(randomNumber)
//Set the env vars
vars.put("Latitude", Latitude)
vars.put("Longitude", Longitude)
我收到的回复很长,所以我会 post 重要的部分。
Problem in JSR223 script, CurrentGPS
javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: LocationsList for class: Script18
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-all-2.4.13.jar:2.4.13]
at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.13.jar:2.4.13]
at javax.script.CompiledScript.eval(CompiledScript.java:92) ~[java.scripting:?]
你的脚本有几个问题:
LocationsList
获取值不正确。LocationsList
正在两种非范围的方法中访问。您可以使用Closure
代替。
固定脚本如下:
def json = new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString())
def locations = json.Result.Locations
def randomNumber = new Random().nextInt(locations.size())
def latitude = locations[randomNumber].Latitude
def longitude = locations[randomNumber].Longitude
您可以在线快速试用demo
如果 JSON 路径表达式 return 有多个匹配项,您可以在没有任何脚本的情况下使用 JSON Extractor. The component is available since JMeter 3.0 获得一个随机匹配项,并且假设您提供 0
作为 "Match No" 它将 return 来自你的 JSON 路径表达式匹配的随机值。配置类似于:
文本表示:
- 创建变量的名称:
Latitude;Longitude
- JSON 路径表达式:
$..Latitude;$..Longitude
- 匹配号:
0
- 默认值:
NA;NA