Скрипты PostMan Test: проверка содержимого JSON ответа

PostMan 6.0.10 здесь. Я пытаюсь понять, как писать тестовые скрипты немного лучше, и после прочтения их иначе превосходная документация Я все еще не понимаю, как запрашивать и проверять ответ JSON, возвращаемый на запросы.

В частности, учитывая следующий фрагмент кода JavaScript:

pm.test("Verify the contents of the response payload are correct", function () {
    // ???
});

Мне нужно иметь возможность запрашивать ответ JSON и:

  • Определите, является ли ответ одним объектом JSON или массивом объектов JSON.
  • Если это массив, определите размер (количество элементов в массиве)
  • В противном случае, если это один объект, мне нужно иметь возможность запрашивать этот объект для определенных полей (скажем, поля с именем "fizzbuzz") и получать значения и типы JSON (строка, число, логическое значение, null) этих полей.

Сценарий №1: ответ JSON - это массив

Пример:

[
    {
        "fizz": "buzz",
        "foo": 53
    },
    {
        "fizz": "bozz",
        "foo": 291
    }
]

Сценарий № 2: ответ JSON - это один объект

Пример:

{
    "fizz": "buzz",
    "foo": 293
}

Есть идеи, как можно выполнить эту проверку JSON полезных данных ответа?


person smeeb    schedule 31.03.2018    source источник
comment
что ты уже испробовал? Для исследования вам следует обратиться к документации по тестам, где вы можете использовать синтаксис pm.expect() и утверждение chai. Также ознакомьтесь с другими вопросами здесь, чтобы получить подсказки. Было бы неправильно, если бы кто-то написал код за вас, поскольку вы на самом деле не стали бы изучать его для себя.   -  person Danny Dainton    schedule 31.03.2018
comment
Спасибо @DannyDainton (+1). Я видел, что могу вложить что-то вроде pm.response.to.have.jsonBody() в закрытие pm.test, но если я не упускаю что-то важное в документации, не похоже, что я действительно могу проверить вывод jsonBody().   -  person smeeb    schedule 31.03.2018
comment
Все тело ответа будет pm.response.json() в зависимости от того, что было возвращено и против чего вы должны утверждать, вы можете сделать это в expect функции. pm.expect(pm.response.json().whatever).to.equal('some_value')   -  person Danny Dainton    schedule 31.03.2018
comment
Добавьте пример тела ответа к исходному вопросу, и вам будет легче посоветовать, что писать. Без этого ответом мог бы быть буквально любой действительный JSON, никто бы не знал, что вам сказать.   -  person Danny Dainton    schedule 31.03.2018
comment
Еще раз спасибо @DannyDainton (+1 за оба). Я включил несколько примеров сценариев JSON (как в случае ответа массива, так и в случае ответа одного объекта) в исходный вопрос. Можете ли вы помочь мне понять, как ...json().whatever и 'some_value' на самом деле будут выглядеть в обоих моих сценариях? Еще раз спасибо!   -  person smeeb    schedule 31.03.2018


Ответы (2)


Это базовый вариант, но он должен работать, чтобы получить динамику:

pm.test("Verify payload of example one",  () => {
    pm.expect(pm.response.json()[0].fizz).to.equal('buzz')
    pm.expect(pm.response.json()[0].foo).to.equal(53)
    pm.expect(pm.response.json()[1].fizz).to.equal('bozz')
    pm.expect(pm.response.json()[1].foo).to.equal(291)
});

pm.test("Verify payload of example two",  () => {
    pm.expect(pm.response.json().fizz).to.equal('buzz')
    pm.expect(pm.response.json().foo).to.equal(293)
});

Возможно, стоит изучить базовый JavaScript и узнать, как анализировать объекты JSON.

person Danny Dainton    schedule 31.03.2018

// Вы можете сделать что-то вроде этого

 if (responseCode.code === 200) {
  var jsonDataArray;
  var jsonArray= JSON.parse(responseBody);
 var found=false;

       for (var i = 0;i<jsonArray.length;i++){`enter code here`

     jsonDataArray = jsonArray[i];
     for (var j = 0; j<jsonDataArray.length && found === false;j++){
         if (jsonDataArray[j].fizz === "buzz" && jsonDataArray[j].foo === 53)
person BKM    schedule 06.02.2020