🏠 | 💻 IT | 🔨Тестирование ПО |

Тестирование API

Бесплатный учебник по тестированию API для новичков здесь

Список моих открытых API здесь

Содержание статьи
Введение: Что такое API
Что такое Endpoint
Спецификация
HTTP Методы
Примеры API
Тестирование API без документации
Обучение тестированию API
Инструменты для тестирования API: Python, SOAP UI …

Введение: Что такое API

В широком смысле слова API (Application Programming Interface) это метод который приложение предоставляет внешним пользователям для коммуникации с ним. Обычно через Интернет.

Это может быть взаимодействие с сервером приложения на смартфоне, между компьютерами или другими устройствами.

API применяются там где невозможна или нежелательна непосредственная интеграция с исходным приложением, то есть практически везде.

Крупные интернет-компании обычно предоставляют (платно или бесплатно) доступ к API своих сервисов. Например здесь Вы можете познакомиться со списком API от Google.

Одним из самых распространённых способов тестирования API является написание скриптов на Python .

Для чего обычно применяется API

Сейчас будет несколько абстрактных примеров просто для понимания сути.

Конкретные примеры работы с API я разбираю в учебнике

Пример №1:

Если Вы хотите разместить на своём сайте яндекс-карты Вам не нужно устанавливать программы от Яндекса, достаточно послать несколько запросов и Яндекс передаст необходимую информацию.

Это возможно потому, что программисты Яндекса разработали специальный набор запросов - API которые можно присылать к ним на сервер чтобы получить в ответ карту.

Пример №2:

Предположим, что Вы создали сайт vk2.com. Вы хотите, чтобы вебмастера могли добавить на свои сайты возможность комментировать записи используя учётную запись vk2, но раскрывать или раздавать свой код не хотите.

Чтобы обойти эту проблему Вы выкладываете в публичном доступе правила, по которым вебмастера могут обращаться к vk2, чтобы получить комментарии.

Формат этих сообщений это обычно либо JSON либо XML. О них мы поговорим позже.

Повторим для закрепления сути: Смысл в том, что сайт написанный на любом языке, поддерживающем HTTP запросы, не посылает на сервер никаких PHP/C/Python команд, а общается ним с помощью запросов, описанных в API.

Endpoint

Адрес, на который посылаются сообщения называется Endpoint. Обычно это URL (например, название сайта) и порт. Если я хочу создать веб сервис на порту 8080 Endpoint будет выглядеть так:

http://andreyolegovich.ru:8080

Если моему Web сервису нужно будет отвечать на различные сообщения я создам сразу несколько URL (interfaces) по которым к сервису можно будет обратиться. Например

https://andreyolegovich.ru:8080 /resource1/status
https://andreyolegovich.ru:8080 /resource1/getserviceInfo
https://andreyolegovich.ru:8080 /resource1/putID
http://andreyolegovich.ru:8080 /resource1/eventslist
https://andreyolegovich.ru:8080 /resource2/putID

Как видите у моих эндпойнтов (Enpoints) различные окончания. Такое окончание в Endpoint называются Resource, а начало Base URL.

Такое определение Endpoint и Resource используется, например, в SOAP UI для RESTful интерфейсов

https://andreyolegovich.ru:8080 - это Base URL

/resource1/status - это Resource

Endpoint = Base URL + Resource

Понятие Endpoint может использоваться в более широком смысле. Можно сказать, что какой-то определённый роутер или компьютер является Endpoint. Обычно это понятно из контекста.

Также следует обратить внимание на то, что понятие Endpoint выходит за рамки RESTful и может использовать как в SOAP так и в других протоколах.

Термин Resource также связан с RESTful, но в более широком смысле может означать что-то другое.

Спецификация

После того все эти интерфейсы созданы, их необходимо описать. Нужен документ из которого будет понятно

Этот документ должен быть доступен программистам с обеих сторон, иначе они просто не смогут договориться и реализовать работающий Web сервис.

HTTP методы

Вернёмся к первому пункту списка, а именно к тому, что такое методы.

В протоколе HTTP предусмотрено несколько способов отправить запрос на один и тот же Endpoint. Они называются CONNECT, DELET, GET, HEAD, OPTIONS, PATCH, POST, PUT, TRACE про их свойства можно почитать здесь.

Когда мы знаем какие методы с какими Enpoint можно использовать составить запросы не составит труда. Например:

GET http://andreyolegovich.ru:8080 /resource1/status
GET http://andreyolegovich.ru:8080 /resource1/getserviceInfo
PUT http://andreyolegovich.ru:8080 /resource1/putID
GET http://andreyolegovich.ru:8080 /resource1/eventslist
POST http://andreyolegovich.ru:8080 /resource1/eventslist
PUT http://andreyolegovich.ru:8080 /resource2/putID
...

Итак, простейший запрос состоит из метода и Enpoint

Request = Method + Endpoint

Пример API

Простейший пример API:

Допустим я создал на сайте программу которая достает из базы данных количество велосипедистов в городе.

Напоминаю, что это абстрактный пример, посылать на andreyolegovich.ru ничего не нужно.

Если хотите попрактиковаться - я специально для этого сделал сайт answerit.ru и объясняю его API в учебнике

Взаимодействие с API будет выглядеть так: Вы посылаете

POST http://andreyolegovich.ru:8080 /bicylists

Где в теле запроса будет указан город

{ "city": "Helsinki" }

И мой сайт будет возвращать Вам число велосипедистов. В данном случае - в Хельсинки

Если хотите немного потренироваться - оцените мои практические уроки по тестированию API - «Уроки тестирование API»

Это очень простые уроки для самых начинающих. Буду рад любым отзывам и предложениям в комментариях.

Calculator. Http methods. Protocols/rfc2616.

Тестирование API без документации

Если Вам по какой-то причине предстоит проделать эту неблагодарную работу, определетесь, насколько всё плохо. Какая у Вас есть информация об объекте тестирования.

Известно ли какие порты для Вас открыты? Знаете ли Вы нужные endpoints?

Сканирование портов

Если дело совсем труба - просканируйте порты, например, с помощью netcat. Открытые порты сохраните в файл openports.txt

nc -z -v askqa.ru 1-10000 2>&1 | grep succeeded > openports.txt

Эта операция займёт довольно много времени. Можете почитать советы по работе с Nmap и Netcat , например, следующие:

Сканирование портов с помощью Netcat
Как записать вывод Netcat в файл

Перебор запросов

Если Вам известен нужный порт и соответствующий endopoint переберите все возможные HTTP методы. Начните с наиболее очевидных POST, PUT , GET. Для ускорения процесса напишите скрипт на Python .

В худшем случае, когда ни порт ни endpoints неизвестны Вам, скорее всего придётся перебирать все открытые порты и генерировать endpoints, которые подходят по смыслу.

Разработчики обычно не особо заморачиваются и закладывают минимально-необходиму информацию. Так что включите воображение и попробуйте придумать endpoints опираясь на бизнес логику и принятые в Вашей компании стандарты.

Если ни endpoints ни бизнес логика Вам неизвестны, то у меня есть подозрение, что Вы тестируете API с не самыми хорошими намерениями.

Инструменты для тестирования

Существует множество инструментов для тестирования. Здесь Вы можете познакомиться с одними из самых популярных: Python и SOAP UI.

Web проекты часто тестируются с применением Selenium Webdriver если Вам интересно - посмотрите статью Python + Selenium

Статьи о Тестировании
Учебник по тестированию API
Тестирование с помощью Python
Selenium
Selenium + Java
Selenium + Python
SOAP UI
JMeter
JUnit
Wireshark
Команды Bash для тестировщика
Clumsy 0.2
Pivotal Tracker
Интеграционное тестирование
Где учиться на тестировщика

Если остались вопросы - смело задавайте их в комментариях.

Поиск по сайту
Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: