Создаём API-тесты на Python через Tavern

Amney

Друзья
Сообщения
170
Реакции
74
Возраст
28
1598856038464.png


Для Python существует много хороших тест-инструментов. Один из них — Tavern. Он представляет собой фреймворк тестирования API и работает на основе pytest. Tavern открывает широкие возможности по созданию и запуску API-тестов и имеет хорошую документацию, что тоже немаловажно.

Устанавливать Tavern лучше всего через pip, используя простую команду:

pip install -U tavern


Сами тесты пишутся в YAML-файлы. Для наглядности давайте напишем тест, извлекающий данные о местоположении для индекса США 90210 из API Zippopotam.us и проверяющий, что код HTTP-ответа равен 200:

YAML:
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-файле, который мы создали:
1598856205074.png

Как видим, тест пройден.

Также нам может понадобиться проверить значения для конкретных заголовков ответа. Следует убедиться, что content-type ответа равен «application/json», плюс пользователю API сообщается, что ответ необходимо интерпретировать как JSON:

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:
Python:
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):
1598856337897.png
Пока мы выполняли лишь 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-запроса {'first_number': 5, 'second_number': 6} к поставщику API, который работает по адресу localhost: порт 5000. Учтите, что по вполне понятным причинам этот тест упадёт, когда вы попытаетесь его запустить (правда, можете создать API либо заглушку, что позволит тесту пройти успешно — кстати говоря, это станет прекрасной практикой).

Пожалуй, на этом можно закончить наше краткое введение в Tavern. Все описанные примеры доступны на GitHub.
 
Верх