Что такое API
API (Application Programming Interface) - набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах (Wikipedia).
Своими словами, API предоставляет нам возможность использовать чужие наработки в своих целях. Впервые я столкнулся с API на примере Windows API. Это набор функций, которые может использовать любое приложение, запущенное на данной ОС. К примеру, оно может использовать стандартные функции для отрисовки интерфейса.
Современные API часто принимают форму веб-сервисов, которые предоставляют пользователям (как людям, так и другим веб-сервисам) какую-то информацию. Обычно процедура обмена информацией и формат передачи данных структурированы, чтобы обе стороны знали, как взаимодействовать между собой.
На сайте https://dev.hh.ru/ (а точнее, https://github.com/hhru/api/blob/master/docs/general.md) вы можете найти описание того, как клиенты и сервисы HeadHunter API взаимодействуют между собой. Например, цитата с сайта:
- Всё API работает по протоколу HTTPS.
- Авторизация осуществляется по протоколу OAuth2.
- Все данные доступны только в формате JSON.
- Базовый URL —
https://api.hh.ru/
- Даты форматируются в соответствии с
ISO 8601:
YYYY-MM-DDThh:mm:ss±hhmm
Форматы передачи данных
Существует множество форматов данных, с помощью которых пользователи взаимодействуют с API. Например, широко известный XML. Или JSON - легковесный и несложный формат, который выглядит как:
{ "id": "0001", "type": "donut", "name": "Cake", "image": { "url": "images/0001.jpg", "width": 200, "height": 200 }
}
По ссылкам ниже вы можете посмотреть ответы, приходящие от MediaWiki API, в разных форматах:
JSON: https://en.wikipedia.org/w/api.php?action=query&titles=Albert%20Einstein&prop=info&format=jsonfm
XML: https://en.wikipedia.org/w/api.php?action=query&titles=Albert%20Einstein&prop=info&format=xmlfm
PHP: https://en.wikipedia.org/w/api.php?action=query&titles=Albert%20Einstein&prop=info&format=php (осторожно, произойдет скачивание файла)
HTTP глаголы
Обычно при обращении к веб API используются запросы HTTP. Поэтому нужно хотя бы коротко сказать о стандартных методах, которые могут содержаться в HTTP запросе. Эти методы также называют HTTP глаголами:
- GET. Наверное, самый популярный тип запроса. Используется для получения или чтения данных.
- PUT. Обычно используется для обновления ресурса.
- POST. Обычно используется для создания нового ресурса.
- DELETE. Удаляет данные.
- И другие
GET http://www.example.com/customers/12345
Если мы хотим обновить ресурс - мы можем послать PUT-запрос:
PUT http://www.example.com/customers/12345/orders/98765
Обычные GET запросы способен посылать веб-браузер. Для посылки других типов запросов могут потребоваться скриптовые языки или специальные инструменты (об этом будет ниже).
О HTTP методах можно подробнее почитать на Wiki.
HTTP коды ответов
Сервер может посылать разные коды в ответ на запросы пользователей. Это могут быть коды ошибок или просто коды, информирующие пользователей о состоянии сервера. Подробное описание можно найти, опять же, на вики.
Наиболее известные коды - 4xx (проблемы на стороне клиента) и 5xx (проблемы на стороне сервера). О том, какие коды возвращать в той или иной ситуации, решают разработчики самих API. Например, API сайта Одноклассники возвращает коды, описание которых можно найти на странице https://apiok.ru/wiki/pages/viewpage.action?pageId=77824003.
Кроме того, советую послушать песню Реквест-респонс - просто и понятно о кодах, возвращаемых в HTTP запросах (осторожно, репчик :)).
REST API
REST API - это идеология построения API, которая расшифровывается как Representational State Transfer API. Она основывается на следующих принципах, сформулированных ее создателем, Роем Филдингом:
- Клиент-серверная архитектура
- Stateless сервер
- Кешируемость
- Многослойная структура
- Единый интерфейс
- Код по требованию
Аутентификация
Обычно
для использования API нужен специальный ключ, с помощью которого сервер
узнает пользователя. В открытых API ключ может отсутствовать или
предоставляться по запросу (например, после регистрации на
сайте).
Для интеграции сервисов друг с другом широко используется протокол
аутентификации OAuth (подробнее о нём можно почитать в статье
http://m.geektimes.ru/post/ 77648/).
Например, он может использоваться онлайн игрой, которая импортирует список друзей из Facebook.
Инструменты для работы с API
Обычные GET запросы можно посылать при помощи браузера. Но существует
множество специальных инструментов, которые предназначены для разработки и
тестирования API. Они предоставляют возможность не только отправлять
различные типы запросов, но и сохранять запросы, показывать результаты в различных форматах, выступать в роли proxy сервера. И многое многое другое.
Среди таких инструментов:
- Postman. Расширение для Google Chrome, которое в бесплатной версии позволяет посылать запросы, записывать их, показывать историю. Удобно и понятно.
- jMeter. Инструмент, получивший известность прежде всего благодаря нагрузочному тестированию, которое можно проводить с его помощью. Но это лишь одно из множества его применений.
- Fiddler. Позволяет просматривать посылаемые HTTP запросы. И много чего еще.
- SoapUI. Мощный продукт для разработки и тестирования веб приложений. Сам я его не использовал, но слышал много отзывов - и хороших, и плохих.
- Runscope. Подробнее об этом инструменте - в статье на QAHelp и Хабрахабре.
- Advanced REST Client. Еще одно расширение для Chrome для работы с API (конструкция запросов, их показ в удобном виде и другое).
Тестирование API
А теперь - очень коротко о том, как тестировать API.
Конечно, тут есть своя специфика, но мы можем использовать такие общепринятые техники, как:
Конечно, тут есть своя специфика, но мы можем использовать такие общепринятые техники, как:
- Анализ граничных значений. В API запросах в явном виде могут передаваться значения параметров. Это отличный повод выделить границы входных и выходных значений и проверить их.
- Разбиение на классы эквивалентности. Даже у небольшого API есть множество вариантов использования и множество комбинаций входных и выходных переменных. Поэтому мы можем лишний раз использовать наши навыки выделения эквивалентных классов.
Как мне кажется, при тестировании нужно
учитывать, что API создаются во многом для интеграции сервисов. И работают с ними часто не люди, а другие программные системы. Поэтому нужно
оценивать API с позиции удобства его использования другими продуктами, с позиции легкой интеграции с ним. Уважающий себя API должен также иметь понятную и подробную документацию.
Можно сделать вывод, что все виды тестирования, к которым мы привыкли - функциональное тестирование, нагрузочное, тестирование безопасности, юзабилити, тестирование документации - не чужды при тестировании API. В принципе, это не удивительно, потому что API является полноценным самостоятельным продуктом.
Можно сделать вывод, что все виды тестирования, к которым мы привыкли - функциональное тестирование, нагрузочное, тестирование безопасности, юзабилити, тестирование документации - не чужды при тестировании API. В принципе, это не удивительно, потому что API является полноценным самостоятельным продуктом.
Дополнительные материалы
- (английский) http://blog.eviltester.com/2015/01/some-api-testing-basic-introductory.html?m=1
- (английский) http://testhuddle.com/forums/topic/api-testing-tools-and-tips/
- http://sqadays.com/ru/talk/28689 - отличный доклад о том, как API может помочь в улучшении testability приложения
- http://www.programmableweb.com/ - огромный сборник открытых API, на которых можно потренироваться
спасибо Вам за статью и источники))
ОтветитьУдалитьприсоединяюсь) спасибо за ссылки, весьма доступно
ОтветитьУдалитьСпасибо большое! То что искалю
ОтветитьУдалитьСпасибо за статью, хорошо обрисовывает общую картину
ОтветитьУдалитьПожалуйста! Захвалили!
ОтветитьУдалитьГде тут смайлик "звёздная болезнь"? :)
Довольно таки доступно и сжато, спасибо!
ОтветитьУдалитьКортко, доступно и по делу. Люблю такие статьи:)
ОтветитьУдалитьСпасибо большое!
ОтветитьУдалитьСпасибо за статью, делал лекцию для отдела, вроде всё из статьи сам написал, а вот про граничные значения и вообще про покрытие отдельных методов что-то забыл, статья напомнила как раз под конец.
ОтветитьУдалитьспасибо вам! Очень рад, что статья вам пригодилась
УдалитьБольшое спасибо за статью, и отдельное - за ссылки с примерами и определениями, очень удобно читать.
ОтветитьУдалитьОтлично описано. Без воды без примеси. В закладки однозначно!
ОтветитьУдалитьКак вводная статья - очень хорошо. Но почему вы описываете исключительно тестирование методов API?
ОтветитьУдалитьЯ бы дополнил материал информацией о необходимости проверок записей в БД, типы данных в API и в БД, соотнесение параметров метода API, с параметрами, передющимися с UI, если таковой есть
Привет, Максим! Вы правы, это тоже важно и тоже заслуживает упоминания. Но статья была написана не как полноценное руководство по тестированию API, а как вступление для тех, кто подобным тестированием не занимался. Если вы знаете ресурсы, где упомянутые вами вопросы освещаются - напишите пожалуйста ссылки. Думаю они будут полезными. Я вставлю их в список материалов.
УдалитьЧестно?-здорово! Как я устал от формализованных понятий википедии. А здесь - доступная подача, своевременные примеры. Желаю создавать и дальше статьи. У Вас это получается отлично. Большое спасибо.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьСпасибо за статью.
ОтветитьУдалитьОчень жаль, что не нашла эту статью раньше, все связно и предельно понятно, спасибо автору огромное.
ОтветитьУдалитьСпасибо !!!!Большое спасибо!!!
ОтветитьУдалитьнадеялся найти описание простых запросов с примером. к сожелению ничего нового не узнал
ОтветитьУдалитьСпасибо за статью и ссылки
ОтветитьУдалитьСпасибо вам!
ОтветитьУдалитьок
ОтветитьУдалить