Создаём API-тесты на Python через Tavern
Для Python существует много хороших тест-инструментов. Один из них — Tavern. Он представляет собой фреймворк тестирования API и работает на основе pytest. Tavern открывает широкие возможности по созданию и запуску API-тестов и имеет хорошую документацию, что тоже немаловажно.
Устанавливать Tavern лучше всего через pip, используя простую команду:
pip install -U tavern
Сами тесты пишутся в YAML-файлы. Для наглядности давайте напишем тест, извлекающий данные о местоположении для индекса США 90210 из API Zippopotam.us и проверяющий, что код HTTP-ответа равен 200:
test_name: Get location for US zip code 90210 and check response status code stages: - name: Check that HTTP status code equals 200 request: url: http://api.zippopotam.us/us/90210 method: GET response: status_code: 200
Для запуска теста вызовем pytest и сообщим, что тесты, которые хотим запустить, находятся в YAML-файле, который мы создали:
Как видим, тест пройден.
Также нам может понадобиться проверить значения для конкретных заголовков ответа. Следует убедиться, что content-type ответа равен «application/json», плюс пользователю API сообщается, что ответ необходимо интерпретировать как JSON:
test_name: Get location for US zip code 90210 and check response content type stages: - name: Check that content type equals application/json request: url: http://api.zippopotam.us/us/90210 method: GET response: headers: content-type: application/json
Можно проверить и тело ответа. В следующем примере мы увидим, что местоположение, связанное с упомянутым выше почтовым индексом, ассоциируется с «Beverly Hills»:
test_name: Get location for US zip code 90210 and check response body content stages: - name: Check that place name equals Beverly Hills request: url: http://api.zippopotam.us/us/90210 method: GET response: body: places: - place name: Beverly Hills
Поскольку все API касаются данных, можно повторить один и тот же тест более одного раза, но с разными значениями для входных параметров и ожидаемых результатов (то есть выполнить тестирование на основе данных). Фреймворк Tavern поддерживает этот подход через специальный маркер pytest – parametrize:
test_name: Check place name for multiple combinations of country code and zip code marks: - parametrize: key: - country_code - zip_code - place_name vals: - [us, 12345, Schenectady] - [ca, B2A, North Sydney South Central] - [nl, 3825, Vathorst] stages: - name: Verify place name in response body request: url: http://api.zippopotam.us/{country_code}/{zip_code} method: GET response: body: places: - place name: "{place_name}"
Как видите, мы написали один тест, который состоит из одного этапа. Однако применение маркера parametrize и 3-х вариантов данных позволит pytest успешно прогнать 3 теста (это напоминает работу @DataProvider в TestNG для Java):
Пока мы выполняли лишь GET-операции, позволяющие получать данные от поставщика API, поэтому мы не описывали содержание тела запроса. Однако если вы, как потребитель API, желаете отправить поставщику какие-либо данные (к примеру, посредством операций PUT или POST), то через Tavern это реализуется следующим образом:
test_name: Check response status code for a very simple addition API stages: - name: Verify that status code equals 200 when two integers are specified request: url: http://localhost:5000/add json: first_number: 5 second_number: 6 method: POST response: status_code: 200
Вышеописанный тест отправит JSON-документ посредством POST-запроса
Пожалуй, на этом можно закончить наше краткое введение в Tavern. Все описанные примеры доступны на GitHub.