Как распарсить дату, сравнить два массива и понять, почему не равны одинаковые числа
На тему автотестов для Postman статей в интернете много, однако большинство ограничиваются самыми основами - как начать и написать первый автотест. Когда дело доходит до серьезных проверок, найти ответы бывает очень сложно. Особенно, если знания JS на самом общем уровне. Поэтому дальше будет несколько подсказок, как сделать ту или иную проверку.
1. Как распарсить дату
2. Сравнить число со строкой
3. Проверить заполнено ли поле
4. Сравнить два массива
Еще немного общих слов о полезности автотестов
При проверке методов REST API требуется сравнить данные, которые приходят из разных систем, в разных методах. Конечно, это можно сделать глазами, но когда полей много, есть сложные вычисления или похожие массивы, то сравнивать становится сложно. И регресс превращается в катастрофу, потому что равносилен полноценному тестированию с нуля.
Автотесты мне очень помогли. Я не берусь делать оценку эффективности, потому что время на их написание было. А использовались они потом и для проверки исправленных багов, и для повторных скоростных проверок.
1. Как распарсить дату
Задача: в одном методе надо получить дату, преобразовать ее в формат <день> <месяц> и сравнить с датой, которая помещается внутрь текстового оповещения в другом методе
Решение:
До этого все получаемые данные вынимались из формата JSON стандартной командой
var jsonData = JSON.parse(responseBody);
Она вполне подходит, если затем дату нужно сравнить как есть, без преобразования. Если же приходится переводить во что-то другое, то используется:
var d = new Date();
d.setTime(Date.parse(jsonData.data.date));
pm.environment.set("time", d.toLocaleDateString());
Первая строка задает переменную времени, вторая получает дату, как дату, а не строку, третья устанавливает переменную для Постмана и преобразует время в нужный формат. В данном случае: 31.03.2019
Для формата <день> <месяц> используется:
pm.environment.set("time", d.toLocaleDateString("ru", {day: "numeric", month: "long"})); - 5 мая
2. Сравнить число со строкой
Задача: в одном методе получить id, который состоит из цифр, и проверить, что в другом методе он такой же.
Решение:
Казалось бы, все просто. Взяли поле “id” в одном методе, положили в переменную, взяли в другом методе и сравнили.
//1 метод. Установить переменную, в которую положить id
pm.environment.set("internet.id", pm.response.json().data.id); - 127487
//2 метод. Взять переменную и сравнить с полученным аналогичным значением
var id = jsonData.data.internet.id; - "127487"
tests["Проверяем id интернета - " + pm.environment.get("internet.id")] = id === pm.environment.get("internet.id"); - "127487"===127487
И тут тест падает. Во втором методе Postman записал id как строку, а в переменной произошло волшебство и число преобразовалось в число. Строка числу не равна, хотя внешне выглядит одинаково.
Преобразование в число можно выполнить простой командой +: добавляем плюс к id
tests["Проверяем id интернета - " + pm.environment.get("internet.id")] = +id === pm.environment.get("internet.id");
Итог - тест зеленый.
3. Проверить заполнено ли поле
Задача: в одном методе данные могут прийти, а могут не прийти в зависимости от различных условий. Требуется установить проверку, что нужное поле есть.
Решение:
1. Проверяем, что значение inet есть:
var avail = jsonData.data.inet;
if (avail !== undefined)
{ …. } else { …. }
undefined означает, что значение не определено. Знак неравенства в данном случае дает обратный результат. То есть «Значение avail не не определено». Следовательно после if начинаем обычные проверки, так как значение есть. Для удобства в разделе else я задаю проверку, которая пройдет в любом случае, например, на id или title, но в описании теста пишу «Значение не определено» или «Скидки нет», в зависимости от вводных условий.
2. Проверяем, что массив не пуст:
var arr = [];
arr = jsonData.data.services;
if (arr.length !== 0)
{ …. } else { …. }
Здесь все просто. Изначально массив services есть, но в нем нет значений. Это определяется счетчиком элементов. Если не ноль, то проводим нужные проверки, в ином случае - можно добавить служебный тест для себя с указанием, что массив пуст.
4. Сравнить два массива
Задача: в одном методе получить массив данных, в котором записаны: id, speed, price, и сравнить с аналогичным массивом в другом методе. Сложность в том, что в первом случае данные отсортированы по id, во втором - по price.
Решение:
//Так как размер массива не известен, то считаем количество элементов для цикла
var arr = [];
arr = jsonData.data.inet;
for (var i = 0; i < arr.length; i++) {
//создаем первый массив с данными для будущего сравнения
var array = [jsonData.data.inet[i].id, jsonData.data.inet[i].speed, jsonData.data.inet[i].price];
//помещаем массив в переменные, имена которых формируются в цикле по id
pm.environment.set(jsonData.data.inet[i].id, JSON.stringify(array, null, 2));
}
Теперь нужно получить аналогичные данные во втором методе и найти способ, как их сравнить.
//Устанавливаем счетчик цикла
var arr = [];
arr = jsonData.data.otvet;
for (var i = 0; i < arr.length; i++)
{
//получаем в цикле данные второго массива для сравнения
var array1 = [jsonData.data.otvet[i].id, jsonData.data.otvet[i].speed, jsonData.data.otvet[i].price];
//теперь сам тест сравнения. Так как в массив помещается всего три элемента, то их можно взять отдельно и расставить в нужном порядке
tests["Сравниваем массивы - " + array1 + " c этим: " + pm.environment.get(array1[0])] = array1[0], array1[1], array1[2] === pm.environment.get(array1[0]);
}
array1[0] - нулевой элемент массива в нашем случае это id, и он одинаковый в обоих методах. Именно его используем в первом методе, чтобы назвать переменные. И его же, чтобы выбрать данные для сравнения.