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

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

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

  1. {
  2. "Result": {
  3. "Locations": [
  4. {
  5. "Latitude": 38.657,
  6. "Longitude": -120.377997
  7. },
  8. {
  9. "Latitude": 38.6566,
  10. "Longitude": -120.3791
  11. },
  12. {
  13. "Latitude": 38.658399,
  14. "Longitude": -120.3804
  15. },
  16. {
  17. "Latitude": 38.655499,
  18. "Longitude": -120.38496
  19. },
  20. {
  21. "Latitude": 38.654,
  22. "Longitude": -120.3819
  23. },
  24. {
  25. "Latitude": 38.6537,
  26. "Longitude": -120.3897
  27. },
  28. {
  29. "Latitude": 38.6544,
  30. "Longitude": -120.382604
  31. },
  32. {
  33. "Latitude": 38.655602,
  34. "Longitude": -122.386402
  35. }
  36. ]
  37. }
  38. }

我正在使用的Groovy脚本是:

  1. import groovy.json.*
  2. //Parse JSON
  3. def jsonSlurper = new JsonSlurper();
  4. def response = jsonSlurper.parseText(prev.getResponseDataAsString())
  5. def LocationsList = JsonOutput.toJson(response.Result.Locations)
  6. //Get the size of Locations Array and Generate Random Number based on array size
  7. Random random = new Random()
  8. int max = LocationsList.size()
  9. int randomNumber = random.nextInt(max)
  10. //Get Latitude
  11. def GetLatitude (number) {
  12. return LocationsList[number].Latitude
  13. }
  14. def Latitude = GetLatitude(randomNumber)
  15. //Get Longitude
  16. def GetLongitude (number) {
  17. return LocationsList[number].Longitude
  18. }
  19. def Longitude = GetLongitude(randomNumber)
  20. //Set the env vars
  21. vars.put("Latitude", Latitude)
  22. vars.put("Longitude", Longitude)

我收到的回复很长,所以我会把重要的部分贴出来。

  1. Problem in JSR223 script, CurrentGPS
  2. javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: LocationsList for class: Script18
  3. at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-all-2.4.13.jar:2.4.13]
  4. at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.13.jar:2.4.13]
  5. 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

以下是固定的脚本:

  1. def json = new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString())
  2. def locations = json.Result.Locations
  3. def randomNumber = new Random().nextInt(locations.size())
  4. def latitude = locations[randomNumber].Latitude
  5. def longitude = locations[randomNumber].Longitude

您可以快速尝试在线demo

erhoui1w

erhoui1w3#

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

  1. {
  2. "store": {
  3. "book": [
  4. {
  5. "category": "reference",
  6. "author": "Nigel Rees",
  7. "title": "Sword of Honour",
  8. "price": 8.95
  9. },
  10. {
  11. "category": "fiction",
  12. "author": "Evelyn Waugh",
  13. "title": "test_title",
  14. "price": 12.99
  15. },
  16. {
  17. "category": "fiction",
  18. "author": "Herman Melville",
  19. "title": "Sword of Honour",
  20. "isbn": "0-553-21311-3",
  21. "price": 8.99
  22. },
  23. {
  24. "category": "fiction",
  25. "author": "J. R. R. Tolkien",
  26. "title": "India",
  27. "isbn": "0-395-19395-8",
  28. "price": 22.99
  29. }
  30. ],
  31. "bicycle": {
  32. "color": "red",
  33. "price": 19.95
  34. }
  35. },
  36. "expensive": 10
  37. }

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

展开查看全部

相关问题