从JMeter Json Path Post Processor中的json数组中获取随机元素的索引

时间:2016-12-01 07:01:38

标签: jmeter jsonpath

我对jmeter有一些奇怪的情况。想象一下,我们有一个json数组,其元素如下:

{
  "id"  : 123456,
  "name": "TEST"
}

所以我想从具有id的数组中获取随机元素。对于这种情况,我使用Json Path PostProcessor表达式,如$.elements[?(@.id)]

但由于某些原因,我需要这个元素的索引。因此,我可以创建BeanShellPostProcessor生成随机索引,然后使用与Json Path PostProcessor这样的表达式相同的$.elements[${PARAM_ElementIndex}]。 但在某些情况下,此数组可能为空,Json Path PostProcessor将失败,异常如下: jmeter.extractor.json.jsonpath.JSONPostProcessor: Error processing JSON content in PARAM_ResumeId, message:No results for path: $['elements'][0]['id']

所以可能有人可以建议任何解决方案

1 个答案:

答案 0 :(得分:1)

我建议使用Groovy代替Beanshell:

  • 行为良好的Groovy脚本可以编译成字节码,因此性能会更高
  • Groovy内置了JSON支持

所以,鉴于你有JSON响应,如:

{
  "elements": [
    {
      "id": 123456,
      "name": "TEST"
    },
    {
      "id": 7890,
      "name": "TEST2"
    }
  ]
}

您可以使用JSR223 PostProcessor中的以下示例Groovy代码提取随机ID及其索引:

import groovy.json.JsonSlurper

import java.util.concurrent.ThreadLocalRandom

String response = prev.getResponseDataAsString()

def jsonSlurper = new JsonSlurper()
def json = jsonSlurper.parseText(response)

int size = json.elements.size

if (size > 0){
    def randomIndex = ThreadLocalRandom.current().nextInt(size)
    def value = json.elements.get(randomIndex).id
    log.info('Index: ' + randomIndex)
    log.info('Value: ' + value)
}

演示:

Groovy JSON JMeter

参考文献: