Создаём API-тесты на Python через Tavern | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Professional JavaScript Developer. Professional Базы данных Android Developer. Professional Framework Laravel Cloud Solution Architecture Highload Architect Reverse-Engineering. Professional Vue.js разработчик Agile Project Manager VOIP инженер Scala-разработчик Супер-практикум по использованию и настройке GIT Symfony Framework Java Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

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

QA_Deep_27.02-5020-cb474f.png

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

tavern_test_status_code_1024x172_1-20219-cdccbe.png

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

Также нам может понадобиться проверить значения для конкретных заголовков ответа. Следует убедиться, что 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):

tavern_test_data_driven_1024x171_1-20219-49bef8.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.

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться