Разделы портала

Онлайн-тренинги

.
Один запрос, шестнадцать тестов
06.05.2020 00:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи
Перевод: Ольга Алифанова

Все читатели моего блога знают, как я увлечена тестированием API. Мне также очень нравится пользоваться Postman для такого тестирования, потому что, по моему мнению, это самый простой способ проверки API-запросов. Поэтому меня печалит, когда я вижу, что люди тестируют API, убеждаясь только в том, что получили ответ 200! Сегодня я возьму простой GET-запрос и покажу пример 16 тестов, которые можно прогнать вместе с ним.

В качестве GET-запроса я воспользуюсь прекрасным приложением Restful-Booker, созданным Марком Уинтерингэмом для обучения API-тестированию. URL запроса будет https://restful-booker.herokuapp.com/booking/1 - он вернет бронирование с ID 1. Если вы прогоните этот запрос в Postman, то получите примерно такой ответ:


Ответ выводит имя и фамилию гостя, полную стоимость номера, сообщает, оплачен или нет депозит, и выдает даты заезда и выезда.

В вашем ответе на этот запрос вы можете увидеть другие конкретные данные, потому что этот сайт часто используется людьми, практикующимися в API-запросах, и информация о брони меняется.

Давайте рассмотрим все различные тесты, которые можно прогнать с этим запросом. Для добавления тестов кликните на вкладку "Tests" под URL запроса.

1. Во-первых, мы можем добавить самый распространенный тест, проверяющий, что код ответа верный.

pm.test("Код ответа 200", function () { pm.response.to.have.status(200); });

pm.test означает "Postman-тест". "Код ответа 200" – это имя теста. А pm.response.to.have.status(200) – это ожидаемый в ответе результат.

2. Мы можем также убедиться, что ответ приходит достаточно шустро.

pm.test("Response time is less than 1000ms", function () { pm.expect(pm.response.responseTime).to.be.below(1000); });

Этот тест проверяет, что время ответа менее секунды.

3-8. Затем мы можем проверить, что в ответе присутствуют ожидаемые заголовки:

pm.test("Серверный заголовок присутствует", function () { pm.response.to.have.header("Server"); });
pm.test("Заголовок соединения присутствует", function () { pm.response.to.have.header("Connection"); });
pm.test("Заголовок Content-Length присутствует", function () { pm.response.to.have.header("Content-Length"); });
pm.test("Заголовок Etag присутствует", function () { pm.response.to.have.header("Etag"); });
pm.test("Заголовок даты присутствует", function () { pm.response.to.have.header("Date"); });
pm.test("Заголовок Via присутствует ", function () { pm.response.to.have.header("Via"); });

Эти тесты убеждаются в присутствии отдельных заголовков, а не проверяют конкретные значения в этих заголовках. Они могут быть и не особенно нужными, но иногда неплохо бывает убедиться, что какие-либо заголовки на месте – например, защита от XSS (X-XSS-Protection, отсутствует в этом API), означающая, что были предприняты меры защиты от межсайтового скриптинга.

9-10. Мы также можем провести тесты, валидирующие значения отдельных заголовков:

pm.test("Значение заголовка X-Powered-By - Express", function () {    pm.response.to.be.header("X-Powered-By", "Express");});
pm.test("Значение заголовка Content-Type - application/json", function () {    pm.response.to.be.header("Content-Type", "application/json; charset=utf-8");});

Первый тест убеждается, что используемый сервер – Express, а второй – что тип содержимого ответа - application/json.

11. Мы можем проверить, что в тело запроса включен определенный текст:

pm.test("Response contains last name", function () {    pm.expect(pm.response.text()).to.include("lastname");});

В этом тесте я проверяю, что текст ответа содержит фамилию ("lastname").

12-13. Я также могу проверить, что в ответе существуют определенные json-поля. Чтобы сделать это, мне сначала нужно извлечь json-данные из ответа и сохранить их в переменную:

var jsonData = pm.response.json();

Затем я могу проверить существование отдельных полей в переменной jsonData. Здесь я проверяю, что в ответе есть поля заезда и выезда:

pm.test("Response contains checkin date", function () {    pm.expect(jsonData.bookingdates.checkin).to.exist;})
pm.test("Response contains checkout date", function () {    pm.expect(jsonData.bookingdates.checkout).to.exist;})

14-15. Я также могу убедиться, что ответ возвращает определенные значения:

var jsonData = pm.response.json();
pm.test("Ответ вернул правильное имя", function () { pm.expect(jsonData.firstname).to.eql("Mark"); });
pm.test("Депозит оплачен", function () { pm.expect(jsonData.depositpaid).to.be.true; });

Первый тест проверяет, что значение имени в ответе – это "Mark", а второй – что признак оплаты депозита – "true". Учтите, что эти значения могут меняться, потому что другие люди тоже используют это API. Добавляя проверки на конкретные значения, убедитесь, что ваши тестовые данные не меняются, иначе ваши тесты будут нестабильны!

16. И, наконец, я могу проверить, что значение больше или меньше определенного числа:

var jsonData = pm.response.json();
pm.test("Цена больше 100", function () { pm.expect(jsonData.totalprice).to.be.above(100); });

Здесь я убеждаюсь, что общая стоимость больше 100.

Типы тестов для ваших API-ответов будут варьировать в зависимости от того, что вам важно проверять. Вышеприведенные тесты могут и не подходить для вашего API, но я надеюсь, что эти примеры показали, что проверять можно много чего, а не только "Код ответа 200".

Обсудить в форуме