【问题标题】:Extract a random value from a JSON response using Groovy in Jmeter在 Jmeter 中使用 Groovy 从 JSON 响应中提取随机值
【发布时间】:2018-02-26 04:35:48
【问题描述】:

我正在尝试将两个变量 LatitudeLongitude 设置为 JSON 响应中的随机纬度/经度值。 JSON 响应包含一个 Locations 数组,其中包含一个纬度/经度值列表。每次运行此脚本时,我都希望将我的变量设置为 Locations 数组中的随机纬度/经度值。 Groovy 脚本是一个嵌套在 POST HTTP 请求中的 JSR223 PostProcessor。下面我将发布一个示例响应和实现此目的的 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)

我收到的回复很长,所以我会发布重要的部分。

     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:?]

【问题讨论】:

    标签: json groovy jmeter load-testing


    【解决方案1】:

    如果 JSON 路径表达式返回多个匹配项,您可以使用 JSON Extractor 获得一个随机匹配项,而无需任何脚本。该组件自 JMeter 3.0 起可用,并且如果您将 0 提供为“匹配号”,它将从您的 JSON 路径表达式匹配的任何内容中返回随机值。配置类似于:

    文本表示:

    • 已创建变量的名称:Latitude;Longitude
    • JSON 路径表达式:$..Latitude;$..Longitude
    • 匹配号:0
    • 默认值:NA;NA

    【讨论】:

    • 感谢@Dmitri T!我不知道您可以使用 JSON 提取器将随机值分配给超过 1 个变量。这非常有用。
    【解决方案2】:

    您的脚本中有几个问题:

    • 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

    【讨论】:

    • 感谢@Rao!这就像一个魅力。我唯一要做的就是将 toString() 添加到纬度/经度变量,所以它看起来像这样: def latitude = locations[randomNumber].Latitude.toString() def longitude = locations[randomNumber].Longitude.toString()
    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多