空手道 - 验证整个json响应的模式

时间:2018-02-13 21:51:46

标签: karate

我正在使用Karate验证GET请求的整个json响应。

以下是来自请求的示例json响应(我只显示 items 的两个元素)

[
  {
    "items": [
      {
        "createdById": "ADMIN",
        "createdByName": "ADMIN",
        "changedByName": "ADMIN",
        "oid": "121212fgfg2123",
        "links": {
          "self": {
            "href": "/internal/organiz/12345"
          },
          "subcom": []
        },
        "name": "NewETLTesting"
      },
      {
        "createdById": "ADMIN",
        "createdByName": "ADMIN",
        "changedByName": "ADMIN",
        "oid": "1212dfffg45",
        "links": {
          "self": {
            "href": "/internal/organiz/5a6e0"
          },
          "subcom": []
        },
        "name": "FromKarateModified"
      }
    ]
  }
]

以下是我尝试验证的方式:

 And match response.*.* ==
    """
  {
    "createdById" : '#string',
    "createdByName" : '#string',
    "changedByName" : '#string',
    "oid" : '#string',
    "links" : '#object',
    "name" : '#string'
  }
    """

但是,我收到一个断言错误:reason: actual value is not map-like。如果我尝试在花括号周围放置方括号,我会得到reason: actual and expected arrays are not the same size。此外,我尝试使用$.[*].等响应,但无法使其正常工作。

提前致谢!!

2 个答案:

答案 0 :(得分:2)

您需要注意您的JSON结构并更好地理解JsonPath。您可以剪切并粘贴下面的内容并查看它是否正常工作:

* def response = 
"""
[
  {
    "items": [
      {
        "createdById": "ADMIN",
        "createdByName": "ADMIN",
        "changedByName": "ADMIN",
        "oid": "121212fgfg2123",
        "links": {
          "self": {
            "href": "/internal/organiz/12345"
          },
          "subcom": []
        },
        "name": "NewETLTesting"
      },
      {
        "createdById": "ADMIN",
        "createdByName": "ADMIN",
        "changedByName": "ADMIN",
        "oid": "1212dfffg45",
        "links": {
          "self": {
            "href": "/internal/organiz/5a6e0"
          },
          "subcom": []
        },
        "name": "FromKarateModified"
      }
    ]
  }
]
"""
And match each response[0].items ==
"""
  {
    "createdById" : '#string',
    "createdByName" : '#string',
    "changedByName" : '#string',
    "oid" : '#string',
    "links" : '#object',
    "name" : '#string'
  }
"""

答案 1 :(得分:0)

下面的架构将正确验证整个响应

* def refSubcom = {<object schema>}
* def refself = {href : '#string'}
* def refLinks = {self : '#object refself', subcom:'##[] refSubcom'}
* def optionalItemArr = 
    """
    {
        createdById:'#string',
        createdByName:'#string',
        changedByName:'#string',
        oid: '#string',
        links: '#object refLinks',
        name:'#string'
    }
    ###
* def itemData = 
    """
    {
        item : '##[] optionalItemArr'
    }
    """
* def reponseSchema = '##object itemData'

* def SuccessSchema = '##[] reponseSchema'

您可以参考以下链接:karate : Complex JSON Schema matching