Современные приложения имеют сложную, зачастую распределенную структуру и тестирование таких приложений, с целью проверки соответствия требованиям и корректности обработки ошибок, является важной задачей, требующей затрат времени и ресурсов. В связи с этим, нам необходимо максимально автоматизировать проведение тестирования. Кроме того, к любому динамично развивающемуся приложению разработчики выпускают обновления и обновленные версии приложений тоже нуждаются в тестировании.
В сегодняшней статье мы поговорим об использовании Python для проверки API веб приложений. Но сначала давайте рассмотрим, что представляет из себя тестирование API.
Интерфейсы прикладного программирования (API) играют решающую роль в обеспечении взаимодействия между различными программными компонентами. И всестороннее тестирование API является важным элементом в обеспечении проверки работоспособности приложений. При этом, в дополнение к тестированию технических аспектов API, таких как протокол HTTP и коды ответов, разработчики и тестировщики также полагаются на API для тестирования различных частей бизнес-логики. Это включает в себя тестирование различных сценариев и крайних случаев эксплуатации, чтобы убедиться, что API обрабатывает их надлежащим образом. Тестируя бизнес-логику с помощью API, разработчики и тестировщики могут убедиться в корректности функционирования приложения в целом, что может помочь улучшить общее качество и надежность программного обеспечения.
Многообразие тестов
Чтобы протестировать API, мы можем выполнить несколько типов тестирования, в том числе:
Функциональное тестирование: Проверяет функциональность API, такую как его способность обрабатывать запросы и возвращать ожидаемый ответ.
Тестирование производительности: Оценивает производительность API при различных условиях нагрузки, таких как высокий трафик и параллельные запросы.
Интеграционное тестирование: Гарантирует, что API беспрепятственно работает с другими программными компонентами, такими как базы данных и сторонние приложения.
Тестирование безопасности: проверяет безопасность API, например, проверяет наличие уязвимостей и обеспечивает соответствие правилам безопасности.
Лучшие практики тестирования API
Чтобы выполнить эффективное тестирование API, разработчик тестов должен следовать некоторым рекомендациям. Прежде всего, нам необходимо определить четкие и конкретные тестовые примеры и сценарии. Нам необходимо понимать какой результат мы хотим получить в результате проверки. Также использование автоматизированных инструментов тестирования повышает эффективность и снижает риск человеческих ошибок.
Отдельно следует продумать общую стратегию тестирования, а именно как тестировать конечные точки API по отдельности и в сочетании. Важно правильно собирать и интерпретировать результаты тестов, вести мониторинг производительности API и времени отклика.
Также, при тестировании необходимо собирать коды HTTP ответов. Коды состояния HTTP-ответа - это трехзначные числа, представляющие результат запроса клиента к веб-серверу. Эти коды состояния предоставляют важную информацию об ответе сервера на запрос клиента, такую как успех или неудача и причина результата. Понимая эти коды, разработчики могут более эффективно устранять неполадки, связанные с API, и отлаживать их.
Существует несколько категорий кодов состояния HTTP-ответа, каждая из которых представляет другой тип ответа. Наиболее распространенными категориями являются 1xx, 2xx, 4xx и 5xx, каждая из которых представляет собой другой тип ответа.
1xx представляет собой информационные ответы.
2xx представляет успешные ответы.
4xx представляет ошибки клиента.
5xx представляет ошибки сервера.
Далее поговорим о реализации тестов на практике.
Фреймворк PyTest
Python - хорошо известный язык программирования и является одним из самых популярных языков на сегодняшний день. Благодаря наличию большого числа библиотек и фреймворков, Python можно использовать для выполнения задач по автоматизации тестирования. Лучшим средством для этих целей является фреймворк Pytest. Основными преимуществами этого фреймворка является простота в использовании, высокая гибкость и большое количество настроек, поддержка различных плагинов, наличие хорошего функционала по отчетности.
Существует множество инструментов и библиотек, доступных для тестирования API. Эти инструменты упрощают написание и запуск автоматизированных тестов для API, обеспечивая их функциональность, надежность и безопасность.
Далее мы рассмотрим библиотеку Tavern, предназначенную для тестирования RESTful API.
Tavern
Tavern - это библиотека Python с открытым исходным кодом, предлагающая целый ряд функций, таких как утверждения, тестирование на основе данных, поддержка различных методов аутентификации и форматов данных.
С помощью Tavern тестировщики могут определять пользовательские утверждения, которые сравнивают данные ответа с ожидаемыми значениями, чтобы гарантировать, что API функционирует должным образом. Кроме того, тестирование, основанное на данных, позволяет тестировщикам использовать различные наборы данных для проверки поведения API в различных условиях.
Поддержка Tavern различных методов аутентификации и форматов данных, включая базовую аутентификацию HTTP, OAuth2 и форматы данных JSON и YAML, позволяет тестировщикам легко моделировать различные типы аутентификации пользователей, а также писать и выполнять тесты, используя предпочитаемый ими формат данных.
Кроме того, Tavern можно легко настроить с помощью плагинов, что позволяет тестировщикам адаптировать его к своим конкретным потребностям.
Установить эту библиотеку проще всего с помощью pip
pip install -U tavern
В качестве языка описания тестов в Tavern используется YAML формат. Давайте для начала напишем простой тест, проверяющий доступность веб ресурса. В качестве тестового ресурса у нас будет выступать API находящаяся по адресу https://httpbin.org/get. Если обратиться по этому пути через браузер, то мы получим ответ виде JSON.
Итак, напишем простой тест, который проверяет доступность API по возвращаемому коду 200. Нам необходимо создать YAML файл, но назвать его как попало не получиться. Имя должно начинаться с test, далее после точки должно быть tavern.yaml (у меня это test200.tavern.yaml).
test_name: Check response status code
stages:
- name: Check that HTTP status code equals 200
request:
url: https://httpbin.org/get
method: GET
response:
status_code: 200
Для запуска выполним:
tavern-ci test200.tavern.yaml
Получаем отчет по результатам. Давайте немного усложним наши тесты, а именно проверим значения для конкретных заголовков ответов. То есть, проверим, что тип содержимого ответа равен ‘application/json’, который сообщает клиенту API, что ему нужно интерпретировать ответ как JSON:
test_name: Check response content type
stages:
- name: Check that content type equals application/json
request:
url: https://httpbin.org/get
method: GET
response:
headers:
content-type: application/json
Продолжим усложнять наши тесты. Теперь давайте попробуем проверить тестируемую API на наличие в выводе нескольких значений. Для этого нам необходимо провести один и тот же тест несколько раз, но с разными значениями входных параметров и ожидаемых выходных данных (т.е. выполнить тестирование на основе данных). Для этого в Tavern предусмотрен маркер маркер параметризации:
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}"
Здесь в целях улучшения наглядности результатов мы используем тестовую API http://api.zippopotam.us/. В зависимости от передаваемых в запросе значений country_code и zip_code мы получаем ответы place_name.
Несмотря на то, что мы указали только один тест с одним этапом, поскольку мы использовали маркер параметризации и снабдили тест тремя записями тестовых данных, pytest эффективно запускает три теста.
Заключение
Tavern предоставляет достаточно мощный инструментарий, позволяющий тестировать Rest API с помощью Python. В этой статье мы рассмотрели лишь небольшую часть этого инструментария, позволяющую понять как работать с данным средством тестирования.
Напоследок хочу пригласить вас на бесплатный урок, где поговорим о профессии автоматизатора тестирования на Python. Обсудим необходимые навыки которые нужны для работы и требования к кандидатам при собеседованиях. Расскажем про современные технологии автоматизации тестирования и преимущества использования автотестов. Также рассмотрим перспективы профессии на данный момент.
gigimon
Сколько раз не подходил к tavern и подобным системам, когда тест описывается в yml, то каждый раз не понимаю зачем это нужно и как с этим жить при сложных и больших тестах.
Если есть openapi спецификация, то парсер для базовых кейсов пишется на раз два. Для сложных же кейсов, всегда необходима какая-то подготовка данных, которую описать в yml не получится.