YAML:如何按索引寻址和检查JSON数组元素?

时间:2018-12-25 16:31:23

标签: json unit-testing yaml

我正在尝试对数组中的特定元素进行YAML检查。该数组包含具有相同数据收集类型的多个元素。问题是数组可以动态变化,总共有0、1、2、3 ... 10个元素,而且我们无法预先预测(因此,我们现在仅检查数组的第一个元素),因为在其他多台计算机上运行这些测试。

我不知道如何编码,以便它检查数组中的至少一个元素(并且忽略了事实,即可能发现了更多元素)。 “硬编码”特定数量的预期数组元素将导致某些机器上的测试失败,因为数组元素的数量不同,导致数组元素的数量与实际结果不匹配。

因此,我们必须通过指定该数组的第一个索引来找到它找到的第一个元素。

我们使用JSON作为返回的响应主体(并且我使用JSON到YAML转换器(https://www.json2yaml.com/)以YAML格式显示数据)

我参考了很多有关YAML的文档,还参考了示例,但是它们都没有涉及解决特定的数组元素。到目前为止,Google搜索也无济于事。

JSON如下:

[
  {
    "network_name": "Network Device 1",
    "id": "1234abcd-5467-efgh-8901-ijkl2345mnop",
    "priority": 3,
    "interfaces": [
      {
        "port_id": "eth1",
        "speed": "10Gbit/s",
        "mtu": 1500
      },
      {
        "port_id": "eth2",
        "speed": "10Gbit/s",
        "mtu": 1500
      },
      {
        "port_id": "eth3",
        "speed": "1Gbit/s",
        "mtu": 1500
      }
    ]
  }
]

这是我当前的代码:

---
test_name: Access network server
includes:
  - !include common.yaml

stages:
  - &the_id_anchor
    name: Access test - network devices
    request:
      url: "http://{service.host_ip:s}:{service.host_port:d}/v1.0/network-devices/"
      method: GET

    response:
      status_code: 200
      save:
        body:
          the_id: 0.id

  - name: Access test - network devices_2
    request:
      url: "http://{service.host_ip:s}:{service.host_port:d}/v1.0/network-devices/"
      method: GET
    response:
      status_code: 200
      body:
        - id: "{the_id:s}"
          network_name: 
          interfaces:
          - port_id: "eth1"

这是我收到的错误:

>           raise TestFailError("Test '{:s}' failed:\n{:s}".format(self.name, self._str_errors()), failures=self.errors)
E           tavern.util.exceptions.TestFailError: Test 'Access test - network devices_2' failed:
E           - Value mismatch in body: Length of returned list was different than expected - expected 1 items, got 3 (expected["0"]["interfaces"] = '[{'port_id': 'eth1'}]' (type = <class 'list'>), actual["0"]["interfaces"] = '[{'port_id': 'eth1', 'speed': '10Gbit/s', 'mtu': 1500}, {'port_id': 'eth2', 'speed': '10Gbit/s', 'mtu': 1500}, {'port_id': 'eth3', 'speed': '1Gbit/s', 'mtu': 1500}]' (type = <class 'list'>))

那么,如何使YAML仅检查该数组的第一个元素(仅检查第一个port_ID,speed和mtu),并在有更多接口的情况下忽略其余部分?

0 个答案:

没有答案