Тест Postman для поиска ключевого слова в массиве ответов

Я создаю тест в почтальоне, чтобы проверить ключевое слово «беременность» в каждом поле «имя» в JSON. Если каждое поле «имя» в JSON содержит ключевое слово, пройдите тест, иначе не пройдёте.

Найдите скрипт ниже, который я пытался использовать

var jsonData = pm.response.json(); 

var resultCount = jsonData.length;
for (i=0;i<resultCount;i++){
    var modelString = jsonData[i].name;
    if(modelString.indexOf("Pregnancy") > 0)
    {
       tests["Each organisation name field " +i+ " contains   \"Pregnancy\""] = modelString.has("Pregnancy");
    }
    else
    {
       pm.expect.fail("failed");
    }
}
console.log("")

[
    {
        "id": "1-116992830",
        "name": "British Pregnancy Advisory Service      (BPAS)",
        "numberOfLocations": 78
    },
    {
        "id": "1-1560082724",
        "name": "PAMS Pregnancy Ultrasound Centre      (PAMS 3D &     4D Baby Imaging)",
        "numberOfLocations": 1
    },
    {
        "id": "1-2458518720",
        "name": "Pregnancy Ultrasound Ltd      (Babyface4d)",
        "numberOfLocations": 1
    },
    {
        "id": "1-101728376",
        "name": "National Unplanned Pregnancy Advisory Service     Limited",
        "numberOfLocations": 23
    },
    {
        "id": "1-3578030817",
        "name": "Private Pregnancy Ultrasound Services Ltd trading as Expectancy Scanning Studios Ltd      (Expectancy Scanning Studios Ltd)",
        "numberOfLocations": 2
    },
    {
        "id": "1-1412821832",
        "name": "Foundation For Life (Salisbury)      (Pregnancy Advice Salisbury)",
        "numberOfLocations": 1
    },
    {
        "id": "1-2028907839",
        "name": "Miscarriage Clinic Limited      (Centre for     Reproductive Immunolgy and Pregnancy)",
        "numberOfLocations": 1
    },
    {
        "id": "1-744810951",
        "name": "Foundation For Life      (Tyneside Pregnancy Advice Centre)",
        "numberOfLocations": 1
    }
]

Я ожидаю, что если в каждом поле массива отсутствует «беременность», он не пройдет тест.


person Jhanz    schedule 17.05.2019    source источник
comment
В чем именно ваша проблема? Я бы начал с преобразования поискового запроса и строки, которую вы тестируете, в нижний регистр, чтобы метод indexOf работал как для «Беременности», так и для «беременности». Кроме того, строка «беременность» может иметь индекс 0, поэтому вы должны проверить, больше ли она, чем -1.   -  person Sjors    schedule 17.05.2019


Ответы (2)


Я добавил ваш JSON в https://api.myjson.com/bins/13qh7i, чтобы создать API для тестирования в Postman и добавил в массив один дополнительный объект с именем, в котором нет слова «беременность», чтобы вы могли увидеть тест в действии.

Если вы пройдете цикл и проверите свойство objects name на наличие слова «беременность» и сохраните те, которые найдены в hasPregnancy array, вы можете затем сравнить length array с length ответа API object array, чтобы увидеть, каждый ли object действительно содержит ключевое слово «беременность».

Ниже приведен код JS, который я использовал в тесте. Я также изменил ваш indexOf на includes, так как вы должны искать > -1 with indexOf. Я также заставил переменную modelString применять toLowerCase() к name, чтобы убедиться, что проверка не заботится о капитализации и т. д.

введите здесь описание изображения

// Get response
var jsonData = pm.response.json();
var resultCount = jsonData.length;

// Test arrays
var hasPregnancy = [];
var doesntHavePregnancy = [];

// Loop through and set arrays with matching data
for (i = 0; i < resultCount; i++) {
  var id = jsonData[i].id;
  var modelString = jsonData[i].name.toLowerCase();
  if (modelString.includes("pregnancy")) {
    hasPregnancy.push({
      "id": id,
      "hasPregnancy": modelString.has("pregnancy")
    });
  } else {
    doesntHavePregnancy.push({
      "id": id
    });
  }
}

// Check that each object in response contained keyword and length matches from test
pm.test("Expect response to contain pregnancy in each object", function() {
  console.log(hasPregnancy);
  console.log(doesntHavePregnancy);
  pm.expect(hasPregnancy.length).to.equal(resultCount);
});
person Woodrow    schedule 17.05.2019
comment
Пожалуйста. Пожалуйста, примите ответ, если он сработал для вас. Благодарю вас! - person Woodrow; 20.05.2019
comment
Спасибо за этот ответ, это также помогло мне ... вопрос, что если я хочу подсчитать количество тех, у кого есть беременность, и количество тех, у кого нет беременности ... потому что в моем тесте я хочу получить идентификатор из тех, которые содержат его, поскольку не все объекты будут содержать его... спасибо - person shahbaz; 01.10.2020

Используйте функцию сокращения ES6, которая накапливает результаты того, включает ли имя каждого элемента «Беременность» при повторении ответа.

const jsonData = pm.response.json();
tests[`Each organisation name field contains \"Pregnancy\"`] = jsonData
  .reduce((acc, org) => acc && org.name.toLowerCase().includes("pregnancy"));
  • Вы обнаружите, что такие функции ES6, как map и reduce, обычно более выразительны.
  • Использование inlcudes делает ваше намерение более ясным, чем indexOf
  • Я добавил toLowerCase(), чтобы совпадения не учитывали регистр.

Прохождение теста почтальона

Неудачный тест почтальона

person Community    schedule 17.05.2019