在Jeter中使用Groovy从JSON响应中提取随机值

x33g5p2x  于 2022-09-21  发布在  其他
关注(0)|答案(3)|浏览(177)

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

xam8gpfp1#

如果JSON路径表达式返回多个匹配项,您可以使用JSON Extractor在没有任何脚本的情况下随机获得一个匹配项。该组件从JMeter 3.0开始可用,如果您提供0作为“Match No”,它将从您的JSON路径表达式匹配的任何内容中返回随机值。配置应该类似于:

文本表示法:

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

rhfm7lfc2#

您脚本中有几个问题:

  • 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

erhoui1w

erhoui1w3#

谢谢大家,这很有帮助,我需要帮助如何在这段代码中使用条件语句,下面是JSON示例:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sword of Honour",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "test_title",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Sword of Honour",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "India",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

在这方面,如果我的标题是“荣誉之剑”,那么拉价和作者以及每次迭代都不同,我认为随机可以做到这一点。

相关问题