karate - 如何在 Karate 中比较 XML 响应与 Json

标签 karate

我需要将我的 JSON 响应与下游 XML 响应进行匹配并验证。以下是两者的响应示例。

请注意,Json 响应参数与 XML 响应不按顺序排列。

JSON 响应

"Main": {
    "Cd": "ABC",
    "descriptionTxt": "Sample Main",
    "type": "A",
    "codeType": "P",
    "dt": "2018-10-15T00:00:00-05:00",
    "validity": "3",
    "segment": "Personal"
    },
  "testList": [
    {
      "code": "123",
      "descriptionTxt": "My Description",
      "categoryCd": "DUDU"
    },
    {
      "code": "675",
      "descriptionTxt": "His Description"
    },
    {
      "code": "345",
      "descriptionTxt": "Your Description",
      "categoryCd": "BH"
    }
]

XML 响应

<S:Body>
<ns4:code>ABC </ns4:code>
    <ns5:description>Sample Main</ns5:description>
    <ns5:Date>2018-10-15</ns5:Date>
    <ns5:Type>A</ns5:Type>
    <ns5:codeType>P</ns5:codeType>
    <ns5:validity>3</ns5:validity >
    <ns5:Segment>PERSONAL  </ns5:Segment>
    <ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>

    <ns4:Test>
      <ns5:code>123   </ns5:code>
      <ns5:description>My Description</ns5:description>
      <ns5:categoryCode>DUDU</ns5:categoryCode>
      <ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
    </ns4:Test>

    <ns4:Test>
      <ns5:code>345   </ns5:code>
      <ns5:description>Your Description</ns5:description>
      <ns5:categoryCode>BH</ns5:categoryCode>
    </ns4:Test>

    <ns4:Test>
      <ns5:code>675  </ns5:code>
      <ns5:description>His Description</ns5:description>
      <ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
    </ns4:Test>

最佳答案

如果您花时间发布格式正确的 JSON 和 XML,那就太好了,但无论如何。我在这里关注的难题是,将重复的 XML 元素映射到 JSON,如果将以下内容粘贴到 Scenario 中,您可以看到它的工作原理:

* def json = 
"""
{
   "Main": {
      "Cd":"ABC",
      "descriptionTxt":"Sample Main",
      "type":"A",
      "codeType":"P",
      "dt":"2018-10-15T00:00:00-05:00",
      "validity":"3",
      "segment":"Personal"
   },
   "testList":[
      {
         "code":"123",
         "descriptionTxt":"My Description",
         "categoryCd":"DUDU"
      },
      {
         "code":"675",
         "descriptionTxt":"His Description"
      },
      {
         "code":"345",
         "descriptionTxt":"Your Description",
         "categoryCd":"BH"
      }
   ]
}
"""
* def xml = 
"""
<ns4:root xmlns:ns4="http://foo.com" xmlns:ns5="http://bar.com">
   <ns4:Test>
      <ns5:code>123</ns5:code>
      <ns5:description>My Description</ns5:description>
      <ns5:categoryCode>DUDU</ns5:categoryCode>
      <ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
   </ns4:Test>
   <ns4:Test>
      <ns5:code>345</ns5:code>
      <ns5:description>Your Description</ns5:description>
      <ns5:categoryCode>BH</ns5:categoryCode>
   </ns4:Test>
   <ns4:Test>
      <ns5:code>675</ns5:code>
      <ns5:description>His Description</ns5:description>
      <ns5:unwanted>Unwanted XML Parameter</ns5:unwanted>
   </ns4:Test>
</ns4:root>
"""
* def list = $xml/root/Test
* def xpath = function(x, p){ try { return karate.xmlPath(x, p) } catch (e) { return '#notpresent' } }
* def fun = function(x){ return { code: xpath(x, '/Test/code'), descriptionTxt: xpath(x, '/Test/description'), categoryCd: xpath(x, '/Test/categoryCode') } }
* def temp = karate.map(list, fun)
* print temp
* print json.testList
* match json.testList contains temp

映射 JSON 的其余部分对您来说是一项练习。请参阅文档。另请参阅此答案以获取更多想法:Karate - Match two dynamic responses

关于karate - 如何在 Karate 中比较 XML 响应与 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53471153/

相关文章:

java - 向 Karate 框架添加自定义步骤定义

javascript - 在Karate框架中的RunnerTest.have中编写javascript公共(public)函数

rest - 替换不带引号的 JSON 键值

java - 在 Karate DSL 中,如何验证响应中的字段名称而不关心它们的值是什么

jenkins - 已标记 Jenkins 上的 Karate 测试运行未完成

java - Karate :使用 JUnit5 的运行者类(class)

Karate - 在 karate-config.js 中设置全局 User-Agent header

karate - 配置 Karate 模拟以使用具有 JSON、XML 以外内容类型的 API

testing - 使用多个标签在 Karate 选项中运行

java - 如何使用命令行在 Gradle 上运行 Karate 测试