从 JMeter json 数组中获取随机元素的索引 Json 路径 Post 处理器

Obtain index of random element from json array in JMeter Json Path Post Processor

我有一个奇怪的 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']

所以可能有人可以提出任何解决方案

我建议使用 Groovy 而不是 Beanshell,因为:

  • 良好的Groovy脚本可以编译成字节码因此性能会高很多
  • Groovy 内置 JSON 支持

假设您有 JSON 响应,例如:

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

您可以在 JSR223 后处理器中使用以下示例 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)
}

演示:

参考文献: