首页 > 解决方案 > JMeter:尝试验证随机分配的 json 路径中的两个或多个值

问题描述

我有一个如下所示的 JSON 响应:

{
"results": [
    {
        "entityType": "PERSON",
        "id": 679,
        "graphId": "679.PERSON",
        "details": [
            {
                "entityType": "PERSON",
                "id": 679,
                "graphId": "679.PERSON",
                "parentId": 594,
                "role": "Unspecified Person",
                "relatedEntityType": "DOCUMENT",
                "relatedId": 058,
                "relatedGraphId": "058.DOCUMENT",
                "relatedParentId": null
            }
        ]
    },
    {
        "entityType": "PERSON",
        "id": 69678,
        "graphId": "69678.PERSON",
        "details": [
            {
                "entityType": "PERSON",
                "id": 678,
                "graphId": "678.PERSON",
                "parentId": 594,
                "role": "UNKNOWN",
                "relatedEntityType": "DOCUMENT",
                "relatedId": 145,
                "relatedGraphId": "145.DOCUMENT",
                "relatedParentId": null
            }
        ]
    }

这个 JSON 响应的问题是 $.results[0] 并不总是相同的,它可能有几十个结果。我知道我可以执行单独的 JSON 断言调用,其中我使用通配符执行 JSON

$.results[*].details[0].entityType

$.results[*].details[0].relatedEntityType 等

但是,我需要在一次 api 调用中验证“PERSON”和“DOCUMENT”是否在同一路径中正确匹配,因为结果每次都以不同的路径返回。

有没有办法在一个 JSON 断言中进行多次调用,还是我使用了错误的工具?

提前感谢您的帮助。

-重力

标签: jsonjmeter

解决方案


我认为 JSON 断言不够灵活,请考虑切换到JSR223 断言,在此您可以充分灵活地定义所需的任何通过/失败标准。

检查以下内容的示例代码:

  • 匹配查询的所有属性值$.results[*].details[0].entityType都等于PERSON
  • 并且所有匹配的属性值$.results[*].details[0].relatedEntityType都等于DOCUMENT

将会:

def entityTypes = com.jayway.jsonpath.JsonPath.read(prev.getResponseDataAsString(), '$.results[*].details[0].entityType').collect().find { !it.equals('PERSON') }
def relatedEntityTypes = com.jayway.jsonpath.JsonPath.read(prev.getResponseDataAsString(), '$.results[*].details[0].relatedEntityType').collect().find { !it.equals('DOCUMENT') }

if (entityTypes.size() != 1) {
    SampleResult.setSuccessful(false)
    SampleResult.setResponseMessage('Entity type mismatch, one or more entries are not "PERSON" ' + entityTypes)
}
if (relatedEntityTypes.size() != 1) {
    SampleResult.setSuccessful(false)
    SampleResult.setResponseMessage('Entity type mismatch, one or more entries are not "DOCUMENT" ' + relatedEntityTypes)
}

更多信息:

  1. SampleResult 类 JavaDoc
  2. Groovy:使用集合
  3. 在 Groovy 中编写 JMeter 断言脚本 - 教程

推荐阅读