Проверьте jsonschema по массиву json, имеющему несколько элементов, используя postman и tv4 - PullRequest
1 голос
/ 01 апреля 2020

Ниже моя JSON схема

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": [
    {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "stations": {
          "type": "array",
          "items": [
            {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer"
                },
                "serial_number": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "serial_number",
                "name"
              ]
            }
          ]
        }
      },
      "required": [
        "id",
        "name",
        "stations"
      ]
    }
  ]
}

Ниже json для проверки

[
    {
        "id": 1,
        "name": "Test location",       
        "stations": [
            {
                "id": 1,
                "serial_number": "TEST001",
                "name": "TEST-STN!"                
            }
        ]

    },
    {
        "id": 2,
        "name": "Test location2"    
    }

]

Здесь элемент "станции" помечен как требуемый в схеме, но это отсутствует во втором пункте json. по-прежнему валидация tv4 пройдена.

Что нам действительно нужно, так это то, что она должна пройти проверку, поскольку элемент станции отсутствует во втором элементе

Наблюдение - ЕСЛИ элемент станции - НЕ присутствует в любом элементе JSON, тогда проверка не пройдена. Но если элемент станции присутствует в одном из элементов, проверка пройдена

pm.test("Login Validation", function() { pm.expect(tv4.validate(pm.response.json(), pm.environment.get('schema.json'), true, true), tv4.error).to.be.true;});

Я попробовал параметр tv4 "checkRecursive" со значениями true и false ... Тем не менее он проходит проверка

Любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Я думаю, что-то вроде этого будет работать для вас и покажет проблему:

let schema = {
    "type": "array",
    "items": {
        "type": "object",
        "required": [
            "id",
            "name",
            "stations"
        ],
        "properties": {
            "id": {
                "type": "integer"
            },
            "name": {
                "type": "string"
            },
            "stations": {
                "type": "array",
                "items": {
                    "type": "object",
                    "required": [
                        "id",
                        "serial_number",
                        "name"
                    ],
                    "properties": {
                        "id": {
                            "type": "integer"
                        },
                        "serial_number": {
                            "type": "string"
                        },
                        "name": {
                            "type": "string"
                        }
                    }
                }
            }
        }
    }
}

pm.test("Check Schemat", () => {
    pm.response.to.have.jsonSchema(schema)
}) 

Я включил функцию jsonSchema() Postman, так как она использует AJV, а не старый и не поддерживаемый в настоящее время модуль tv4. .

2 голосов
/ 01 апреля 2020

Ключевое слово items может принимать схему или массив схем и имеет различную семантику в зависимости от используемой версии.

Когда items принимает одну схему, оно описывает массив где все элементы в массиве должны соответствовать заданной схеме.

{
  "type": "array".
  "items": { "type": "string" }
}

["a", "b", "c"]

Когда items принимает массив схем, он описывает кортеж, где каждая схема в items сравнивается с соответствующим элементом в массив экземпляров.

{
  "type": "array",
  "items": [{ "type": "string" }, { "type": "integer" }, { "type": "boolean }]
}

["a", 1, false]

Вы сбиты с толку, потому что вы используете неправильную форму items. Поскольку вы использовали форму массива, только первый элемент в вашем массиве проверяется. Валидатор игнорирует остальные элементы.

...